[llvm] 60b8520 - [LoopDeletion] Forget loop before setting values to undef
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 29 02:48:29 PDT 2020
Author: Florian Hahn
Date: 2020-09-29T10:38:44+01:00
New Revision: 60b852092c98dbdc6248d60109d90ae6f8ad841c
URL: https://github.com/llvm/llvm-project/commit/60b852092c98dbdc6248d60109d90ae6f8ad841c
DIFF: https://github.com/llvm/llvm-project/commit/60b852092c98dbdc6248d60109d90ae6f8ad841c.diff
LOG: [LoopDeletion] Forget loop before setting values to undef
After D71539, we need to forget the loop before setting the incoming
values of phi nodes in exit blocks, because we are looking through those
phi nodes now and the SCEV expression could depend on the loop phi. If
we update the phi nodes before forgetting the loop, we miss those users
during invalidation.
Reviewed By: reames
Differential Revision: https://reviews.llvm.org/D88167
Added:
Modified:
llvm/lib/Transforms/Scalar/LoopDeletion.cpp
llvm/lib/Transforms/Utils/LoopUtils.cpp
llvm/test/Transforms/LoopDeletion/update-scev.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/LoopDeletion.cpp b/llvm/lib/Transforms/Scalar/LoopDeletion.cpp
index d9cde031cc60..76ba2f58e850 100644
--- a/llvm/lib/Transforms/Scalar/LoopDeletion.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopDeletion.cpp
@@ -165,6 +165,10 @@ static LoopDeletionResult deleteLoopIfDead(Loop *L, DominatorTree &DT,
if (ExitBlock && isLoopNeverExecuted(L)) {
LLVM_DEBUG(dbgs() << "Loop is proven to never execute, delete it!");
+ // We need to forget the loop before setting the incoming values of the exit
+ // phis to undef, so we properly invalidate the SCEV expressions for those
+ // phis.
+ SE.forgetLoop(L);
// Set incoming value to undef for phi nodes in the exit block.
for (PHINode &P : ExitBlock->phis()) {
std::fill(P.incoming_values().begin(), P.incoming_values().end(),
diff --git a/llvm/lib/Transforms/Utils/LoopUtils.cpp b/llvm/lib/Transforms/Utils/LoopUtils.cpp
index d7cd9b19b8d5..f2496c4a1ea1 100644
--- a/llvm/lib/Transforms/Utils/LoopUtils.cpp
+++ b/llvm/lib/Transforms/Utils/LoopUtils.cpp
@@ -724,6 +724,9 @@ void llvm::deleteDeadLoop(Loop *L, DominatorTree *DT, ScalarEvolution *SE,
}
LI->destroy(L);
}
+
+ if (SE)
+ SE->verify();
}
/// Checks if \p L has single exit through latch block except possibly
diff --git a/llvm/test/Transforms/LoopDeletion/update-scev.ll b/llvm/test/Transforms/LoopDeletion/update-scev.ll
index 641ba55ed8f6..528a00a93f66 100644
--- a/llvm/test/Transforms/LoopDeletion/update-scev.ll
+++ b/llvm/test/Transforms/LoopDeletion/update-scev.ll
@@ -1,4 +1,4 @@
-; RUN: opt -S -analyze -scalar-evolution -loop-deletion -scalar-evolution < %s | FileCheck %s --check-prefix=SCEV-EXPRS
+; RUN: opt -S -analyze -scalar-evolution -loop-deletion -scalar-evolution -verify-scev < %s | FileCheck %s --check-prefix=SCEV-EXPRS
; RUN: opt -S -loop-deletion < %s | FileCheck %s --check-prefix=IR-AFTER-TRANSFORM
; RUN: opt -S -indvars -loop-deletion -indvars < %s | FileCheck %s --check-prefix=ORIGINAL-CRASH
@@ -54,3 +54,115 @@ for.inc11: ; preds = %for.body6
for.cond14: ; preds = %for.cond14, %for.inc11
br i1 undef, label %for.cond, label %for.cond14
}
+
+; LoopDeletion removes the loop %for.body7.1. Make sure %inc.lcssa.1 in the loop
+; exit block is correctly invalidated.
+
+define void @test2(double* %bx, i64 %by) local_unnamed_addr align 2 {
+; IR-AFTER-TRANSFORM-LABEL: @test2(
+; IR-AFTER-TRANSFORM-NOT: for.body7.1:
+
+; SCEV-EXPRS-LABEL: test2
+; SCEV-EXPRS: %inc.lcssa.1 = phi i64 [ undef, %for.body7.preheader.1 ]
+; SCEV-EXPRS-NEXT: --> undef
+entry:
+ %cmp = icmp sgt i64 %by, 0
+ br label %for.cond.preheader
+
+for.cond.preheader: ; preds = %entry
+ br i1 %cmp, label %for.cond5.preheader.lr.ph, label %for.end14
+
+for.cond5.preheader.lr.ph: ; preds = %for.cond.preheader
+ br label %for.cond5.preheader
+
+for.cond.loopexit.loopexit: ; preds = %for.body10
+ %inc11.lcssa = phi i64 [ %inc11, %for.body10 ]
+ br label %for.cond.loopexit
+
+for.cond.loopexit: ; preds = %for.cond8.preheader, %for.cond.loopexit.loopexit
+ %ca.3.lcssa = phi i64 [ %ca.2.lcssa, %for.cond8.preheader ], [ %inc11.lcssa, %for.cond.loopexit.loopexit ]
+ br i1 %cmp, label %for.cond5.preheader, label %for.end14.loopexit
+
+for.cond5.preheader: ; preds = %for.cond.loopexit, %for.cond5.preheader.lr.ph
+ %ca.19 = phi i64 [ 0, %for.cond5.preheader.lr.ph ], [ %ca.3.lcssa, %for.cond.loopexit ]
+ br i1 false, label %for.cond8.preheader, label %for.body7.preheader
+
+for.body7.preheader: ; preds = %for.cond5.preheader
+ br label %for.body7
+
+for.cond8.preheader.loopexit: ; preds = %for.body7
+ %inc.lcssa = phi i64 [ %inc, %for.body7 ]
+ br label %for.cond8.preheader
+
+for.cond8.preheader: ; preds = %for.cond8.preheader.loopexit, %for.cond5.preheader
+ %ca.2.lcssa = phi i64 [ %ca.19, %for.cond5.preheader ], [ %inc.lcssa, %for.cond8.preheader.loopexit ]
+ br i1 true, label %for.body10.preheader, label %for.cond.loopexit
+
+for.body10.preheader: ; preds = %for.cond8.preheader
+ br label %for.body10
+
+for.body7: ; preds = %for.body7, %for.body7.preheader
+ %ca.26 = phi i64 [ %inc, %for.body7 ], [ %ca.19, %for.body7.preheader ]
+ %inc = add nsw i64 %ca.26, 1
+ %arrayidx = getelementptr inbounds double, double* %bx, i64 %ca.26
+ store double 0.000000e+00, double* %arrayidx, align 8
+ br i1 false, label %for.cond8.preheader.loopexit, label %for.body7
+
+for.body10: ; preds = %for.body10, %for.body10.preheader
+ %ca.37 = phi i64 [ %inc11, %for.body10 ], [ %ca.2.lcssa, %for.body10.preheader ]
+ %inc11 = add nsw i64 %ca.37, 1
+ br i1 true, label %for.body10, label %for.cond.loopexit.loopexit
+
+for.end14.loopexit: ; preds = %for.cond.loopexit
+ br label %for.end14
+
+for.end14: ; preds = %for.end14.loopexit, %for.cond.preheader
+ br i1 %cmp, label %for.cond5.preheader.lr.ph.1, label %for.end14.1
+
+for.cond5.preheader.lr.ph.1: ; preds = %for.end14
+ br label %for.cond5.preheader.1
+
+for.cond5.preheader.1: ; preds = %for.cond.loopexit.1, %for.cond5.preheader.lr.ph.1
+ %ca.19.1 = phi i64 [ 0, %for.cond5.preheader.lr.ph.1 ], [ %ca.3.lcssa.1, %for.cond.loopexit.1 ]
+ br i1 true, label %for.cond8.preheader.1, label %for.body7.preheader.1
+
+for.body7.preheader.1: ; preds = %for.cond5.preheader.1
+ br label %for.body7.1
+
+for.body7.1: ; preds = %for.body7.1, %for.body7.preheader.1
+ %ca.26.1 = phi i64 [ %inc.1, %for.body7.1 ], [ %ca.19.1, %for.body7.preheader.1 ]
+ %inc.1 = add nsw i64 %ca.26.1, 1
+ %arrayidx.1 = getelementptr inbounds double, double* %bx, i64 %ca.26.1
+ store double 0.000000e+00, double* %arrayidx.1, align 8
+ br i1 true, label %for.cond8.preheader.loopexit.1, label %for.body7.1
+
+for.cond8.preheader.loopexit.1: ; preds = %for.body7.1
+ %inc.lcssa.1 = phi i64 [ %inc.1, %for.body7.1 ]
+ br label %for.cond8.preheader.1
+
+for.cond8.preheader.1: ; preds = %for.cond8.preheader.loopexit.1, %for.cond5.preheader.1
+ %ca.2.lcssa.1 = phi i64 [ %ca.19.1, %for.cond5.preheader.1 ], [ %inc.lcssa.1, %for.cond8.preheader.loopexit.1 ]
+ br i1 false, label %for.body10.preheader.1, label %for.cond.loopexit.1
+
+for.body10.preheader.1: ; preds = %for.cond8.preheader.1
+ br label %for.body10.1
+
+for.body10.1: ; preds = %for.body10.1, %for.body10.preheader.1
+ %ca.37.1 = phi i64 [ %inc11.1, %for.body10.1 ], [ %ca.2.lcssa.1, %for.body10.preheader.1 ]
+ %inc11.1 = add nsw i64 %ca.37.1, 1
+ br i1 false, label %for.body10.1, label %for.cond.loopexit.loopexit.1
+
+for.cond.loopexit.loopexit.1: ; preds = %for.body10.1
+ %inc11.lcssa.1 = phi i64 [ %inc11.1, %for.body10.1 ]
+ br label %for.cond.loopexit.1
+
+for.cond.loopexit.1: ; preds = %for.cond.loopexit.loopexit.1, %for.cond8.preheader.1
+ %ca.3.lcssa.1 = phi i64 [ %ca.2.lcssa.1, %for.cond8.preheader.1 ], [ %inc11.lcssa.1, %for.cond.loopexit.loopexit.1 ]
+ br i1 %cmp, label %for.cond5.preheader.1, label %for.end14.loopexit.1
+
+for.end14.loopexit.1: ; preds = %for.cond.loopexit.1
+ br label %for.end14.1
+
+for.end14.1: ; preds = %for.end14.loopexit.1, %for.end14
+ ret void
+}
More information about the llvm-commits
mailing list