Fix the instcombine GEP index widening transform to work correctly for vector
authorDuncan Sands <baldrick@free.fr>
Tue, 13 Nov 2012 13:01:00 +0000 (13:01 +0000)
committerDuncan Sands <baldrick@free.fr>
Tue, 13 Nov 2012 13:01:00 +0000 (13:01 +0000)
getelementptrs.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167829 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/GetElementPtrTypeIterator.h
test/Transforms/InstCombine/vector_gep1.ll

index ef92c95ee7e0833ed814c5dfeb954f5dd3d7e102..93dc41fbdc114202bc71a3b97945263eb53c5233 100644 (file)
@@ -83,15 +83,15 @@ namespace llvm {
   typedef generic_gep_type_iterator<> gep_type_iterator;
 
   inline gep_type_iterator gep_type_begin(const User *GEP) {
-    return gep_type_iterator::begin(GEP->getOperand(0)->getType(),
-                                    GEP->op_begin()+1);
+    return gep_type_iterator::begin
+      (GEP->getOperand(0)->getType()->getScalarType(), GEP->op_begin()+1);
   }
   inline gep_type_iterator gep_type_end(const User *GEP) {
     return gep_type_iterator::end(GEP->op_end());
   }
   inline gep_type_iterator gep_type_begin(const User &GEP) {
-    return gep_type_iterator::begin(GEP.getOperand(0)->getType(),
-                                    GEP.op_begin()+1);
+    return gep_type_iterator::begin
+      (GEP.getOperand(0)->getType()->getScalarType(), GEP.op_begin()+1);
   }
   inline gep_type_iterator gep_type_end(const User &GEP) {
     return gep_type_iterator::end(GEP.op_end());
index 6523622995622696d50756583f08274af2be46a9..f4c75c8009853b163d3dda5739bb304da16fefba 100644 (file)
@@ -35,3 +35,8 @@ define <2 x i1> @test5(<2 x i8*> %a) {
   %B = icmp ult <2 x i8*> %g, zeroinitializer
   ret <2 x i1> %B
 }
+
+define <2 x i32*> @test7(<2 x {i32, i32}*> %a) {
+  %w = getelementptr <2 x {i32, i32}*> %a, <2 x i32> <i32 5, i32 9>, <2 x i32> zeroinitializer
+  ret <2 x i32*> %w
+}