diff --git a/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp b/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp --- a/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp +++ b/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp @@ -1026,7 +1026,7 @@ /// until we reach a value that dominates InsertPos. bool SCEVExpander::hoistIVInc(Instruction *IncV, Instruction *InsertPos, bool RecomputePoisonFlags) { - if (SE.DT.dominates(IncV, InsertPos)) + if (SE.DT.dominates(IncV, InsertPos) && !RecomputePoisonFlags) return true; // InsertPos must itself dominate IncV so that IncV's new position satisfies diff --git a/llvm/test/Transforms/IndVarSimplify/iv-poison.ll b/llvm/test/Transforms/IndVarSimplify/iv-poison.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/IndVarSimplify/iv-poison.ll @@ -0,0 +1,28 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -passes=indvars -S < %s | FileCheck %s + +define i2 @iv_hoist_nsw_poison(i2 %0) { +; CHECK-LABEL: @iv_hoist_nsw_poison( +; CHECK-NEXT: br label [[TMP2:%.*]] +; CHECK: 2: +; CHECK-NEXT: [[DOT07:%.*]] = phi i2 [ 1, [[TMP1:%.*]] ], [ [[TMP3:%.*]], [[TMP2]] ] +; CHECK-NEXT: [[TMP3]] = add nuw i2 [[DOT07]], 1 +; CHECK-NEXT: [[DOTNOT_NOT:%.*]] = icmp ult i2 1, [[TMP0:%.*]] +; CHECK-NEXT: br i1 [[DOTNOT_NOT]], label [[COMMON_RET:%.*]], label [[TMP2]] +; CHECK: common.ret: +; CHECK-NEXT: [[DOTLCSSA:%.*]] = phi i2 [ [[TMP3]], [[TMP2]] ] +; CHECK-NEXT: ret i2 [[DOTLCSSA]] +; + br label %2 + +2: ; preds = %2, %1 + %.07 = phi i2 [ 1, %1 ], [ %3, %2 ] + %.0 = phi i2 [ 1, %1 ], [ %4, %2 ] + %3 = add nsw i2 %.07, 1 + %4 = add i2 %.0, 1 + %.not.not = icmp ult i2 %.07, %0 + br i1 %.not.not, label %common.ret, label %2 + +common.ret: ; preds = %2 + ret i2 %4 +}