diff options
author | Chris Lattner <sabre@nondot.org> | 2005-01-31 05:36:43 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-01-31 05:36:43 +0000 |
commit | 31f486c775cab16b7d32ed4502fa2cda80de22b1 (patch) | |
tree | aaafc7f03786fd1cad0cc97676f9961d01cf9f0d /llvm/lib/Transforms | |
parent | 2357f255cab70500079fc702c037c0131527120c (diff) | |
download | bcm5719-llvm-31f486c775cab16b7d32ed4502fa2cda80de22b1.tar.gz bcm5719-llvm-31f486c775cab16b7d32ed4502fa2cda80de22b1.zip |
Implement the trivial cases in InstCombine/store.ll
llvm-svn: 19950
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Scalar/InstructionCombining.cpp | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp index 956bb1e0139..885355dc0b8 100644 --- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp @@ -130,6 +130,7 @@ namespace { Instruction *visitAllocationInst(AllocationInst &AI); Instruction *visitFreeInst(FreeInst &FI); Instruction *visitLoadInst(LoadInst &LI); + Instruction *visitStoreInst(StoreInst &SI); Instruction *visitBranchInst(BranchInst &BI); Instruction *visitSwitchInst(SwitchInst &SI); @@ -4804,6 +4805,42 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) { return 0; } +Instruction *InstCombiner::visitStoreInst(StoreInst &SI) { + Value *Val = SI.getOperand(0); + Value *Ptr = SI.getOperand(1); + + if (isa<UndefValue>(Ptr)) { // store X, undef -> noop (even if volatile) + removeFromWorkList(&SI); + SI.eraseFromParent(); + ++NumCombined; + return 0; + } + + if (SI.isVolatile()) return 0; // Don't hack volatile loads. + + // store X, null -> turns into 'unreachable' in SimplifyCFG + if (isa<ConstantPointerNull>(Ptr)) { + if (!isa<UndefValue>(Val)) { + SI.setOperand(0, UndefValue::get(Val->getType())); + if (Instruction *U = dyn_cast<Instruction>(Val)) + WorkList.push_back(U); // Dropped a use. + ++NumCombined; + } + return 0; // Do not modify these! + } + + // store undef, Ptr -> noop + if (isa<UndefValue>(Val)) { + removeFromWorkList(&SI); + SI.eraseFromParent(); + ++NumCombined; + return 0; + } + + return 0; +} + + Instruction *InstCombiner::visitBranchInst(BranchInst &BI) { // Change br (not X), label True, label False to: br X, label False, True Value *X; @@ -5039,7 +5076,7 @@ bool InstCombiner::runOnFunction(Function &F) { // Instructions may end up in the worklist more than once. Erase all // occurrances of this instruction. removeFromWorkList(I); - I->getParent()->getInstList().erase(I); + I->eraseFromParent(); } else { WorkList.push_back(Result); AddUsersToWorkList(*Result); |