llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-llvm-transforms Author: llvmbot <details> <summary>Changes</summary> Backport 42c2980c7c632d7a45776d3e2c51627100f6e763 Requested by: @<!-- -->nikic --- Full diff: https://github.com/llvm/llvm-project/pull/210003.diff 2 Files Affected: - (modified) llvm/lib/Transforms/Utils/LoopUnroll.cpp (+4) - (added) llvm/test/Transforms/LoopUnroll/full-unroll-scev-invalidation.ll (+55) ``````````diff diff --git a/llvm/lib/Transforms/Utils/LoopUnroll.cpp b/llvm/lib/Transforms/Utils/LoopUnroll.cpp index d00de52e1cb0b..1f9f340a9cb31 100644 --- a/llvm/lib/Transforms/Utils/LoopUnroll.cpp +++ b/llvm/lib/Transforms/Utils/LoopUnroll.cpp @@ -1284,6 +1284,10 @@ llvm::UnrollLoop(Loop *L, UnrollLoopOptions ULO, LoopInfo *LI, // Loop over the PHI nodes in the original block, setting incoming values. for (PHINode *PN : OrigPHINode) { if (CompletelyUnroll) { + // The RAUW below disconnects the original PHI from its users. + // Invalidate cached SCEVs while the def-use chain is still intact. + if (SE) + SE->forgetValue(PN); PN->replaceAllUsesWith(PN->getIncomingValueForBlock(Preheader)); PN->eraseFromParent(); } else if (ULO.Count > 1) { diff --git a/llvm/test/Transforms/LoopUnroll/full-unroll-scev-invalidation.ll b/llvm/test/Transforms/LoopUnroll/full-unroll-scev-invalidation.ll new file mode 100644 index 0000000000000..a9f7a1df0328a --- /dev/null +++ b/llvm/test/Transforms/LoopUnroll/full-unroll-scev-invalidation.ll @@ -0,0 +1,55 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 +; RUN: opt -S -passes='loop(indvars,loop-unroll-full)' %s | FileCheck %s + +@__chk = external global i64 + +define void @f4(i64 %0) { +; CHECK-LABEL: define void @f4( +; CHECK-SAME: i64 [[TMP0:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br label %[[LBL_B5:.*]] +; CHECK: [[LBL_B5]]: +; CHECK-NEXT: br label %[[LBL_B10:.*]] +; CHECK: [[LBL_B10]]: +; CHECK-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP0]] to i32 +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.ctpop.i32(i32 [[CONV1]]) +; CHECK-NEXT: [[TOBOOL4_NOT:%.*]] = icmp eq i32 [[TMP1]], 0 +; CHECK-NEXT: br i1 [[TOBOOL4_NOT]], label %[[COMMON_RET1:.*]], label %[[IF_THEN8:.*]] +; CHECK: [[IF_THEN8]]: +; CHECK-NEXT: store i64 5, ptr @__chk, align 4 +; CHECK-NEXT: ret void +; CHECK: [[COMMON_RET1]]: +; CHECK-NEXT: ret void +; +entry: + br label %lbl_b5 + +lbl_b5: + br label %lbl_b10 + +lbl_b10: + %1 = phi i8 [ 0, %lbl_b5 ], [ 1, %lbl_b10 ] + %2 = phi i64 [ %0, %lbl_b5 ], [ 0, %lbl_b10 ] + %bb13.1 = phi i32 [ 0, %lbl_b5 ], [ %3, %lbl_b10 ] + %conv1 = trunc i64 %2 to i32 + %3 = call i32 @llvm.ctpop.i32(i32 %conv1) + %loadedv = trunc i8 %1 to i1 + br i1 %loadedv, label %if.then3, label %lbl_b10 + +if.then3: + %tobool4.not = icmp eq i32 %bb13.1, 0 + br i1 %tobool4.not, label %common.ret, label %if.then8 + +if.then8: + br i1 true, label %if.then10, label %lbl_b5 + +common.ret: + ret void + +if.then10: + %.lcssa.lcssa34 = phi i32 [ %3, %if.then8 ] + store i64 5, ptr @__chk + ret void +} + +declare i32 @llvm.ctpop.i32(i32) `````````` </details> https://github.com/llvm/llvm-project/pull/210003 _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
