[llvm-commits] [llvm] r82404 - in /llvm/trunk: lib/Analysis/MemoryDependenceAnalysis.cpp test/Transforms/GVN/rle.ll

Chris Lattner sabre at nondot.org
Sun Sep 20 14:00:18 PDT 2009


Author: lattner
Date: Sun Sep 20 16:00:18 2009
New Revision: 82404

URL: http://llvm.org/viewvc/llvm-project?rev=82404&view=rev
Log:
improve memdep to eliminate bitcasts (and aliases, and noop geps) 
early for the stated reasons: this allows it to find more 
equivalences and depend less on code layout.

Modified:
    llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp
    llvm/trunk/test/Transforms/GVN/rle.ll

Modified: llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp?rev=82404&r1=82403&r2=82404&view=diff

==============================================================================
--- llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp (original)
+++ llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp Sun Sep 20 16:00:18 2009
@@ -521,6 +521,13 @@
   const Type *EltTy = cast<PointerType>(Pointer->getType())->getElementType();
   uint64_t PointeeSize = AA->getTypeStoreSize(EltTy);
   
+  // If Pointer is a bitcast instruction, chomp through to the pointee since
+  // they are must alias.  This increases the effectiveness of caching by
+  // finding more equivalences, avoids having to phi translate the bitcast, and
+  // avoids conflicts where we are looking for two "different" values in the
+  // same block when they are really just must aliases.
+  Pointer = Pointer->stripPointerCasts();
+  
   // This is the set of blocks we've inspected, and the pointer we consider in
   // each block.  Because of critical edges, we currently bail out if querying
   // a block with multiple different pointers.  This can happen during PHI
@@ -660,7 +667,6 @@
                             SmallVectorImpl<NonLocalDepEntry> &Result,
                             DenseMap<BasicBlock*, Value*> &Visited,
                             bool SkipFirstBlock) {
-  
   // Look up the cached info for Pointer.
   ValueIsLoadPair CacheKey(Pointer, isLoad);
   
@@ -793,6 +799,13 @@
         BasicBlock *Pred = *PI;
         Value *PredPtr = PtrPHI->getIncomingValueForBlock(Pred);
         
+        // If Pointer is a bitcast instruction, chomp through to the pointee since
+        // they are must alias.  This increases the effectiveness of caching by
+        // finding more equivalences, avoids having to phi translate the bitcast, and
+        // avoids conflicts where we are looking for two "different" values in the
+        // same block when they are really just must aliases.
+        PredPtr = PredPtr->stripPointerCasts();
+        
         // Check to see if we have already visited this pred block with another
         // pointer.  If so, we can't do this lookup.  This failure can occur
         // with PHI translation when a critical edge exists and the PHI node in

Modified: llvm/trunk/test/Transforms/GVN/rle.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/rle.ll?rev=82404&r1=82403&r2=82404&view=diff

==============================================================================
--- llvm/trunk/test/Transforms/GVN/rle.ll (original)
+++ llvm/trunk/test/Transforms/GVN/rle.ll Sun Sep 20 16:00:18 2009
@@ -141,6 +141,32 @@
 ; CHECK: ret i8 %A
 }
 
+;; non-local i32/float -> i8 load forwarding.  This also tests that the "P3"
+;; bitcast equivalence can be properly phi translated.
+define i8 @coerce_mustalias_nonlocal1(i32* %P, i1 %cond) {
+  %P2 = bitcast i32* %P to float*
+  br i1 %cond, label %T, label %F
+T:
+  store i32 42, i32* %P
+  br label %Cont
+  
+F:
+  store float 1.0, float* %P2
+  br label %Cont
+
+Cont:
+  %P3 = bitcast i32* %P to i8*
+  %A = load i8* %P3
+  ret i8 %A
+
+; CHECK: @coerce_mustalias_nonlocal1
+; CHECK: Cont:
+; CHECK:   %A = phi i8 [
+; CHECK-NOT: load
+; CHECK: ret i8 %A
+}
+
+
 ;; non-local i32 -> i8 partial redundancy load forwarding.
 define i8 @coerce_mustalias_pre0(i32* %P, i1 %cond) {
   %P3 = bitcast i32* %P to i8*





More information about the llvm-commits mailing list