diff --git a/llvm/lib/Analysis/LazyValueInfo.cpp b/llvm/lib/Analysis/LazyValueInfo.cpp index 5cd179df436de..581358a645780 100644 --- a/llvm/lib/Analysis/LazyValueInfo.cpp +++ b/llvm/lib/Analysis/LazyValueInfo.cpp @@ -694,6 +694,9 @@ LazyValueInfoImpl::solveBlockValueNonLocal(Value *Val, BasicBlock *BB) { // canonicalizing to make this true rather than relying on this happy // accident. for (BasicBlock *Pred : predecessors(BB)) { + // Skip self loops. + if (Pred == BB) + continue; std::optional EdgeResult = getEdgeValue(Val, Pred, BB); if (!EdgeResult) // Explore that input, then return here diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/loop.ll b/llvm/test/Transforms/CorrelatedValuePropagation/loop.ll new file mode 100644 index 0000000000000..41e5be78ace8a --- /dev/null +++ b/llvm/test/Transforms/CorrelatedValuePropagation/loop.ll @@ -0,0 +1,39 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -passes=correlated-propagation -S %s | FileCheck %s + +define i64 @test_self_loop(i64 %x, i1 %cond) { +; CHECK-LABEL: define range(i64 0, 576460752303423488) i64 @test_self_loop( +; CHECK-SAME: i64 [[X:%.*]], i1 [[COND:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*]]: +; CHECK-NEXT: [[COND1:%.*]] = icmp ugt i64 [[X]], 576460752303423487 +; CHECK-NEXT: br i1 [[COND1]], label %[[COMMON_RET:.*]], label %[[LOOP:.*]] +; CHECK: [[LOOP]]: +; CHECK-NEXT: br i1 [[COND]], label %[[INDIRECT:.*]], label %[[LOOP]] +; CHECK: [[INDIRECT]]: +; CHECK-NEXT: [[COND2:%.*]] = icmp eq i64 [[X]], 0 +; CHECK-NEXT: br i1 [[COND2]], label %[[COMMON_RET]], label %[[EXIT:.*]] +; CHECK: [[EXIT]]: +; CHECK-NEXT: br label %[[COMMON_RET]] +; CHECK: [[COMMON_RET]]: +; CHECK-NEXT: [[RES:%.*]] = phi i64 [ [[X]], %[[EXIT]] ], [ 0, %[[INDIRECT]] ], [ 0, %[[ENTRY]] ] +; CHECK-NEXT: ret i64 [[RES]] +; +entry: + %cond1 = icmp ugt i64 %x, 576460752303423487 + br i1 %cond1, label %common.ret, label %loop + +loop: + br i1 %cond, label %indirect, label %loop + +indirect: + %cond2 = icmp eq i64 %x, 0 + br i1 %cond2, label %common.ret, label %exit + +exit: + %smax = tail call i64 @llvm.smax.i64(i64 %x, i64 1) + br label %common.ret + +common.ret: + %res = phi i64 [ %smax, %exit ], [ 0, %indirect ], [ 0, %entry ] + ret i64 %res +} diff --git a/llvm/test/Transforms/JumpThreading/ddt-crash.ll b/llvm/test/Transforms/JumpThreading/ddt-crash.ll index b0bba1a2dd0c4..94ab4791f1664 100644 --- a/llvm/test/Transforms/JumpThreading/ddt-crash.ll +++ b/llvm/test/Transforms/JumpThreading/ddt-crash.ll @@ -131,20 +131,16 @@ define void @spam(ptr %arg, i1 %arg2) { ; CHECK: bb31: ; CHECK-NEXT: [[TMP32:%.*]] = phi i8 [ [[TMP32]], [[BB31]] ], [ [[TMP32_PR]], [[BB30]] ] ; CHECK-NEXT: [[TMP33:%.*]] = icmp eq i8 [[TMP32]], 0 -; CHECK-NEXT: br i1 [[TMP33]], label [[BB31]], label [[BB37]] +; CHECK-NEXT: br i1 [[TMP33]], label [[BB31]], label [[BB41_THREAD]] ; CHECK: bb37: -; CHECK-NEXT: [[TMP36:%.*]] = phi i1 [ false, [[BB23]] ], [ true, [[BB31]] ] +; CHECK-NEXT: [[TMP36:%.*]] = phi i1 [ false, [[BB23]] ] ; CHECK-NEXT: [[TMP38:%.*]] = icmp eq ptr [[TMP15]], null -; CHECK-NEXT: br i1 [[TMP38]], label [[BB39:%.*]], label [[BB41:%.*]] -; CHECK: bb39: -; CHECK-NEXT: [[TMP364:%.*]] = phi i1 [ [[TMP36]], [[BB37]] ] -; CHECK-NEXT: [[TMP40:%.*]] = load ptr, ptr @global, align 8 -; CHECK-NEXT: br i1 [[TMP364]], label [[BB41_THREAD]], label [[BB41_THREAD]] +; CHECK-NEXT: br i1 [[TMP38]], label [[BB41:%.*]], label [[BB41_THREAD]] ; CHECK: bb41: -; CHECK-NEXT: [[TMP363:%.*]] = phi i1 [ [[TMP36]], [[BB37]] ] -; CHECK-NEXT: br i1 [[TMP363]], label [[BB41_THREAD]], label [[BB41_THREAD]] -; CHECK: bb41.thread: -; CHECK-NEXT: [[TMP0:%.*]] = phi ptr [ undef, [[BB41]] ], [ undef, [[BB39]] ], [ undef, [[BB39]] ], [ undef, [[BB41]] ], [ undef, [[BB27]] ], [ undef, [[BB25]] ] +; CHECK-NEXT: [[TMP40:%.*]] = load ptr, ptr @global, align 8 +; CHECK-NEXT: br label [[BB41_THREAD]] +; CHECK: bb41.thread11: +; CHECK-NEXT: [[TMP0:%.*]] = phi ptr [ undef, [[BB41]] ], [ undef, [[BB25]] ], [ undef, [[BB31]] ], [ undef, [[BB27]] ], [ undef, [[BB37]] ] ; CHECK-NEXT: ret void ; bb: