diff options
author | Hans Wennborg <hans@hanshq.net> | 2014-09-08 20:24:10 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2014-09-08 20:24:10 +0000 |
commit | 18f0a986c129c0d0cd4c038547a6bbb81a4803b7 (patch) | |
tree | 05ad9fa91a75a24cdec3f15b80acd0894552a049 /llvm/lib/CodeGen | |
parent | 90452df7b159e67a56e3121eca5e64244f84556d (diff) | |
download | bcm5719-llvm-18f0a986c129c0d0cd4c038547a6bbb81a4803b7.tar.gz bcm5719-llvm-18f0a986c129c0d0cd4c038547a6bbb81a4803b7.zip |
Fast-ISel: Remove dead code after falling back from selecting call instructions (PR20863)
Previously, fast-isel would not clean up after failing to select a call
instruction, because it would have called flushLocalValueMap() which moves
the insertion point, making SavedInsertPt in selectInstruction() invalid.
Fixing this by making SavedInsertPt a member variable, and having
flushLocalValueMap() update it.
This removes some redundant code at -O0, and more importantly fixes PR20863.
Differential Revision: http://reviews.llvm.org/D5249
llvm-svn: 217401
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/FastISel.cpp | 25 |
1 files changed, 10 insertions, 15 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp index 0311140a299..40f387f3ba3 100644 --- a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp @@ -127,6 +127,7 @@ void FastISel::flushLocalValueMap() { LocalValueMap.clear(); LastLocalValue = EmitStartPt; recomputeInsertPt(); + SavedInsertPt = FuncInfo.InsertPt; } bool FastISel::hasTrivialKill(const Value *V) { @@ -1296,7 +1297,7 @@ bool FastISel::selectInstruction(const Instruction *I) { DbgLoc = I->getDebugLoc(); - MachineBasicBlock::iterator SavedInsertPt = FuncInfo.InsertPt; + SavedInsertPt = FuncInfo.InsertPt; if (const auto *Call = dyn_cast<CallInst>(I)) { const Function *F = Call->getCalledFunction(); @@ -1322,13 +1323,10 @@ bool FastISel::selectInstruction(const Instruction *I) { DbgLoc = DebugLoc(); return true; } - // Remove dead code. However, ignore call instructions since we've flushed - // the local value map and recomputed the insert point. - if (!isa<CallInst>(I)) { - recomputeInsertPt(); - if (SavedInsertPt != FuncInfo.InsertPt) - removeDeadCode(FuncInfo.InsertPt, SavedInsertPt); - } + // Remove dead code. + recomputeInsertPt(); + if (SavedInsertPt != FuncInfo.InsertPt) + removeDeadCode(FuncInfo.InsertPt, SavedInsertPt); SavedInsertPt = FuncInfo.InsertPt; } // Next, try calling the target to attempt to handle the instruction. @@ -1337,13 +1335,10 @@ bool FastISel::selectInstruction(const Instruction *I) { DbgLoc = DebugLoc(); return true; } - // Remove dead code. However, ignore call instructions since we've flushed - // the local value map and recomputed the insert point. - if (!isa<CallInst>(I)) { - recomputeInsertPt(); - if (SavedInsertPt != FuncInfo.InsertPt) - removeDeadCode(FuncInfo.InsertPt, SavedInsertPt); - } + // Remove dead code. + recomputeInsertPt(); + if (SavedInsertPt != FuncInfo.InsertPt) + removeDeadCode(FuncInfo.InsertPt, SavedInsertPt); DbgLoc = DebugLoc(); // Undo phi node updates, because they will be added again by SelectionDAG. |