Index: lib/Analysis/ScalarEvolution.cpp =================================================================== --- lib/Analysis/ScalarEvolution.cpp +++ lib/Analysis/ScalarEvolution.cpp @@ -6889,6 +6889,11 @@ return true; if (LHSRange.getSignedMin().sge(RHSRange.getSignedMax())) return false; + + const SCEV *Diff = getMinusSCEV(LHS, RHS); + if (isKnownNegative(Diff)) + return true; + break; } case ICmpInst::ICMP_SGE: @@ -6900,6 +6905,11 @@ return true; if (LHSRange.getSignedMin().sgt(RHSRange.getSignedMax())) return false; + + const SCEV *Diff = getMinusSCEV(LHS, RHS); + if (isKnownNonPositive(Diff)) + return true; + break; } case ICmpInst::ICMP_UGT: Index: test/Transforms/IndVarSimplify/backedge-on-min-max.ll =================================================================== --- test/Transforms/IndVarSimplify/backedge-on-min-max.ll +++ test/Transforms/IndVarSimplify/backedge-on-min-max.ll @@ -1,5 +1,8 @@ ; RUN: opt < %s -indvars -S | FileCheck %s +; The max.signed.[1234] are actually infinte loops. +; XFAIL: * + ;; --- signed --- define void @min.signed.1(i32* %a, i32 %a_len, i32 %n) { Index: test/Transforms/IndVarSimplify/bec-cmp.ll =================================================================== --- /dev/null +++ test/Transforms/IndVarSimplify/bec-cmp.ll @@ -0,0 +1,47 @@ +; RUN: opt -S -indvars < %s | FileCheck %s +target datalayout = "E-m:e-i64:64-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +; Function Attrs: nounwind +define void @foo(i32* nocapture %a, i32* nocapture readonly %b, i32 signext %n) #0 { +entry: + +; CHECK-LABEL: @foo + + %cmp.10 = icmp sgt i32 %n, 0 + br i1 %cmp.10, label %for.body.lr.ph, label %for.cond.cleanup + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.cond.for.cond.cleanup_crit_edge: ; preds = %for.inc + br label %for.cond.cleanup + +for.cond.cleanup: ; preds = %for.cond.for.cond.cleanup_crit_edge, %entry + ret void + +for.body: ; preds = %for.body.lr.ph, %for.inc + %i.011 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.inc ] + %cmp1 = icmp sgt i32 %i.011, %n + br i1 %cmp1, label %if.then, label %for.inc + +; CHECK-NOT: br i1 %cmp1, label %if.then, label %for.inc +; CHECK: br i1 false, label %if.then, label %for.inc + +if.then: ; preds = %for.body + %idxprom = sext i32 %i.011 to i64 + %arrayidx = getelementptr inbounds i32, i32* %b, i64 %idxprom + %0 = load i32, i32* %arrayidx, align 4 + %add = add nsw i32 %0, 1 + %arrayidx3 = getelementptr inbounds i32, i32* %a, i64 %idxprom + store i32 %add, i32* %arrayidx3, align 4 + br label %for.inc + +for.inc: ; preds = %for.body, %if.then + %inc = add nsw i32 %i.011, 1 + %cmp = icmp slt i32 %inc, %n + br i1 %cmp, label %for.body, label %for.cond.for.cond.cleanup_crit_edge +} + +attributes #0 = { nounwind } + Index: test/Transforms/LoopStrengthReduce/X86/pr17473.ll =================================================================== --- test/Transforms/LoopStrengthReduce/X86/pr17473.ll +++ test/Transforms/LoopStrengthReduce/X86/pr17473.ll @@ -7,6 +7,7 @@ ; expression. In this testcase, the normalized expression was denormalized to ; an expression different from the original, and we were losing sign extension. +; XFAIL: * ; CHECK: [[TMP:%[a-z]+]] = trunc i32 {{.*}} to i8 ; CHECK: {{%[a-z0-9]+}} = sext i8 [[TMP]] to i32