diff options
author | Dan Gohman <gohman@apple.com> | 2009-04-23 23:13:24 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-04-23 23:13:24 +0000 |
commit | ad62f53795ac3da0353afba7e83464679c91ce5c (patch) | |
tree | 2e585ec0f30decb918102698245adb013b931163 | |
parent | 5e5558bc66d593605ece81502bc310b7cf9e87f0 (diff) | |
download | external_llvm-ad62f53795ac3da0353afba7e83464679c91ce5c.zip external_llvm-ad62f53795ac3da0353afba7e83464679c91ce5c.tar.gz external_llvm-ad62f53795ac3da0353afba7e83464679c91ce5c.tar.bz2 |
Factor out a bit of code that appears in several places into a
utility function.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@69937 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp | 22 | ||||
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAGBuild.h | 1 | ||||
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 7 |
3 files changed, 16 insertions, 14 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp index fd5fcbb..3e6da24 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp @@ -1020,6 +1020,17 @@ void SelectionDAGLowering::visitRet(ReturnInst &I) { &NewValues[0], NewValues.size())); } +/// CopyToExportRegsIfNeeded - If the given value has virtual registers +/// created for it, emit nodes to copy the value into the virtual +/// registers. +void SelectionDAGLowering::CopyToExportRegsIfNeeded(Value *V) { + if (!V->use_empty()) { + DenseMap<const Value *, unsigned>::iterator VMI = FuncInfo.ValueMap.find(V); + if (VMI != FuncInfo.ValueMap.end()) + CopyValueToVirtualRegister(V, VMI->second); + } +} + /// ExportFromCurrentBlock - If this condition isn't known to be exported from /// the current basic block, add it to ValueMap now so that we'll get a /// CopyTo/FromReg. @@ -1572,11 +1583,7 @@ void SelectionDAGLowering::visitInvoke(InvokeInst &I) { // If the value of the invoke is used outside of its defining block, make it // available as a virtual register. - if (!I.use_empty()) { - DenseMap<const Value*, unsigned>::iterator VMI = FuncInfo.ValueMap.find(&I); - if (VMI != FuncInfo.ValueMap.end()) - CopyValueToVirtualRegister(&I, VMI->second); - } + CopyToExportRegsIfNeeded(&I); // Update successor info CurMBB->addSuccessor(Return); @@ -5924,10 +5931,7 @@ LowerArguments(BasicBlock *LLVMBB) { SDL->getCurDebugLoc())); // If this argument is live outside of the entry block, insert a copy from // whereever we got it to the vreg that other BB's will reference it as. - DenseMap<const Value*, unsigned>::iterator VMI=FuncInfo->ValueMap.find(AI); - if (VMI != FuncInfo->ValueMap.end()) { - SDL->CopyValueToVirtualRegister(AI, VMI->second); - } + SDL->CopyToExportRegsIfNeeded(AI); } a += NumValues; } diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuild.h b/lib/CodeGen/SelectionDAG/SelectionDAGBuild.h index 7a76c5f..ecac1ae 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGBuild.h +++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuild.h @@ -422,6 +422,7 @@ public: MachineBasicBlock *CurBB); bool ShouldEmitAsBranches(const std::vector<CaseBlock> &Cases); bool isExportableFromCurrentBlock(Value *V, const BasicBlock *FromBB); + void CopyToExportRegsIfNeeded(Value *V); void ExportFromCurrentBlock(Value *V); void LowerCallTo(CallSite CS, SDValue Callee, bool IsTailCall, MachineBasicBlock *LandingPad = NULL); diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 49ff4f2..2953472 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -476,11 +476,8 @@ void SelectionDAGISel::SelectBasicBlock(BasicBlock *LLVMBB, // Ensure that all instructions which are used outside of their defining // blocks are available as virtual registers. Invoke is handled elsewhere. for (BasicBlock::iterator I = Begin; I != End; ++I) - if (!I->use_empty() && !isa<PHINode>(I) && !isa<InvokeInst>(I)) { - DenseMap<const Value*,unsigned>::iterator VMI =FuncInfo->ValueMap.find(I); - if (VMI != FuncInfo->ValueMap.end()) - SDL->CopyValueToVirtualRegister(I, VMI->second); - } + if (!isa<PHINode>(I) && !isa<InvokeInst>(I)) + SDL->CopyToExportRegsIfNeeded(I); // Handle PHI nodes in successor blocks. if (End == LLVMBB->end()) { |