From 38eb9f46db418ff8a75ef95841097a2ab6ebbc41 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Thu, 4 Jun 2015 07:01:56 +0000 Subject: [PATCH] [ConstantFold] Don't skip the first gep index when folding geps We neglected to check if the first index made the GEP ineligible for 'inbounds'. This fixes PR23753. llvm-svn: 239015 --- llvm/lib/IR/ConstantFold.cpp | 6 ++--- llvm/test/Transforms/LoopStrengthReduce/pr23753.ll | 29 ++++++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 llvm/test/Transforms/LoopStrengthReduce/pr23753.ll diff --git a/llvm/lib/IR/ConstantFold.cpp b/llvm/lib/IR/ConstantFold.cpp index 3f64c43..2efc6124 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 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(Ty)->getTypeAtIndex(Idxs[i]), ++i) { if (ConstantInt *CI = dyn_cast(Idxs[i])) { if (isa(Ty) || isa(Ty)) diff --git a/llvm/test/Transforms/LoopStrengthReduce/pr23753.ll b/llvm/test/Transforms/LoopStrengthReduce/pr23753.ll new file mode 100644 index 0000000..a6a34b1 --- /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 +} -- 2.7.4