[llvm-branch-commits] [llvm] release/23.x: [LoopInterchange] Prevent the transformation stage from stopping partway (#205564) (PR #212762)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Jul 29 06:08:33 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: llvmbot
<details>
<summary>Changes</summary>
Backport ca52c1b3abbadf829598872b7dded2bca2fd50c0
Requested by: @<!-- -->kasuga-fj
---
Patch is 29.82 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/212762.diff
9 Files Affected:
- (modified) llvm/lib/Transforms/Scalar/LoopInterchange.cpp (+20-39)
- (modified) llvm/test/Transforms/LoopInterchange/guarded-inner-loop.ll (+11-9)
- (modified) llvm/test/Transforms/LoopInterchange/interchanged-loop-nest-3.ll (+11-13)
- (modified) llvm/test/Transforms/LoopInterchange/lcssa-incoming-value-is-not-instr.ll (+3-1)
- (modified) llvm/test/Transforms/LoopInterchange/pr43326-ideal-access-pattern.ll (+12-14)
- (modified) llvm/test/Transforms/LoopInterchange/pr57148.ll (+18-14)
- (modified) llvm/test/Transforms/LoopInterchange/reduction-extra-use-in-inner-loop.ll (+7-5)
- (modified) llvm/test/Transforms/LoopInterchange/reduction-not-involve-innermost.ll (+4-2)
- (modified) llvm/test/Transforms/LoopInterchange/transform-stop-partway.ll (+15-19)
``````````diff
diff --git a/llvm/lib/Transforms/Scalar/LoopInterchange.cpp b/llvm/lib/Transforms/Scalar/LoopInterchange.cpp
index 938b5137f6284..c79bf04df656a 100644
--- a/llvm/lib/Transforms/Scalar/LoopInterchange.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopInterchange.cpp
@@ -627,7 +627,7 @@ class LoopInterchangeTransform {
: OuterLoop(Outer), InnerLoop(Inner), SE(SE), LI(LI), DT(DT), LIL(LIL) {}
/// Interchange OuterLoop and InnerLoop.
- bool transform(ArrayRef<Instruction *> DropNoWrapInsts,
+ void transform(ArrayRef<Instruction *> DropNoWrapInsts,
ArrayRef<Instruction *> DropNoInfInsts);
void reduction2Memory();
void restructureLoops(Loop *NewInner, Loop *NewOuter,
@@ -636,8 +636,8 @@ class LoopInterchangeTransform {
void removeChildLoop(Loop *OuterLoop, Loop *InnerLoop);
private:
- bool adjustLoopLinks();
- bool adjustLoopBranches();
+ void adjustLoopLinks();
+ void adjustLoopBranches();
Loop *OuterLoop;
Loop *InnerLoop;
@@ -2103,10 +2103,9 @@ void LoopInterchangeTransform::reduction2Memory() {
SR.LcssaStore->moveAfter(dyn_cast<Instruction>(SR.Next));
}
-bool LoopInterchangeTransform::transform(
+void LoopInterchangeTransform::transform(
ArrayRef<Instruction *> DropNoWrapInsts,
ArrayRef<Instruction *> DropNoInfInsts) {
- bool Transformed = false;
ArrayRef<LoopInterchangeLegality::InnerReduction> InnerReductions =
LIL.getInnerReductions();
@@ -2182,13 +2181,10 @@ bool LoopInterchangeTransform::transform(
WorkList.insert(cast<Instruction>(InnerIndexVar));
MoveInstructions();
- // Ensure the inner loop phi nodes have a separate basic block.
+ // Split the inner header so that it has a unique successor.
BasicBlock *InnerLoopHeader = InnerLoop->getHeader();
- if (&*InnerLoopHeader->getFirstNonPHIIt() !=
- InnerLoopHeader->getTerminator()) {
- SplitBlock(InnerLoopHeader, InnerLoopHeader->getFirstNonPHIIt(), DT, LI);
- LLVM_DEBUG(dbgs() << "splitting InnerLoopHeader done\n");
- }
+ SplitBlock(InnerLoopHeader, InnerLoopHeader->getFirstNonPHIIt(), DT, LI);
+ LLVM_DEBUG(dbgs() << "splitting InnerLoopHeader done\n");
// Instructions in the original inner loop preheader may depend on values
// defined in the outer loop header. Move them there, because the original
@@ -2212,11 +2208,7 @@ bool LoopInterchangeTransform::transform(
I.moveBeforePreserving(OuterLoopHeader->getTerminator()->getIterator());
}
- Transformed |= adjustLoopLinks();
- if (!Transformed) {
- LLVM_DEBUG(dbgs() << "adjustLoopLinks failed\n");
- return false;
- }
+ adjustLoopLinks();
// Finally, drop the nsw/nuw/ninf flags from the instructions for reduction
// calculations.
@@ -2226,8 +2218,6 @@ bool LoopInterchangeTransform::transform(
}
for (Instruction *I : DropNoInfInsts)
I->setHasNoInfs(false);
-
- return true;
}
/// \brief Move all instructions except the terminator from FromBB right before
@@ -2434,7 +2424,7 @@ static void simplifyLCSSAPhis(Loop *OuterLoop, Loop *InnerLoop) {
}
}
-bool LoopInterchangeTransform::adjustLoopBranches() {
+void LoopInterchangeTransform::adjustLoopBranches() {
LLVM_DEBUG(dbgs() << "adjustLoopBranches called\n");
std::vector<DominatorTree::UpdateType> DTUpdates;
@@ -2487,13 +2477,8 @@ bool LoopInterchangeTransform::adjustLoopBranches() {
Instruction *OuterLoopPredecessorBI = OuterLoopPredecessor->getTerminator();
BasicBlock *InnerLoopHeaderSuccessor = InnerLoopHeader->getUniqueSuccessor();
-
- // FIXME: IR modification should not stop partway through.
- if (!InnerLoopHeaderSuccessor) {
- LLVM_DEBUG(
- dbgs() << "Inner loop header does not have a unique successor\n");
- return false;
- }
+ assert(InnerLoopHeaderSuccessor &&
+ "Failed to find a unique successor for the inner loop header");
// Adjust Loop Preheader and headers.
// The branches in the outer loop predecessor and the outer loop header can
@@ -2590,22 +2575,18 @@ bool LoopInterchangeTransform::adjustLoopBranches() {
make_range(OuterLoopHeader->begin(), std::prev(OuterLoopHeader->end())))
MayNeedLCSSAPhis.push_back(&I);
formLCSSAForInstructions(MayNeedLCSSAPhis, *DT, *LI, SE);
-
- return true;
}
-bool LoopInterchangeTransform::adjustLoopLinks() {
+void LoopInterchangeTransform::adjustLoopLinks() {
// Adjust all branches in the inner and outer loop.
- bool Changed = adjustLoopBranches();
- if (Changed) {
- // We have interchanged the preheaders so we need to interchange the data in
- // the preheaders as well. This is because the content of the inner
- // preheader was previously executed inside the outer loop.
- BasicBlock *OuterLoopPreHeader = OuterLoop->getLoopPreheader();
- BasicBlock *InnerLoopPreHeader = InnerLoop->getLoopPreheader();
- swapBBContents(OuterLoopPreHeader, InnerLoopPreHeader);
- }
- return Changed;
+ adjustLoopBranches();
+
+ // We have interchanged the preheaders so we need to interchange the data in
+ // the preheaders as well. This is because the content of the inner
+ // preheader was previously executed inside the outer loop.
+ BasicBlock *OuterLoopPreHeader = OuterLoop->getLoopPreheader();
+ BasicBlock *InnerLoopPreHeader = InnerLoop->getLoopPreheader();
+ swapBBContents(OuterLoopPreHeader, InnerLoopPreHeader);
}
PreservedAnalyses LoopInterchangePass::run(LoopNest &LN,
diff --git a/llvm/test/Transforms/LoopInterchange/guarded-inner-loop.ll b/llvm/test/Transforms/LoopInterchange/guarded-inner-loop.ll
index ec12ff2878743..f71bad815cf48 100644
--- a/llvm/test/Transforms/LoopInterchange/guarded-inner-loop.ll
+++ b/llvm/test/Transforms/LoopInterchange/guarded-inner-loop.ll
@@ -23,19 +23,21 @@ define i32 @main() {
; CHECK-LABEL: define i32 @main() {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: br label %[[FOR_I_PREHEADER:.*]]
-; CHECK: [[FOR_I_PREHEADER]]:
+; CHECK: [[FOR_I_PREHEADER1:.*]]:
; CHECK-NEXT: br label %[[FOR_I:.*]]
; CHECK: [[FOR_I]]:
-; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], %[[FOR_I_INC:.*]] ], [ 0, %[[FOR_I_PREHEADER]] ]
+; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], %[[FOR_J_INC_SPLIT:.*]] ], [ 0, %[[FOR_I_PREHEADER1]] ]
; CHECK-NEXT: [[I_IS_ZERO:%.*]] = icmp eq i32 [[I]], 0
; CHECK-NEXT: [[XBASE:%.*]] = getelementptr [9 x i32], ptr @x, i32 [[I]]
; CHECK-NEXT: [[WBASE:%.*]] = getelementptr [9 x i32], ptr @w, i32 [[I]]
; CHECK-NEXT: [[YBASE:%.*]] = getelementptr [3 x i32], ptr @y, i32 [[I]]
; CHECK-NEXT: br label %[[FOR_J_PREHEADER:.*]]
-; CHECK: [[FOR_J_PREHEADER]]:
+; CHECK: [[FOR_I_PREHEADER]]:
; CHECK-NEXT: br label %[[FOR_J:.*]]
; CHECK: [[FOR_J]]:
-; CHECK-NEXT: [[J:%.*]] = phi i32 [ [[TMP0:%.*]], %[[FOR_J_INC_SPLIT:.*]] ], [ 0, %[[FOR_J_PREHEADER]] ]
+; CHECK-NEXT: [[J:%.*]] = phi i32 [ [[TMP0:%.*]], %[[EXIT:.*]] ], [ 0, %[[FOR_I_PREHEADER]] ]
+; CHECK-NEXT: br label %[[FOR_I_PREHEADER1]]
+; CHECK: [[FOR_J_PREHEADER]]:
; CHECK-NEXT: br i1 [[I_IS_ZERO]], label %[[FOR_J_INC:.*]], label %[[FOR_K_PH:.*]]
; CHECK: [[FOR_K_PH]]:
; CHECK-NEXT: [[XP:%.*]] = getelementptr i32, ptr [[XBASE]], i32 [[J]]
@@ -60,15 +62,15 @@ define i32 @main() {
; CHECK-NEXT: [[J_NEXT:%.*]] = add i32 [[J]], 1
; CHECK-NEXT: [[J_CMP:%.*]] = icmp eq i32 [[J]], 0
; CHECK-NEXT: br label %[[FOR_J_INC_SPLIT]]
-; CHECK: [[FOR_J_INC_SPLIT]]:
+; CHECK: [[EXIT]]:
; CHECK-NEXT: [[TMP0]] = add i32 [[J]], 1
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[J]], 0
-; CHECK-NEXT: br i1 [[TMP1]], label %[[FOR_J]], label %[[FOR_I_INC]]
-; CHECK: [[FOR_I_INC]]:
+; CHECK-NEXT: br i1 [[TMP1]], label %[[FOR_J]], label %[[FOR_I_INC:.*]]
+; CHECK: [[FOR_J_INC_SPLIT]]:
; CHECK-NEXT: [[I_NEXT]] = add i32 [[I]], 1
; CHECK-NEXT: [[I_DONE:%.*]] = icmp eq i32 [[I_NEXT]], 3
-; CHECK-NEXT: br i1 [[I_DONE]], label %[[EXIT:.*]], label %[[FOR_I]]
-; CHECK: [[EXIT]]:
+; CHECK-NEXT: br i1 [[I_DONE]], label %[[EXIT]], label %[[FOR_I]]
+; CHECK: [[FOR_I_INC]]:
; CHECK-NEXT: ret i32 0
;
entry:
diff --git a/llvm/test/Transforms/LoopInterchange/interchanged-loop-nest-3.ll b/llvm/test/Transforms/LoopInterchange/interchanged-loop-nest-3.ll
index 3cf3b02e8fd21..3d13733bf3fde 100644
--- a/llvm/test/Transforms/LoopInterchange/interchanged-loop-nest-3.ll
+++ b/llvm/test/Transforms/LoopInterchange/interchanged-loop-nest-3.ll
@@ -19,42 +19,40 @@ define void @interchange_08(i32 %t){
; CHECK-SAME: i32 [[T:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: br label %[[FOR_BODY6_PREHEADER:.*]]
-; CHECK: [[FOR_COND1_PREHEADER_PREHEADER:.*]]:
+; CHECK: [[FOR_COND4_PREHEADER_PREHEADER:.*]]:
; CHECK-NEXT: br label %[[FOR_COND1_PREHEADER:.*]]
; CHECK: [[FOR_COND1_PREHEADER]]:
-; CHECK-NEXT: [[I_028:%.*]] = phi i64 [ [[INC16:%.*]], %[[FOR_INC16:.*]] ], [ 0, %[[FOR_COND1_PREHEADER_PREHEADER]] ]
+; CHECK-NEXT: [[I_028:%.*]] = phi i64 [ [[INC16:%.*]], %[[FOR_INC16:.*]] ], [ 0, %[[FOR_COND4_PREHEADER_PREHEADER]] ]
; CHECK-NEXT: br label %[[FOR_BODY6_SPLIT1:.*]]
-; CHECK: [[FOR_COND4_PREHEADER_PREHEADER:.*]]:
+; CHECK: [[FOR_COND4_PREHEADER_PREHEADER1:.*]]:
; CHECK-NEXT: br label %[[FOR_COND4_PREHEADER:.*]]
; CHECK: [[FOR_COND4_PREHEADER]]:
-; CHECK-NEXT: [[J_027:%.*]] = phi i64 [ [[TMP3:%.*]], %[[FOR_INC12_SPLIT:.*]] ], [ 0, %[[FOR_COND4_PREHEADER_PREHEADER]] ]
-; CHECK-NEXT: br label %[[FOR_COND1_PREHEADER_PREHEADER]]
+; CHECK-NEXT: [[J_027:%.*]] = phi i64 [ [[TMP3:%.*]], %[[FOR_INC12:.*]] ], [ 0, %[[FOR_COND4_PREHEADER_PREHEADER1]] ]
+; CHECK-NEXT: br label %[[FOR_COND1_PREHEADER_PREHEADER:.*]]
; CHECK: [[FOR_BODY6_PREHEADER]]:
; CHECK-NEXT: br label %[[FOR_BODY6:.*]]
; CHECK: [[FOR_BODY6]]:
-; CHECK-NEXT: [[K_026:%.*]] = phi i64 [ [[TMP5:%.*]], %[[FOR_BODY6_SPLIT:.*]] ], [ 0, %[[FOR_BODY6_PREHEADER]] ]
+; CHECK-NEXT: [[K_026:%.*]] = phi i64 [ [[TMP5:%.*]], %[[FOR_INC12_SPLIT:.*]] ], [ 0, %[[FOR_BODY6_PREHEADER]] ]
; CHECK-NEXT: br label %[[FOR_COND4_PREHEADER_PREHEADER]]
; CHECK: [[FOR_BODY6_SPLIT1]]:
+; CHECK-NEXT: br label %[[FOR_COND4_PREHEADER_PREHEADER1]]
+; CHECK: [[FOR_COND1_PREHEADER_PREHEADER]]:
; CHECK-NEXT: [[ARRAYIDX8:%.*]] = getelementptr inbounds [100 x [100 x [100 x i32]]], ptr @D, i64 0, i64 [[K_026]], i64 [[J_027]], i64 [[I_028]]
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX8]], align 4
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP0]], [[T]]
; CHECK-NEXT: store i32 [[ADD]], ptr [[ARRAYIDX8]], align 4
; CHECK-NEXT: [[INC:%.*]] = add nuw nsw i64 [[K_026]], 1
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i64 [[INC]], 100
-; CHECK-NEXT: br label %[[FOR_INC12:.*]]
-; CHECK: [[FOR_INC15:.*]]:
+; CHECK-NEXT: br label %[[FOR_INC12]]
+; CHECK: [[FOR_BODY6_SPLIT:.*]]:
; CHECK-NEXT: [[TMP1:%.*]] = add nuw nsw i64 [[K_026]], 1
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 100
; CHECK-NEXT: br label %[[FOR_INC16]]
-; CHECK: [[FOR_BODY6_SPLIT]]:
+; CHECK: [[FOR_INC12_SPLIT]]:
; CHECK-NEXT: [[TMP5]] = add nuw nsw i64 [[K_026]], 1
; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[TMP5]], 100
; CHECK-NEXT: br i1 [[TMP6]], label %[[FOR_END17:.*]], label %[[FOR_BODY6]]
; CHECK: [[FOR_INC12]]:
-; CHECK-NEXT: [[INC13:%.*]] = add nuw nsw i64 [[J_027]], 1
-; CHECK-NEXT: [[EXITCOND29:%.*]] = icmp eq i64 [[INC13]], 100
-; CHECK-NEXT: br label %[[FOR_INC15]]
-; CHECK: [[FOR_INC12_SPLIT]]:
; CHECK-NEXT: [[TMP3]] = add nuw nsw i64 [[J_027]], 1
; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[TMP3]], 100
; CHECK-NEXT: br i1 [[TMP4]], label %[[FOR_BODY6_SPLIT]], label %[[FOR_COND4_PREHEADER]]
diff --git a/llvm/test/Transforms/LoopInterchange/lcssa-incoming-value-is-not-instr.ll b/llvm/test/Transforms/LoopInterchange/lcssa-incoming-value-is-not-instr.ll
index b0abe98b5f5d7..3397e4295c933 100644
--- a/llvm/test/Transforms/LoopInterchange/lcssa-incoming-value-is-not-instr.ll
+++ b/llvm/test/Transforms/LoopInterchange/lcssa-incoming-value-is-not-instr.ll
@@ -82,7 +82,9 @@ define i32 @g() {
; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[TMP1:%.*]], %[[INNER_LATCH_SPLIT:.*]] ], [ 0, %[[INNER_HEADER_PREHEADER]] ]
; CHECK-NEXT: br label %[[OUTER_HEADER_PREHEADER]]
; CHECK: [[INNER_LATCH]]:
-; CHECK-NEXT: [[X:%.*]] = phi i32 [ 42, %[[OUTER_HEADER]] ]
+; CHECK-NEXT: br label %[[INNER_LATCH1:.*]]
+; CHECK: [[INNER_LATCH1]]:
+; CHECK-NEXT: [[X:%.*]] = phi i32 [ 42, %[[INNER_LATCH]] ]
; CHECK-NEXT: [[J_NEXT:%.*]] = add i64 [[J]], 1
; CHECK-NEXT: [[EC_J:%.*]] = icmp eq i64 [[J_NEXT]], 2
; CHECK-NEXT: br label %[[INNER_EXIT:.*]]
diff --git a/llvm/test/Transforms/LoopInterchange/pr43326-ideal-access-pattern.ll b/llvm/test/Transforms/LoopInterchange/pr43326-ideal-access-pattern.ll
index d3bccaff36c26..48cc2ebd7102f 100644
--- a/llvm/test/Transforms/LoopInterchange/pr43326-ideal-access-pattern.ll
+++ b/llvm/test/Transforms/LoopInterchange/pr43326-ideal-access-pattern.ll
@@ -18,36 +18,34 @@ define void @pr43326-triply-nested(ptr noalias %e, ptr noalias %f) {
; CHECK-SAME: ptr noalias [[E:%.*]], ptr noalias [[F:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: br label %[[FOR_INNERMOST_PREHEADER:.*]]
-; CHECK: [[FOR_OUTERMOST_HEADER_PREHEADER:.*]]:
+; CHECK: [[FOR_MIDDLE_HEADER_PREHEADER:.*]]:
; CHECK-NEXT: br label %[[FOR_OUTERMOST_HEADER:.*]]
; CHECK: [[FOR_OUTERMOST_HEADER]]:
-; CHECK-NEXT: [[INDVARS_OUTERMOST:%.*]] = phi i64 [ [[INDVARS_OUTERMOST_NEXT:%.*]], %[[FOR_OUTERMOST_LATCH:.*]] ], [ 0, %[[FOR_OUTERMOST_HEADER_PREHEADER]] ]
+; CHECK-NEXT: [[INDVARS_OUTERMOST:%.*]] = phi i64 [ [[INDVARS_OUTERMOST_NEXT:%.*]], %[[FOR_OUTERMOST_LATCH:.*]] ], [ 0, %[[FOR_MIDDLE_HEADER_PREHEADER]] ]
; CHECK-NEXT: br label %[[FOR_INNERMOST_SPLIT1:.*]]
-; CHECK: [[FOR_MIDDLE_HEADER_PREHEADER:.*]]:
+; CHECK: [[FOR_MIDDLE_HEADER_PREHEADER1:.*]]:
; CHECK-NEXT: br label %[[FOR_MIDDLE_HEADER:.*]]
; CHECK: [[FOR_COND_CLEANUP:.*]]:
; CHECK-NEXT: ret void
; CHECK: [[FOR_MIDDLE_HEADER]]:
-; CHECK-NEXT: [[INDVARS_MIDDLE:%.*]] = phi i64 [ [[TMP0:%.*]], %[[FOR_MIDDLE_LATCH_SPLIT:.*]] ], [ 0, %[[FOR_MIDDLE_HEADER_PREHEADER]] ]
-; CHECK-NEXT: br label %[[FOR_OUTERMOST_HEADER_PREHEADER]]
+; CHECK-NEXT: [[INDVARS_MIDDLE:%.*]] = phi i64 [ [[TMP0:%.*]], %[[FOR_MIDDLE_LATCH:.*]] ], [ 0, %[[FOR_MIDDLE_HEADER_PREHEADER1]] ]
+; CHECK-NEXT: br label %[[FOR_OUTERMOST_HEADER_PREHEADER:.*]]
; CHECK: [[FOR_INNERMOST_PREHEADER]]:
; CHECK-NEXT: br label %[[FOR_INNERMOST:.*]]
; CHECK: [[FOR_OUTERMOST_LATCH]]:
; CHECK-NEXT: [[INDVARS_OUTERMOST_NEXT]] = add nuw nsw i64 [[INDVARS_OUTERMOST]], 1
; CHECK-NEXT: [[EXITCOND_OUTERMOST:%.*]] = icmp ne i64 [[INDVARS_OUTERMOST_NEXT]], 10
-; CHECK-NEXT: br i1 [[EXITCOND_OUTERMOST]], label %[[FOR_OUTERMOST_HEADER]], label %[[FOR_MIDDLE_LATCH_SPLIT]]
-; CHECK: [[FOR_MIDDLE_LATCH:.*]]:
-; CHECK-NEXT: [[INDVARS_MIDDLE_NEXT:%.*]] = add nuw nsw i64 [[INDVARS_MIDDLE]], 1
-; CHECK-NEXT: [[EXITCOND_MIDDLE:%.*]] = icmp ne i64 [[INDVARS_MIDDLE_NEXT]], 10
-; CHECK-NEXT: br label %[[FOR_INNERMOST_SPLIT:.*]]
-; CHECK: [[FOR_MIDDLE_LATCH_SPLIT]]:
+; CHECK-NEXT: br i1 [[EXITCOND_OUTERMOST]], label %[[FOR_OUTERMOST_HEADER]], label %[[FOR_MIDDLE_LATCH_SPLIT:.*]]
+; CHECK: [[FOR_MIDDLE_LATCH]]:
; CHECK-NEXT: [[TMP0]] = add nuw nsw i64 [[INDVARS_MIDDLE]], 1
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[TMP0]], 10
; CHECK-NEXT: br i1 [[TMP1]], label %[[FOR_MIDDLE_HEADER]], label %[[FOR_INNERMOST_SPLIT_SPLIT:.*]]
; CHECK: [[FOR_INNERMOST]]:
-; CHECK-NEXT: [[INDVARS_INNERMOST:%.*]] = phi i64 [ [[TMP5:%.*]], %[[FOR_INNERMOST_SPLIT_SPLIT]] ], [ 0, %[[FOR_INNERMOST_PREHEADER]] ]
+; CHECK-NEXT: [[INDVARS_INNERMOST:%.*]] = phi i64 [ [[TMP5:%.*]], %[[FOR_MIDDLE_LATCH_SPLIT]] ], [ 0, %[[FOR_INNERMOST_PREHEADER]] ]
; CHECK-NEXT: br label %[[FOR_MIDDLE_HEADER_PREHEADER]]
; CHECK: [[FOR_INNERMOST_SPLIT1]]:
+; CHECK-NEXT: br label %[[FOR_MIDDLE_HEADER_PREHEADER1]]
+; CHECK: [[FOR_OUTERMOST_HEADER_PREHEADER]]:
; CHECK-NEXT: [[ARRAYIDX12:%.*]] = getelementptr inbounds [10 x [10 x i32]], ptr [[E]], i64 [[INDVARS_INNERMOST]], i64 [[INDVARS_MIDDLE]], i64 [[INDVARS_OUTERMOST]]
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX12]], align 4
; CHECK-NEXT: [[ARRAYIDX18:%.*]] = getelementptr inbounds [10 x [10 x i32]], ptr [[F]], i64 [[INDVARS_INNERMOST]], i64 [[INDVARS_MIDDLE]], i64 [[INDVARS_OUTERMOST]]
@@ -55,11 +53,11 @@ define void @pr43326-triply-nested(ptr noalias %e, ptr noalias %f) {
; CHECK-NEXT: [[INDVARS_INNERMOST_NEXT:%.*]] = add nuw nsw i64 [[INDVARS_INNERMOST]], 1
; CHECK-NEXT: [[EXITCOND_INNERMOST:%.*]] = icmp ne i64 [[INDVARS_INNERMOST_NEXT]], 10
; CHECK-NEXT: br label %[[FOR_MIDDLE_LATCH]]
-; CHECK: [[FOR_INNERMOST_SPLIT]]:
+; CHECK: [[FOR_INNERMOST_SPLIT_SPLIT]]:
; CHECK-NEXT: [[TMP3:%.*]] = add nuw nsw i64 [[INDVARS_INNERMOST]], 1
; CHECK-NEXT: [[TMP4:%.*]] = icmp ne i64 [[TMP3]], 10
; CHECK-NEXT: br label %[[FOR_OUTERMOST_LATCH]]
-; CHECK: [[FOR_INNERMOST_SPLIT_SPLIT]]:
+; CHECK: [[FOR_MIDDLE_LATCH_SPLIT]]:
; CHECK-NEXT: [[TMP5]] = add nuw nsw i64 [[INDVARS_INNERMOST]], 1
; CHECK-NEXT: [[TMP6:%.*]] = icmp ne i64 [[TMP5]], 10
; CHECK-NEXT: br i1 [[TMP6]], label %[[FOR_INNERMOST]], label %[[FOR_COND_CLEANUP]]
diff --git a/llvm/test/Transforms/LoopInterchange/pr57148.ll b/llvm/test/Transforms/LoopInterchange/pr57148.ll
index 2a1a21c57bfe7..37e01a07b00d6 100644
--- a/llvm/test/Transforms/LoopInterchange/pr57148.ll
+++ b/llvm/test/Transforms/LoopInterchange/pr57148.ll
@@ -25,16 +25,18 @@ define void @test1() {
; CHECK-NEXT: [[J_010:%.*]] = phi i16 [ [[TMP3:%.*]], %[[FOR_END67:.*]] ], [ 0, %[[FOR_BODY42_SPLIT1]] ]
; CHECK-NEXT: br label %[[FOR_COND33_PREHEADER_PREHEADER]]
; CHECK: [[FOR_COND37_PREHEADER]]:
-; CHECK-NEXT: [[K_09:%.*]] = phi i16 [ -512, %[[FOR_BODY42]] ], [ [[TMP1:%.*]], %[[FOR_COND37_PREHEADER]] ]
+; CHECK-NEXT: br label %[[FOR_BODY43:.*]]
+; CHECK: [[FOR_BODY43]]:
+; CHECK-NEXT: [[K_09:%.*]] = phi i16 [ -512, %[[FOR_COND37_PREHEADER]] ], [ [[TMP1:%.*]], %[[FOR_BODY43]] ]
; CHECK-NEXT: [[SUB51:%.*]] = add nsw i16 [[K_09]], 512
; CHECK-NEXT: [[ARRAYIDX55:%.*]] = getelementptr inbounds [512 x [4 x i32]], ptr @b, i16 0, i16 [[SUB51]], i16 [[J_010]]
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX55]], align 1
; CHECK-NEXT: [[ADD61:%.*]] = add i32 undef, undef
; CHECK-NEXT: [[TMP1]] = add nsw i16 [[K_09]], 1
; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i16 [[K_09]], 42
-; CHECK-NEXT: br i1 [[TMP2]], label %[[FOR_COND37_PREHEADER]], label %[[FOR_END64:.*]]
+; CHECK-NEXT: br i1 [[TMP2]], label %[[FOR_BODY43]], label %[[FOR_END64:.*]]
; CHECK: [[FOR_END64]]:
-; CHECK-NEXT: [[ADD61_LCSSA_LCSSA:%.*]] = phi i32 [ [[ADD61]], %[[FOR_COND37_PREHEADER]] ]
+; CHECK-NEXT: [[ADD61_LCSSA_LCSSA:%.*]] = phi i32 [ [[ADD61]], %[[FOR_BODY43]] ]
; CHECK-NEXT: store i32 [[ADD61_LCSSA_LCSSA]], ptr undef, align 1
; CHECK-NEXT: [[INC66:%.*]] = add nuw nsw i16 [[J_010]], 1
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i16 [[J_010]], 43
@@ -185,27 +187,29 @@ define void @test3() {
; CHECK: [[FOR_BODY42]]:
; CHECK-NEXT: [[I_011:%.*]] = phi i16 [ [[INC69:%.*]], %[[FOR_END68:.*]] ], [ 0, %[[FOR_COND33_PREHEADER_PREHEADER]] ]
; CHECK-NEXT: br label %[[FOR_COND38_PREHEADER:.*]]
-; CHECK: [[FOR_BODY42_PREHEADER:.*]]:
-; CHECK-NEXT: br label %[[FOR_COND37_PREHEADER:.*]]
; CHECK: [[FOR_BODY42_SPLIT1]]:
+; CHECK-NEXT: br label %[[FOR_COND37_PREHEADER:.*]]
+; CHECK: [[FOR_COND37_PREHEADER]]:
+; CHECK-NEXT: [[J_010:%.*]] = phi i16 [ [[TMP5:%.*]], %[[FOR_END67:.*]] ], [ 0, %[[FOR_BODY42_SPLIT1]] ]
; CHECK-NEXT: br label %[[FOR_COND38_PREHEADER_PREHEADER:.*]]
; CHECK: [[FOR_COND38_PREHEADER_PREHEADER]]:
-; CHECK-NEXT: [[J_010:%.*]] = phi i16 [ [[TMP5:%.*]], %[[FOR_END67:.*]] ], [ 0, %[[FOR_BODY42_SPLIT1]] ]
-; CHECK-NEXT: br label %[[FOR_BODY42_PREHEADER]]
-; CHECK: [[FOR_COND37_PREHEADER]]:
-; CHECK-NEXT: [[K_010:%.*]] = phi i16 [ [[TMP1:%.*]], %[[FOR_END64:.*]] ], [ 0, %[[FOR_BODY42_PREHEADER]] ]
+; CHECK-NEXT: br label %[[FOR_BODY42_PREHEADER:.*]]
+; CHECK: ...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/212762
More information about the llvm-branch-commits
mailing list