Index: src/IceConverter.cpp |
diff --git a/src/IceConverter.cpp b/src/IceConverter.cpp |
index e8ec56d18112f49120c12f10a94a10d321acf8fc..fc4f6ef18343046b5568617461037b251f93e657 100644 |
--- a/src/IceConverter.cpp |
+++ b/src/IceConverter.cpp |
@@ -79,15 +79,14 @@ public: |
LLVM2ICEFunctionConverter(Ice::Converter &Converter) |
: LLVM2ICEConverter(Converter), Func(nullptr) {} |
- // Caller is expected to delete the returned Ice::Cfg object. |
- Ice::Cfg *convertFunction(const Function *F) { |
+ void convertFunction(const Function *F) { |
VarMap.clear(); |
NodeMap.clear(); |
Func = Ice::Cfg::create(Ctx); |
Func->setFunctionName(F->getName()); |
Func->setReturnType(convertToIceType(F->getReturnType())); |
Func->setInternal(F->hasInternalLinkage()); |
- Ice::TimerMarker T(Ice::TimerStack::TT_llvmConvert, Func); |
+ Ice::TimerMarker T(Ice::TimerStack::TT_llvmConvert, Func.get()); |
// The initial definition/use of each arg is the entry node. |
for (auto ArgI = F->arg_begin(), ArgE = F->arg_end(); ArgI != ArgE; |
@@ -105,10 +104,10 @@ public: |
convertBasicBlock(&BBI); |
Func->setEntryNode(mapBasicBlockToNode(&F->getEntryBlock())); |
Func->computePredecessors(); |
- |
- return Func; |
} |
+ std::unique_ptr<Ice::Cfg> release() { return std::move(Func); } |
JF
2015/02/02 20:59:19
That's nicer. Could you leave a TODO to fix?
Jim Stichnoth
2015/02/03 00:48:51
Done.
|
+ |
// convertConstant() does not use Func or require it to be a valid |
// Ice::Cfg pointer. As such, it's suitable for e.g. constructing |
// global initializers. |
@@ -147,7 +146,7 @@ private: |
if (VarMap.find(V) == VarMap.end()) { |
VarMap[V] = Func->makeVariable(IceTy); |
if (ALLOW_DUMP) |
- VarMap[V]->setName(Func, V->getName()); |
+ VarMap[V]->setName(Func.get(), V->getName()); |
} |
return VarMap[V]; |
} |
@@ -304,13 +303,13 @@ private: |
Ice::Inst *convertLoadInstruction(const LoadInst *Inst) { |
Ice::Operand *Src = convertOperand(Inst, 0); |
Ice::Variable *Dest = mapValueToIceVar(Inst); |
- return Ice::InstLoad::create(Func, Dest, Src); |
+ return Ice::InstLoad::create(Func.get(), Dest, Src); |
} |
Ice::Inst *convertStoreInstruction(const StoreInst *Inst) { |
Ice::Operand *Addr = convertOperand(Inst, 1); |
Ice::Operand *Val = convertOperand(Inst, 0); |
- return Ice::InstStore::create(Func, Val, Addr); |
+ return Ice::InstStore::create(Func.get(), Val, Addr); |
} |
Ice::Inst *convertArithInstruction(const Instruction *Inst, |
@@ -319,13 +318,13 @@ private: |
Ice::Operand *Src0 = convertOperand(Inst, 0); |
Ice::Operand *Src1 = convertOperand(Inst, 1); |
Ice::Variable *Dest = mapValueToIceVar(BinOp); |
- return Ice::InstArithmetic::create(Func, Opcode, Dest, Src0, Src1); |
+ return Ice::InstArithmetic::create(Func.get(), Opcode, Dest, Src0, Src1); |
} |
Ice::Inst *convertPHINodeInstruction(const PHINode *Inst) { |
unsigned NumValues = Inst->getNumIncomingValues(); |
Ice::InstPhi *IcePhi = |
- Ice::InstPhi::create(Func, NumValues, mapValueToIceVar(Inst)); |
+ Ice::InstPhi::create(Func.get(), NumValues, mapValueToIceVar(Inst)); |
for (unsigned N = 0, E = NumValues; N != E; ++N) { |
IcePhi->addArgument(convertOperand(Inst, N), |
mapBasicBlockToNode(Inst->getIncomingBlock(N))); |
@@ -340,31 +339,31 @@ private: |
BasicBlock *BBElse = Inst->getSuccessor(1); |
Ice::CfgNode *NodeThen = mapBasicBlockToNode(BBThen); |
Ice::CfgNode *NodeElse = mapBasicBlockToNode(BBElse); |
- return Ice::InstBr::create(Func, Src, NodeThen, NodeElse); |
+ return Ice::InstBr::create(Func.get(), Src, NodeThen, NodeElse); |
} else { |
BasicBlock *BBSucc = Inst->getSuccessor(0); |
- return Ice::InstBr::create(Func, mapBasicBlockToNode(BBSucc)); |
+ return Ice::InstBr::create(Func.get(), mapBasicBlockToNode(BBSucc)); |
} |
} |
Ice::Inst *convertIntToPtrInstruction(const IntToPtrInst *Inst) { |
Ice::Operand *Src = convertOperand(Inst, 0); |
Ice::Variable *Dest = mapValueToIceVar(Inst, Ice::getPointerType()); |
- return Ice::InstAssign::create(Func, Dest, Src); |
+ return Ice::InstAssign::create(Func.get(), Dest, Src); |
} |
Ice::Inst *convertPtrToIntInstruction(const PtrToIntInst *Inst) { |
Ice::Operand *Src = convertOperand(Inst, 0); |
Ice::Variable *Dest = mapValueToIceVar(Inst); |
- return Ice::InstAssign::create(Func, Dest, Src); |
+ return Ice::InstAssign::create(Func.get(), Dest, Src); |
} |
Ice::Inst *convertRetInstruction(const ReturnInst *Inst) { |
Ice::Operand *RetOperand = convertOperand(Inst, 0); |
if (RetOperand) { |
- return Ice::InstRet::create(Func, RetOperand); |
+ return Ice::InstRet::create(Func.get(), RetOperand); |
} else { |
- return Ice::InstRet::create(Func); |
+ return Ice::InstRet::create(Func.get()); |
} |
} |
@@ -372,7 +371,7 @@ private: |
Ice::InstCast::OpKind CastKind) { |
Ice::Operand *Src = convertOperand(Inst, 0); |
Ice::Variable *Dest = mapValueToIceVar(Inst); |
- return Ice::InstCast::create(Func, CastKind, Dest, Src); |
+ return Ice::InstCast::create(Func.get(), CastKind, Dest, Src); |
} |
Ice::Inst *convertICmpInstruction(const ICmpInst *Inst) { |
@@ -416,7 +415,7 @@ private: |
break; |
} |
- return Ice::InstIcmp::create(Func, Cond, Dest, Src0, Src1); |
+ return Ice::InstIcmp::create(Func.get(), Cond, Dest, Src0, Src1); |
} |
Ice::Inst *convertFCmpInstruction(const FCmpInst *Inst) { |
@@ -480,14 +479,14 @@ private: |
break; |
} |
- return Ice::InstFcmp::create(Func, Cond, Dest, Src0, Src1); |
+ return Ice::InstFcmp::create(Func.get(), Cond, Dest, Src0, Src1); |
} |
Ice::Inst *convertExtractElementInstruction(const ExtractElementInst *Inst) { |
Ice::Variable *Dest = mapValueToIceVar(Inst); |
Ice::Operand *Source1 = convertValue(Inst->getOperand(0)); |
Ice::Operand *Source2 = convertValue(Inst->getOperand(1)); |
- return Ice::InstExtractElement::create(Func, Dest, Source1, Source2); |
+ return Ice::InstExtractElement::create(Func.get(), Dest, Source1, Source2); |
} |
Ice::Inst *convertInsertElementInstruction(const InsertElementInst *Inst) { |
@@ -495,7 +494,7 @@ private: |
Ice::Operand *Source1 = convertValue(Inst->getOperand(0)); |
Ice::Operand *Source2 = convertValue(Inst->getOperand(1)); |
Ice::Operand *Source3 = convertValue(Inst->getOperand(2)); |
- return Ice::InstInsertElement::create(Func, Dest, Source1, Source2, |
+ return Ice::InstInsertElement::create(Func.get(), Dest, Source1, Source2, |
Source3); |
} |
@@ -504,7 +503,7 @@ private: |
Ice::Operand *Cond = convertValue(Inst->getCondition()); |
Ice::Operand *Source1 = convertValue(Inst->getTrueValue()); |
Ice::Operand *Source2 = convertValue(Inst->getFalseValue()); |
- return Ice::InstSelect::create(Func, Dest, Cond, Source1, Source2); |
+ return Ice::InstSelect::create(Func.get(), Dest, Cond, Source1, Source2); |
} |
Ice::Inst *convertSwitchInstruction(const SwitchInst *Inst) { |
@@ -512,7 +511,7 @@ private: |
Ice::CfgNode *LabelDefault = mapBasicBlockToNode(Inst->getDefaultDest()); |
unsigned NumCases = Inst->getNumCases(); |
Ice::InstSwitch *Switch = |
- Ice::InstSwitch::create(Func, NumCases, Source, LabelDefault); |
+ Ice::InstSwitch::create(Func.get(), NumCases, Source, LabelDefault); |
unsigned CurrentCase = 0; |
for (SwitchInst::ConstCaseIt I = Inst->case_begin(), E = Inst->case_end(); |
I != E; ++I, ++CurrentCase) { |
@@ -544,14 +543,14 @@ private: |
report_fatal_error(std::string("Invalid PNaCl intrinsic call: ") + |
LLVMObjectAsString(Inst)); |
} |
- NewInst = Ice::InstIntrinsicCall::create(Func, NumArgs, Dest, |
+ NewInst = Ice::InstIntrinsicCall::create(Func.get(), NumArgs, Dest, |
CallTarget, Info->Info); |
} |
} |
// Not an intrinsic call. |
if (NewInst == nullptr) { |
- NewInst = Ice::InstCall::create(Func, NumArgs, Dest, CallTarget, |
+ NewInst = Ice::InstCall::create(Func.get(), NumArgs, Dest, CallTarget, |
Inst->isTailCall()); |
} |
for (unsigned i = 0; i < NumArgs; ++i) { |
@@ -569,11 +568,11 @@ private: |
uint32_t Align = Inst->getAlignment(); |
Ice::Variable *Dest = mapValueToIceVar(Inst, Ice::getPointerType()); |
- return Ice::InstAlloca::create(Func, ByteCount, Align, Dest); |
+ return Ice::InstAlloca::create(Func.get(), ByteCount, Align, Dest); |
} |
Ice::Inst *convertUnreachableInstruction(const UnreachableInst * /*Inst*/) { |
- return Ice::InstUnreachable::create(Func); |
+ return Ice::InstUnreachable::create(Func.get()); |
} |
Ice::CfgNode *convertBasicBlock(const BasicBlock *BB) { |
@@ -621,7 +620,7 @@ private: |
private: |
// Data |
- Ice::Cfg *Func; |
+ std::unique_ptr<Ice::Cfg> Func; |
std::map<const Value *, Ice::Variable *> VarMap; |
std::map<const BasicBlock *, Ice::CfgNode *> NodeMap; |
}; |
@@ -878,15 +877,16 @@ void Converter::convertFunctions() { |
continue; |
TimerIdT TimerID = 0; |
- if (ALLOW_DUMP && Ctx->getFlags().TimeEachFunction) { |
+ const bool TimeThisFunction = |
+ ALLOW_DUMP && Ctx->getFlags().TimeEachFunction; |
+ if (TimeThisFunction) { |
TimerID = Ctx->getTimerID(StackID, I.getName()); |
Ctx->pushTimer(TimerID, StackID); |
} |
LLVM2ICEFunctionConverter FunctionConverter(*this); |
- |
- Cfg *Fcn = FunctionConverter.convertFunction(&I); |
- translateFcn(Fcn); |
- if (ALLOW_DUMP && Ctx->getFlags().TimeEachFunction) |
+ FunctionConverter.convertFunction(&I); |
+ translateFcn(FunctionConverter.release()); |
+ if (TimeThisFunction) |
Ctx->popTimer(TimerID, StackID); |
} |
} |