diff --git a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp index 532666ea7c1b..7cc34e1ad86c 100644 --- a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp +++ b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp @@ -936,6 +936,10 @@ bool WidenIV::WidenLoopCompare(NarrowIVDefUse DU) { if (!Cmp) return false; + bool IsSigned = CmpInst::isSigned(Cmp->getPredicate()); + if (!IsSigned) + return false; + Value *Op = Cmp->getOperand(Cmp->getOperand(0) == DU.NarrowDef ? 1 : 0); unsigned CastWidth = SE->getTypeSizeInBits(Op->getType()); unsigned IVWidth = SE->getTypeSizeInBits(WideType); @@ -947,7 +951,6 @@ bool WidenIV::WidenLoopCompare(NarrowIVDefUse DU) { // Widen the other operand of the compare, if necessary. if (CastWidth < IVWidth) { - bool IsSigned = CmpInst::isSigned(Cmp->getPredicate()); Value *ExtOp = getExtend(Op, WideType, IsSigned, Cmp); DU.NarrowUse->replaceUsesOfWith(Op, ExtOp); } diff --git a/llvm/test/Transforms/IndVarSimplify/widen-loop-comp.ll b/llvm/test/Transforms/IndVarSimplify/widen-loop-comp.ll index 84738ebe2398..a6963948d8b7 100644 --- a/llvm/test/Transforms/IndVarSimplify/widen-loop-comp.ll +++ b/llvm/test/Transforms/IndVarSimplify/widen-loop-comp.ll @@ -136,31 +136,3 @@ for.body: for.end: ret i32 %sum.0 } - -; CHECK-LABEL: @test4 -; CHECK: zext i32 %b -; CHECK: for.cond: -; CHECK: phi i64 -; CHECK: icmp ule i64 - -define i32 @test4(i32* %a, i32 %b) { -entry: - br label %for.cond - -for.cond: - %sum.0 = phi i32 [ 0, %entry ], [ %add, %for.body ] - %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ] - %cmp = icmp ule i32 %i.0, %b - br i1 %cmp, label %for.body, label %for.end - -for.body: - %idxprom = sext i32 %i.0 to i64 - %arrayidx = getelementptr inbounds i32* %a, i64 %idxprom - %0 = load i32* %arrayidx, align 4 - %add = add nsw i32 %sum.0, %0 - %inc = add nsw i32 %i.0, 1 - br label %for.cond - -for.end: - ret i32 %sum.0 -}