[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