[llvm-commits] [llvm] r80508 - in /llvm/trunk: lib/Transforms/Scalar/InstructionCombining.cpp test/Transforms/InstCombine/getelementptr-2.ll

Chris Lattner sabre at nondot.org
Sun Aug 30 13:38:22 PDT 2009


Author: lattner
Date: Sun Aug 30 15:38:21 2009
New Revision: 80508

URL: http://llvm.org/viewvc/llvm-project?rev=80508&view=rev
Log:
Fix PR4748:  don't fold gep(bitcast(x)) into bitcast(gep) when x 
is itself a bitcast.  Since we have gep(bitcast(bitcast(y))) in this
case, just wait for the two bitcasts to get zapped.  This prevents
instcombine from confusing some aliasing stuff, and allows it to
directly eliminate the load in the testcase.

Added:
    llvm/trunk/test/Transforms/InstCombine/getelementptr-2.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp?rev=80508&r1=80507&r2=80508&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp Sun Aug 30 15:38:21 2009
@@ -10896,6 +10896,13 @@
   if (Value *X = getBitCastOperand(PtrOp)) {
     assert(isa<PointerType>(X->getType()) && "Must be cast from pointer");
 
+    // If the input bitcast is actually "bitcast(bitcast(x))", then we don't 
+    // want to change the gep until the bitcasts are eliminated.
+    if (getBitCastOperand(X)) {
+      Worklist.AddValue(PtrOp);
+      return 0;
+    }
+    
     // Transform: GEP (bitcast [10 x i8]* X to [0 x i8]*), i32 0, ...
     // into     : GEP [10 x i8]* X, i32 0, ...
     //

Added: llvm/trunk/test/Transforms/InstCombine/getelementptr-2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/getelementptr-2.ll?rev=80508&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/getelementptr-2.ll (added)
+++ llvm/trunk/test/Transforms/InstCombine/getelementptr-2.ll Sun Aug 30 15:38:21 2009
@@ -0,0 +1,21 @@
+; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep load
+; PR4748
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
+target triple = "i386-apple-darwin9"
+	%struct.B = type { double }
+	%struct.A = type { %struct.B, i32, i32 }
+
+define i32 @_Z4funcv(%struct.A* %a) {
+entry:
+  %g3 = getelementptr %struct.A* %a, i32 0, i32 1
+  store i32 10, i32* %g3, align 4
+
+  %g4 = getelementptr %struct.A* %a, i32 0, i32 0
+  
+  %new_a = bitcast %struct.B* %g4 to %struct.A*
+
+  %g5 = getelementptr %struct.A* %new_a, i32 0, i32 1	
+  %a_a = load i32* %g5, align 4	
+  ret i32 %a_a
+}
+





More information about the llvm-commits mailing list