From 9d13b714f59c67cd8a6249017343d510295f39dc Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Thu, 23 Apr 2009 23:13:24 +0000 Subject: [PATCH] Factor out a bit of code that appears in several places into a utility function. llvm-svn: 69937 --- .../SelectionDAG/SelectionDAGBuild.cpp | 22 +++++++++++-------- lib/CodeGen/SelectionDAG/SelectionDAGBuild.h | 1 + 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 fd5fcbb1aad..3e6da24a4a1 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::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::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::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 7a76c5f83d2..ecac1ae0a2f 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 &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 49ff4f2a5d5..2953472da96 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(I) && !isa(I)) { - DenseMap::iterator VMI =FuncInfo->ValueMap.find(I); - if (VMI != FuncInfo->ValueMap.end()) - SDL->CopyValueToVirtualRegister(I, VMI->second); - } + if (!isa(I) && !isa(I)) + SDL->CopyToExportRegsIfNeeded(I); // Handle PHI nodes in successor blocks. if (End == LLVMBB->end()) {