[llvm-commits] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
Chris Lattner
lattner at cs.uiuc.edu
Fri Jan 13 13:28:21 PST 2006
Changes in directory llvm/lib/Transforms/Scalar:
InstructionCombining.cpp updated: 1.412 -> 1.413
---
Log message:
Do a simple instcombine xforms to delete llvm.stackrestore cases.
---
Diffs of the changes: (+33 -0)
InstructionCombining.cpp | 33 +++++++++++++++++++++++++++++++++
1 files changed, 33 insertions(+)
Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.412 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.413
--- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.412 Fri Jan 13 14:11:04 2006
+++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp Fri Jan 13 15:28:09 2006
@@ -4671,6 +4671,39 @@
SPI->replaceAllUsesWith(PrevSPI);
return EraseInstFromFunction(CI);
}
+ } else {
+ switch (II->getIntrinsicID()) {
+ default: break;
+ case Intrinsic::stackrestore: {
+ // If the save is right next to the restore, remove the restore. This can
+ // happen when variable allocas are DCE'd.
+ if (IntrinsicInst *SS = dyn_cast<IntrinsicInst>(II->getOperand(1))) {
+ if (SS->getIntrinsicID() == Intrinsic::stacksave) {
+ BasicBlock::iterator BI = SS;
+ if (&*++BI == II)
+ return EraseInstFromFunction(CI);
+ }
+ }
+
+ // If the stack restore is in a return/unwind block and if there are no
+ // allocas or calls between the restore and the return, nuke the restore.
+ TerminatorInst *TI = II->getParent()->getTerminator();
+ if (isa<ReturnInst>(TI) || isa<UnwindInst>(TI)) {
+ BasicBlock::iterator BI = II;
+ bool CannotRemove = false;
+ for (++BI; &*BI != TI; ++BI) {
+ if (isa<AllocaInst>(BI) ||
+ (isa<CallInst>(BI) && !isa<IntrinsicInst>(BI))) {
+ CannotRemove = true;
+ break;
+ }
+ }
+ if (!CannotRemove)
+ return EraseInstFromFunction(CI);
+ }
+ break;
+ }
+ }
}
return visitCallSite(II);
More information about the llvm-commits
mailing list