From e302fa89aa45afceedb711a264cfc486395aca17 Mon Sep 17 00:00:00 2001 From: Florian Hahn Date: Tue, 18 Oct 2022 15:12:23 +0100 Subject: [PATCH] [LoopUnroll] Forget exit values when making changes. When unrolling, the exit values in LCSSA phis will get updated. Invalidate cached SCEV values for those phis in case SCEV looked through a exit phi. Fixes #58340. --- llvm/lib/Transforms/Utils/LoopUnroll.cpp | 1 + llvm/test/Transforms/LoopUnroll/scev-forget-exit-phis.ll | 13 +++---------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/llvm/lib/Transforms/Utils/LoopUnroll.cpp b/llvm/lib/Transforms/Utils/LoopUnroll.cpp index 6d6c3db..fd874db 100644 --- a/llvm/lib/Transforms/Utils/LoopUnroll.cpp +++ b/llvm/lib/Transforms/Utils/LoopUnroll.cpp @@ -578,6 +578,7 @@ LoopUnrollResult llvm::UnrollLoop(Loop *L, UnrollLoopOptions ULO, LoopInfo *LI, if (It != LastValueMap.end()) Incoming = It->second; PHI.addIncoming(Incoming, New); + SE->forgetValue(&PHI); } } // Keep track of new headers and latches as we create them, so that diff --git a/llvm/test/Transforms/LoopUnroll/scev-forget-exit-phis.ll b/llvm/test/Transforms/LoopUnroll/scev-forget-exit-phis.ll index 8cf4829..0c9f9db 100644 --- a/llvm/test/Transforms/LoopUnroll/scev-forget-exit-phis.ll +++ b/llvm/test/Transforms/LoopUnroll/scev-forget-exit-phis.ll @@ -18,14 +18,13 @@ define i8 @test_pr58340(ptr %dst.1, ptr %dst.2) { ; CHECK-NEXT: store i32 [[SEL_1]], ptr [[DST_1:%.*]], align 4 ; CHECK-NEXT: br label [[INNER_1_LATCH:%.*]] ; CHECK: inner.2.header.preheader: -; CHECK-NEXT: [[SEL_1_LCSSA:%.*]] = phi i32 [ [[SEL_1_1:%.*]], [[MERGE_1:%.*]] ] ; CHECK-NEXT: br label [[INNER_2_HEADER:%.*]] ; CHECK: inner.1.latch: -; CHECK-NEXT: br i1 false, label [[MERGE_1]], label [[THEN_1:%.*]] +; CHECK-NEXT: br i1 false, label [[MERGE_1:%.*]], label [[THEN_1:%.*]] ; CHECK: then.1: ; CHECK-NEXT: br label [[MERGE_1]] ; CHECK: merge.1: -; CHECK-NEXT: [[SEL_1_1]] = phi i32 [ 0, [[INNER_1_LATCH]] ], [ 2, [[THEN_1]] ] +; CHECK-NEXT: [[SEL_1_1:%.*]] = phi i32 [ 0, [[INNER_1_LATCH]] ], [ 2, [[THEN_1]] ] ; CHECK-NEXT: store i32 [[SEL_1_1]], ptr [[DST_1]], align 4 ; CHECK-NEXT: br i1 false, label [[INNER_1_LATCH_1:%.*]], label [[INNER_2_HEADER_PREHEADER:%.*]] ; CHECK: inner.1.latch.1: @@ -33,14 +32,8 @@ define i8 @test_pr58340(ptr %dst.1, ptr %dst.2) { ; CHECK: inner.2.header: ; CHECK-NEXT: br label [[INNER_3:%.*]] ; CHECK: inner.3: -; CHECK-NEXT: [[SEL_2:%.*]] = phi i64 [ [[SEL_1_EXT:%.*]], [[INNER_3]] ], [ 0, [[INNER_2_HEADER]] ] -; CHECK-NEXT: [[C_1:%.*]] = icmp ult i32 [[SEL_1_LCSSA]], 1 -; CHECK-NEXT: [[SEL_1_EXT]] = sext i32 [[SEL_1_LCSSA]] to i64 -; CHECK-NEXT: br i1 [[C_1]], label [[INNER_3]], label [[INNER_2_LATCH:%.*]] -; CHECK: inner.2.latch: -; CHECK-NEXT: [[SEL_2_LCSSA:%.*]] = phi i64 [ [[SEL_2]], [[INNER_3]] ] ; CHECK-NEXT: store i32 0, ptr [[DST_1]], align 4 -; CHECK-NEXT: store i64 [[SEL_2_LCSSA]], ptr [[DST_2:%.*]], align 8 +; CHECK-NEXT: store i64 0, ptr [[DST_2:%.*]], align 8 ; CHECK-NEXT: call void @clobber() ; CHECK-NEXT: br label [[OUTER_HEADER]] ; -- 2.7.4