[llvm-commits] [llvm] r122732 - in /llvm/trunk: lib/Transforms/Scalar/EarlyCSE.cpp test/Transforms/EarlyCSE/basic.ll
Chris Lattner
sabre at nondot.org
Sun Jan 2 19:46:34 PST 2011
Author: lattner
Date: Sun Jan 2 21:46:34 2011
New Revision: 122732
URL: http://llvm.org/viewvc/llvm-project?rev=122732&view=rev
Log:
now that loads are in their own table, we can implement
store->load forwarding. This allows EarlyCSE to zap 600 more
loads from 176.gcc.
Modified:
llvm/trunk/lib/Transforms/Scalar/EarlyCSE.cpp
llvm/trunk/test/Transforms/EarlyCSE/basic.ll
Modified: llvm/trunk/lib/Transforms/Scalar/EarlyCSE.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/EarlyCSE.cpp?rev=122732&r1=122731&r2=122732&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/EarlyCSE.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/EarlyCSE.cpp Sun Jan 2 21:46:34 2011
@@ -380,8 +380,19 @@
// Okay, this isn't something we can CSE at all. Check to see if it is
// something that could modify memory. If so, our available memory values
// cannot be used so bump the generation count.
- if (Inst->mayWriteToMemory())
+ if (Inst->mayWriteToMemory()) {
++CurrentGeneration;
+
+ // Okay, we just invalidated anything we knew about loaded values. Try to
+ // salvage *something* by remembering that the stored value is a live
+ // version of the pointer. It is safe to forward from volatile stores to
+ // non-volatile loads, so we don't have to check for volatility of the
+ // store.
+ if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
+ AvailableLoads->insert(SI->getPointerOperand(),
+ std::pair<Value*, unsigned>(SI->getValueOperand(), CurrentGeneration));
+ }
+ }
}
unsigned LiveOutGeneration = CurrentGeneration;
Modified: llvm/trunk/test/Transforms/EarlyCSE/basic.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/EarlyCSE/basic.ll?rev=122732&r1=122731&r2=122732&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/EarlyCSE/basic.ll (original)
+++ llvm/trunk/test/Transforms/EarlyCSE/basic.ll Sun Jan 2 21:46:34 2011
@@ -87,3 +87,12 @@
ret i32 %Diff
; CHECK: ret i32 0
}
+
+;; Trivial Store->load forwarding
+; CHECK: @test6
+define i32 @test6(i32 *%P) {
+ store i32 42, i32* %P
+ %V1 = load i32* %P
+ ret i32 %V1
+ ; CHECK: ret i32 42
+}
More information about the llvm-commits
mailing list