diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/IR/ConstantFold.cpp | 6 | ||||
| -rw-r--r-- | llvm/test/Transforms/LoopStrengthReduce/pr23753.ll | 29 |
2 files changed, 32 insertions, 3 deletions
diff --git a/llvm/lib/IR/ConstantFold.cpp b/llvm/lib/IR/ConstantFold.cpp index 3f64c43e902..2efc61242ea 100644 --- a/llvm/lib/IR/ConstantFold.cpp +++ b/llvm/lib/IR/ConstantFold.cpp @@ -2165,9 +2165,9 @@ static Constant *ConstantFoldGetElementPtrImpl(Type *PointeeTy, Constant *C, // factored out into preceding dimensions. bool Unknown = false; SmallVector<Constant *, 8> NewIdxs; - Type *Ty = PointeeTy; - Type *Prev = C->getType(); - for (unsigned i = 1, e = Idxs.size(); i != e; + Type *Ty = C->getType(); + Type *Prev = nullptr; + for (unsigned i = 0, e = Idxs.size(); i != e; Prev = Ty, Ty = cast<CompositeType>(Ty)->getTypeAtIndex(Idxs[i]), ++i) { if (ConstantInt *CI = dyn_cast<ConstantInt>(Idxs[i])) { if (isa<ArrayType>(Ty) || isa<VectorType>(Ty)) diff --git a/llvm/test/Transforms/LoopStrengthReduce/pr23753.ll b/llvm/test/Transforms/LoopStrengthReduce/pr23753.ll new file mode 100644 index 00000000000..a6a34b1dfd8 --- /dev/null +++ b/llvm/test/Transforms/LoopStrengthReduce/pr23753.ll @@ -0,0 +1,29 @@ +; RUN: opt < %s -loop-reduce -S | FileCheck %s + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +@a = external global i32, align 4 +@d = external global i8, align 1 + +; CHECK-LABEL: void @f +define void @f() { +entry: + br label %for.body + +for.body: + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %arrayidx = getelementptr inbounds i32, i32* @a, i64 %indvars.iv + %cmp = icmp ne i32* %arrayidx, bitcast (i8* @d to i32*) + %indvars.iv.next = add i64 %indvars.iv, 1 + br i1 %cmp, label %for.body, label %for.end + +; CHECK: %[[phi:.*]] = phi i8* [ %[[gep:.*]], {{.*}} ], [ getelementptr (i8, i8* @d, i64 sub (i64 4, i64 ptrtoint (i32* @a to i64))), {{.*}} ] +; CHECK-NEXT: %[[gep]] = getelementptr i8, i8* %[[phi]], i64 -4 +; CHECK-NEXT: %[[cst:.*]] = bitcast i8* %[[gep]] to i32* +; CHECK-NEXT: %[[cmp:.*]] = icmp ne i32* %[[cst]], null +; CHECK-NEXT: br i1 %[[cmp]] + +for.end: + ret void +} |

