Skip to content

Commit 01beb62

Browse files
committed
review comments:
- create Int32Ty once - use poison instead of undef - single quotes in lit tests - the check for loop exit is actually very trivial
1 parent b60259d commit 01beb62

File tree

15 files changed

+69
-77
lines changed

15 files changed

+69
-77
lines changed

llvm/include/llvm/Transforms/Utils/ControlFlowUtils.h

+2
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ struct ControlFlowHub {
105105
};
106106

107107
void addBranch(BasicBlock *BB, BasicBlock *Succ0, BasicBlock *Succ1) {
108+
assert(BB);
109+
assert(Succ0 || Succ1);
108110
Branches.emplace_back(BB, Succ0, Succ1);
109111
}
110112

llvm/lib/Transforms/Utils/ControlFlowUtils.cpp

+12-11
Original file line numberDiff line numberDiff line change
@@ -89,27 +89,28 @@ static void calcPredicateUsingInteger(ArrayRef<EdgeDescriptor> Branches,
8989
BBPredicates &GuardPredicates) {
9090
LLVMContext &Context = GuardBlocks.front()->getContext();
9191
BasicBlock *FirstGuardBlock = GuardBlocks.front();
92+
Type *Int32Ty = Type::getInt32Ty(Context);
9293

93-
auto *Phi = PHINode::Create(Type::getInt32Ty(Context), Branches.size(),
94-
"merged.bb.idx", FirstGuardBlock);
94+
auto *Phi = PHINode::Create(Int32Ty, Branches.size(), "merged.bb.idx",
95+
FirstGuardBlock);
9596

9697
for (auto [BB, Succ0, Succ1] : Branches) {
9798
Value *Condition = redirectToHub(BB, Succ0, Succ1, FirstGuardBlock);
9899
Value *IncomingId = nullptr;
99100
if (Succ0 && Succ1) {
100101
auto Succ0Iter = find(Outgoing, Succ0);
101102
auto Succ1Iter = find(Outgoing, Succ1);
102-
Value *Id0 = ConstantInt::get(Type::getInt32Ty(Context),
103-
std::distance(Outgoing.begin(), Succ0Iter));
104-
Value *Id1 = ConstantInt::get(Type::getInt32Ty(Context),
105-
std::distance(Outgoing.begin(), Succ1Iter));
103+
Value *Id0 =
104+
ConstantInt::get(Int32Ty, std::distance(Outgoing.begin(), Succ0Iter));
105+
Value *Id1 =
106+
ConstantInt::get(Int32Ty, std::distance(Outgoing.begin(), Succ1Iter));
106107
IncomingId = SelectInst::Create(Condition, Id0, Id1, "target.bb.idx",
107108
BB->getTerminator()->getIterator());
108109
} else {
109110
// Get the index of the non-null successor.
110111
auto SuccIter = Succ0 ? find(Outgoing, Succ0) : find(Outgoing, Succ1);
111-
IncomingId = ConstantInt::get(Type::getInt32Ty(Context),
112-
std::distance(Outgoing.begin(), SuccIter));
112+
IncomingId =
113+
ConstantInt::get(Int32Ty, std::distance(Outgoing.begin(), SuccIter));
113114
}
114115
Phi->addIncoming(IncomingId, BB);
115116
}
@@ -119,7 +120,7 @@ static void calcPredicateUsingInteger(ArrayRef<EdgeDescriptor> Branches,
119120
LLVM_DEBUG(dbgs() << "Creating integer guard for " << Out->getName()
120121
<< "\n");
121122
auto *Cmp = ICmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ, Phi,
122-
ConstantInt::get(Type::getInt32Ty(Context), I),
123+
ConstantInt::get(Int32Ty, I),
123124
Out->getName() + ".predicate", GuardBlocks[I]);
124125
GuardPredicates[Out] = Cmp;
125126
}
@@ -244,7 +245,7 @@ static void reconnectPhis(BasicBlock *Out, BasicBlock *GuardBlock,
244245
Phi->getName() + ".moved", FirstGuardBlock->begin());
245246
bool AllUndef = true;
246247
for (auto [BB, Succ0, Succ1] : Incoming) {
247-
Value *V = UndefValue::get(Phi->getType());
248+
Value *V = PoisonValue::get(Phi->getType());
248249
if (BB == Out) {
249250
V = NewPhi;
250251
} else if (Phi->getBasicBlockIndex(BB) != -1) {
@@ -257,7 +258,7 @@ static void reconnectPhis(BasicBlock *Out, BasicBlock *GuardBlock,
257258
Value *NewV = NewPhi;
258259
if (AllUndef) {
259260
NewPhi->eraseFromParent();
260-
NewV = UndefValue::get(Phi->getType());
261+
NewV = PoisonValue::get(Phi->getType());
261262
}
262263
if (Phi->getNumOperands() == 0) {
263264
Phi->replaceAllUsesWith(NewV);

llvm/lib/Transforms/Utils/FixIrreducible.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ static void createNaturalLoopInternal(LoopInfo &LI, DominatorTree &DT,
199199
Succ1 = Succ1 && Headers.count(Succ1) ? Succ1 : nullptr;
200200
CHub.addBranch(P, Succ0, Succ1);
201201

202-
LLVM_DEBUG(dbgs() << "Added internal branch: " << P->getName() << " -> "
202+
LLVM_DEBUG(dbgs() << "Added branch: " << P->getName() << " -> "
203203
<< (Succ0 ? Succ0->getName() : "") << " "
204204
<< (Succ1 ? Succ1->getName() : "") << "\n");
205205
}

llvm/lib/Transforms/Utils/UnifyLoopExits.cpp

+8-14
Original file line numberDiff line numberDiff line change
@@ -141,13 +141,6 @@ static void restoreSSA(const DominatorTree &DT, const Loop *L,
141141
}
142142
}
143143

144-
static bool isExitBlock(Loop *L, BasicBlock *Succ, LoopInfo &LI) {
145-
Loop *SL = LI.getLoopFor(Succ);
146-
if (SL == L || L->contains(SL))
147-
return false;
148-
return true;
149-
}
150-
151144
static bool unifyLoopExits(DominatorTree &DT, LoopInfo &LI, Loop *L) {
152145
// To unify the loop exits, we need a list of the exiting blocks as
153146
// well as exit blocks. The functions for locating these lists both
@@ -162,16 +155,16 @@ static bool unifyLoopExits(DominatorTree &DT, LoopInfo &LI, Loop *L) {
162155
for (auto *BB : ExitingBlocks) {
163156
auto *Branch = cast<BranchInst>(BB->getTerminator());
164157
BasicBlock *Succ0 = Branch->getSuccessor(0);
165-
Succ0 = isExitBlock(L, Succ0, LI) ? Succ0 : nullptr;
158+
Succ0 = L->contains(Succ0) ? nullptr : Succ0;
166159

167160
BasicBlock *Succ1 =
168161
Branch->isUnconditional() ? nullptr : Branch->getSuccessor(1);
169-
Succ1 = Succ1 && isExitBlock(L, Succ1, LI) ? Succ1 : nullptr;
162+
Succ1 = L->contains(Succ1) ? nullptr : Succ1;
170163
CHub.addBranch(BB, Succ0, Succ1);
171164

172-
LLVM_DEBUG(dbgs() << "Added internal branch: " << BB->getName() << " -> "
173-
<< (Succ0 ? Succ0->getName() : "") << " "
174-
<< (Succ1 ? Succ1->getName() : "") << "\n");
165+
LLVM_DEBUG(dbgs() << "Added exiting branch: " << BB->getName() << " -> {"
166+
<< (Succ0 ? Succ0->getName() : "<none>") << ", "
167+
<< (Succ1 ? Succ1->getName() : "<none>") << "}\n");
175168
}
176169

177170
SmallVector<BasicBlock *, 8> GuardBlocks;
@@ -209,8 +202,7 @@ static bool runImpl(LoopInfo &LI, DominatorTree &DT) {
209202
bool Changed = false;
210203
auto Loops = LI.getLoopsInPreorder();
211204
for (auto *L : Loops) {
212-
LLVM_DEBUG(dbgs() << "Loop: " << L->getHeader()->getName() << " (depth: "
213-
<< LI.getLoopDepth(L->getHeader()) << ")\n");
205+
LLVM_DEBUG(dbgs() << "Processing loop:\n"; L->print(dbgs()));
214206
Changed |= unifyLoopExits(DT, LI, L);
215207
}
216208
return Changed;
@@ -231,6 +223,8 @@ namespace llvm {
231223

232224
PreservedAnalyses UnifyLoopExitsPass::run(Function &F,
233225
FunctionAnalysisManager &AM) {
226+
LLVM_DEBUG(dbgs() << "===== Unifying loop exits in function " << F.getName()
227+
<< "\n");
234228
auto &LI = AM.getResult<LoopAnalysis>(F);
235229
auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
236230

llvm/test/CodeGen/AMDGPU/exec-mask-opt-cannot-create-empty-or-backward-segment.ll

+6-7
Original file line numberDiff line numberDiff line change
@@ -74,18 +74,17 @@ define amdgpu_kernel void @cannot_create_empty_or_backwards_segment(i1 %arg, i1
7474
; CHECK-NEXT: s_cbranch_vccnz .LBB0_2
7575
; CHECK-NEXT: ; %bb.9: ; %bb13
7676
; CHECK-NEXT: ; in Loop: Header=BB0_3 Depth=1
77+
; CHECK-NEXT: s_mov_b64 s[16:17], 0
78+
; CHECK-NEXT: s_mov_b64 s[20:21], 0
7779
; CHECK-NEXT: s_mov_b64 vcc, s[6:7]
7880
; CHECK-NEXT: s_cbranch_vccz .LBB0_11
7981
; CHECK-NEXT: ; %bb.10: ; %bb16
8082
; CHECK-NEXT: ; in Loop: Header=BB0_3 Depth=1
81-
; CHECK-NEXT: s_mov_b64 s[16:17], 0
83+
; CHECK-NEXT: s_mov_b64 s[20:21], -1
8284
; CHECK-NEXT: s_mov_b64 s[22:23], s[12:13]
83-
; CHECK-NEXT: s_mov_b64 s[18:19], s[16:17]
84-
; CHECK-NEXT: s_branch .LBB0_2
85-
; CHECK-NEXT: .LBB0_11: ; in Loop: Header=BB0_3 Depth=1
86-
; CHECK-NEXT: s_mov_b64 s[20:21], 0
87-
; CHECK-NEXT: ; implicit-def: $sgpr16_sgpr17
88-
; CHECK-NEXT: s_mov_b64 s[18:19], s[16:17]
85+
; CHECK-NEXT: .LBB0_11: ; %Flow11
86+
; CHECK-NEXT: ; in Loop: Header=BB0_3 Depth=1
87+
; CHECK-NEXT: s_mov_b64 s[18:19], 0
8988
; CHECK-NEXT: s_branch .LBB0_2
9089
; CHECK-NEXT: .LBB0_12: ; %loop.exit.guard6
9190
; CHECK-NEXT: ; in Loop: Header=BB0_3 Depth=1

llvm/test/Transforms/FixIrreducible/basic.ll

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
22
; RUN: opt < %s -fix-irreducible --verify-loop-info -S | FileCheck %s
3-
; RUN: opt < %s -passes="fix-irreducible,verify<loops>" -S | FileCheck %s -check-prefix=CHECK
3+
; RUN: opt < %s -passes='fix-irreducible,verify<loops>' -S | FileCheck %s -check-prefix=CHECK
44

55
define i32 @basic(i1 %PredEntry, i1 %PredLeft, i1 %PredRight, i32 %X, i32 %Y) {
66
; CHECK-LABEL: @basic(
@@ -136,8 +136,8 @@ define i32 @separate_predecessors(i1 %PredEntry, i1 %PredA, i1 %PredB, i1 %PredC
136136
; CHECK-NEXT: [[RET:%.*]] = phi i32 [ [[C_PHI_MOVED:%.*]], [[C:%.*]] ], [ [[D_INC]], [[D:%.*]] ]
137137
; CHECK-NEXT: ret i32 [[RET]]
138138
; CHECK: irr.guard:
139-
; CHECK-NEXT: [[D_PHI_MOVED]] = phi i32 [ [[D_PHI_MOVED]], [[D]] ], [ undef, [[A]] ], [ [[C_PHI_MOVED]], [[C]] ], [ [[Y:%.*]], [[B]] ]
140-
; CHECK-NEXT: [[C_PHI_MOVED]] = phi i32 [ [[D_INC]], [[D]] ], [ [[X]], [[A]] ], [ [[C_PHI_MOVED]], [[C]] ], [ undef, [[B]] ]
139+
; CHECK-NEXT: [[D_PHI_MOVED]] = phi i32 [ [[D_PHI_MOVED]], [[D]] ], [ poison, [[A]] ], [ [[C_PHI_MOVED]], [[C]] ], [ [[Y:%.*]], [[B]] ]
140+
; CHECK-NEXT: [[C_PHI_MOVED]] = phi i32 [ [[D_INC]], [[D]] ], [ [[X]], [[A]] ], [ [[C_PHI_MOVED]], [[C]] ], [ poison, [[B]] ]
141141
; CHECK-NEXT: [[GUARD_C:%.*]] = phi i1 [ true, [[D]] ], [ true, [[A]] ], [ false, [[C]] ], [ false, [[B]] ]
142142
; CHECK-NEXT: br i1 [[GUARD_C]], label [[C]], label [[D]]
143143
;
@@ -237,7 +237,7 @@ define i32 @hidden_nodes(i1 %PredEntry, i1 %PredA, i1 %PredB, i1 %PredC, i1 %Pre
237237
; CHECK: exit:
238238
; CHECK-NEXT: ret i32 [[B_PHI_MOVED]]
239239
; CHECK: irr.guard:
240-
; CHECK-NEXT: [[B_PHI_MOVED]] = phi i32 [ undef, [[E]] ], [ [[Y:%.*]], [[ENTRY:%.*]] ], [ [[A_INC]], [[A:%.*]] ]
240+
; CHECK-NEXT: [[B_PHI_MOVED]] = phi i32 [ poison, [[E]] ], [ [[Y:%.*]], [[ENTRY:%.*]] ], [ [[A_INC]], [[A:%.*]] ]
241241
; CHECK-NEXT: [[A_PHI_MOVED]] = phi i32 [ [[C_INC]], [[E]] ], [ [[X:%.*]], [[ENTRY]] ], [ [[A_PHI_MOVED]], [[A]] ]
242242
; CHECK-NEXT: [[GUARD_A:%.*]] = phi i1 [ true, [[E]] ], [ [[PREDENTRY:%.*]], [[ENTRY]] ], [ false, [[A]] ]
243243
; CHECK-NEXT: br i1 [[GUARD_A]], label [[A]], label [[B:%.*]]

llvm/test/Transforms/FixIrreducible/bug45623.ll

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
22
; RUN: opt < %s -fix-irreducible --verify-loop-info -S | FileCheck %s
3-
; RUN: opt < %s -passes="fix-irreducible,verify<loops>" -S | FileCheck %s
3+
; RUN: opt < %s -passes='fix-irreducible,verify<loops>' -S | FileCheck %s
44

55
define dso_local void @tre_tnfa_run_backtrack() {
66
; CHECK-LABEL: @tre_tnfa_run_backtrack(

llvm/test/Transforms/FixIrreducible/nested.ll

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
22
; RUN: opt < %s -fix-irreducible --verify-loop-info -S | FileCheck %s
3-
; RUN: opt < %s -passes="fix-irreducible,verify<loops>" -S | FileCheck %s
3+
; RUN: opt < %s -passes='fix-irreducible,verify<loops>' -S | FileCheck %s
44

55
define void @nested_irr_top_level(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5) {
66
; CHECK-LABEL: @nested_irr_top_level(

llvm/test/Transforms/FixIrreducible/switch.ll

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
22
; RUN: opt < %s -lowerswitch -fix-irreducible --verify-loop-info -S | FileCheck %s
3-
; RUN: opt < %s -passes="lower-switch,fix-irreducible,verify<loops>" -S | FileCheck %s
3+
; RUN: opt < %s -passes='lower-switch,fix-irreducible,verify<loops>' -S | FileCheck %s
44

55
define void @loop_1(i32 %Value, i1 %PredEntry, i1 %PredD) {
66
; CHECK-LABEL: @loop_1(

llvm/test/Transforms/FixIrreducible/unreachable.ll

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
; NOTE: Do not autogenerate
22
; RUN: opt < %s -fix-irreducible --verify-loop-info -S | FileCheck %s
3-
; RUN: opt < %s -passes="fix-irreducible,verify<loops>" -S | FileCheck %s
3+
; RUN: opt < %s -passes='fix-irreducible,verify<loops>' -S | FileCheck %s
44

55
; CHECK-LABEL: @unreachable(
66
; CHECK: entry:

llvm/test/Transforms/StructurizeCFG/workarounds/needs-unified-loop-exits.ll

+24-28
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,8 @@ define void @exiting-block(i1 %PredH1, i1 %PredB2, i1 %PredB1, i1 %PredH2) {
3737
; CHECK-NEXT: br i1 [[PREDB2_INV]], label [[L2:%.*]], label [[FLOW2:%.*]]
3838
; CHECK: Flow:
3939
; CHECK-NEXT: [[TMP2:%.*]] = phi i1 [ false, [[FLOW2]] ], [ true, [[H2]] ]
40-
; CHECK-NEXT: [[TMP3:%.*]] = phi i1 [ false, [[FLOW2]] ], [ undef, [[H2]] ]
41-
; CHECK-NEXT: [[TMP4:%.*]] = phi i1 [ [[TMP7:%.*]], [[FLOW2]] ], [ true, [[H2]] ]
42-
; CHECK-NEXT: br i1 [[TMP4]], label [[LOOP_EXIT_GUARD1:%.*]], label [[H2]]
40+
; CHECK-NEXT: [[TMP3:%.*]] = phi i1 [ [[TMP5:%.*]], [[FLOW2]] ], [ true, [[H2]] ]
41+
; CHECK-NEXT: br i1 [[TMP3]], label [[LOOP_EXIT_GUARD1:%.*]], label [[H2]]
4342
; CHECK: L2:
4443
; CHECK-NEXT: br label [[FLOW2]]
4544
; CHECK: L1:
@@ -51,18 +50,17 @@ define void @exiting-block(i1 %PredH1, i1 %PredB2, i1 %PredB1, i1 %PredH2) {
5150
; CHECK: exit:
5251
; CHECK-NEXT: ret void
5352
; CHECK: Flow5:
54-
; CHECK-NEXT: [[TMP5:%.*]] = phi i1 [ undef, [[L1:%.*]] ], [ [[TMP3]], [[LOOP_EXIT_GUARD1]] ]
55-
; CHECK-NEXT: [[TMP6:%.*]] = phi i1 [ false, [[L1]] ], [ true, [[LOOP_EXIT_GUARD1]] ]
53+
; CHECK-NEXT: [[TMP4:%.*]] = phi i1 [ false, [[L1:%.*]] ], [ true, [[LOOP_EXIT_GUARD1]] ]
5654
; CHECK-NEXT: br label [[FLOW4]]
5755
; CHECK: loop.exit.guard:
58-
; CHECK-NEXT: br i1 [[TMP8:%.*]], label [[C:%.*]], label [[EXIT]]
56+
; CHECK-NEXT: br i1 [[TMP6:%.*]], label [[C:%.*]], label [[EXIT]]
5957
; CHECK: Flow2:
60-
; CHECK-NEXT: [[TMP7]] = phi i1 [ false, [[L2]] ], [ true, [[B2]] ]
58+
; CHECK-NEXT: [[TMP5]] = phi i1 [ false, [[L2]] ], [ true, [[B2]] ]
6159
; CHECK-NEXT: br label [[FLOW]]
6260
; CHECK: Flow4:
63-
; CHECK-NEXT: [[TMP8]] = phi i1 [ [[TMP5]], [[FLOW5]] ], [ [[TMP0]], [[FLOW3]] ]
64-
; CHECK-NEXT: [[TMP9:%.*]] = phi i1 [ [[TMP6]], [[FLOW5]] ], [ true, [[FLOW3]] ]
65-
; CHECK-NEXT: br i1 [[TMP9]], label [[LOOP_EXIT_GUARD:%.*]], label [[H1]]
61+
; CHECK-NEXT: [[TMP6]] = phi i1 [ false, [[FLOW5]] ], [ [[TMP0]], [[FLOW3]] ]
62+
; CHECK-NEXT: [[TMP7:%.*]] = phi i1 [ [[TMP4]], [[FLOW5]] ], [ true, [[FLOW3]] ]
63+
; CHECK-NEXT: br i1 [[TMP7]], label [[LOOP_EXIT_GUARD:%.*]], label [[H1]]
6664
; CHECK: loop.exit.guard1:
6765
; CHECK-NEXT: br i1 [[TMP2]], label [[L1]], label [[FLOW5]]
6866
;
@@ -115,39 +113,37 @@ define void @incorrect-backedge(i1 %PredH2, i1 %PredH3, i1 %PredL2, i1 %PredL13,
115113
; CHECK: L2:
116114
; CHECK-NEXT: br i1 [[PREDL2_INV]], label [[L13:%.*]], label [[FLOW3:%.*]]
117115
; CHECK: Flow:
118-
; CHECK-NEXT: [[TMP0:%.*]] = phi i1 [ [[TMP7:%.*]], [[FLOW3]] ], [ true, [[H3]] ]
119-
; CHECK-NEXT: [[TMP1:%.*]] = phi i1 [ [[TMP8:%.*]], [[FLOW3]] ], [ false, [[H3]] ]
120-
; CHECK-NEXT: [[TMP2:%.*]] = phi i1 [ [[TMP8]], [[FLOW3]] ], [ true, [[H3]] ]
121-
; CHECK-NEXT: [[TMP3:%.*]] = phi i1 [ [[TMP9:%.*]], [[FLOW3]] ], [ true, [[H3]] ]
122-
; CHECK-NEXT: br i1 [[TMP3]], label [[LOOP_EXIT_GUARD2:%.*]], label [[H3]]
116+
; CHECK-NEXT: [[TMP0:%.*]] = phi i1 [ [[TMP6:%.*]], [[FLOW3]] ], [ true, [[H3]] ]
117+
; CHECK-NEXT: [[TMP1:%.*]] = phi i1 [ false, [[FLOW3]] ], [ true, [[H3]] ]
118+
; CHECK-NEXT: [[TMP2:%.*]] = phi i1 [ [[TMP7:%.*]], [[FLOW3]] ], [ true, [[H3]] ]
119+
; CHECK-NEXT: br i1 [[TMP2]], label [[LOOP_EXIT_GUARD2:%.*]], label [[H3]]
123120
; CHECK: L13:
124121
; CHECK-NEXT: br label [[FLOW3]]
125122
; CHECK: Flow5:
126-
; CHECK-NEXT: [[TMP4:%.*]] = phi i1 [ [[TMP10:%.*]], [[LOOP_EXIT_GUARD1:%.*]] ], [ true, [[LOOP_EXIT_GUARD:%.*]] ]
127-
; CHECK-NEXT: [[TMP5:%.*]] = phi i1 [ false, [[LOOP_EXIT_GUARD1]] ], [ true, [[LOOP_EXIT_GUARD]] ]
128-
; CHECK-NEXT: br i1 [[TMP5]], label [[L1:%.*]], label [[FLOW6:%.*]]
123+
; CHECK-NEXT: [[TMP3:%.*]] = phi i1 [ [[TMP8:%.*]], [[LOOP_EXIT_GUARD1:%.*]] ], [ true, [[LOOP_EXIT_GUARD:%.*]] ]
124+
; CHECK-NEXT: [[TMP4:%.*]] = phi i1 [ false, [[LOOP_EXIT_GUARD1]] ], [ true, [[LOOP_EXIT_GUARD]] ]
125+
; CHECK-NEXT: br i1 [[TMP4]], label [[L1:%.*]], label [[FLOW6:%.*]]
129126
; CHECK: L1:
130127
; CHECK-NEXT: br label [[FLOW6]]
131128
; CHECK: Flow6:
132-
; CHECK-NEXT: [[TMP6:%.*]] = phi i1 [ [[PREDL1:%.*]], [[L1]] ], [ [[TMP4]], [[FLOW5:%.*]] ]
133-
; CHECK-NEXT: br i1 [[TMP6]], label [[EXIT:%.*]], label [[H1]]
129+
; CHECK-NEXT: [[TMP5:%.*]] = phi i1 [ [[PREDL1:%.*]], [[L1]] ], [ [[TMP3]], [[FLOW5:%.*]] ]
130+
; CHECK-NEXT: br i1 [[TMP5]], label [[EXIT:%.*]], label [[H1]]
134131
; CHECK: exit:
135132
; CHECK-NEXT: ret void
136133
; CHECK: loop.exit.guard:
137134
; CHECK-NEXT: br i1 [[DOTINV:%.*]], label [[LOOP_EXIT_GUARD1]], label [[FLOW5]]
138135
; CHECK: loop.exit.guard1:
139136
; CHECK-NEXT: br label [[FLOW5]]
140137
; CHECK: Flow3:
141-
; CHECK-NEXT: [[TMP7]] = phi i1 [ true, [[L13]] ], [ false, [[L2]] ]
142-
; CHECK-NEXT: [[TMP8]] = phi i1 [ false, [[L13]] ], [ undef, [[L2]] ]
143-
; CHECK-NEXT: [[TMP9]] = phi i1 [ [[PREDL13_INV]], [[L13]] ], [ true, [[L2]] ]
138+
; CHECK-NEXT: [[TMP6]] = phi i1 [ true, [[L13]] ], [ false, [[L2]] ]
139+
; CHECK-NEXT: [[TMP7]] = phi i1 [ [[PREDL13_INV]], [[L13]] ], [ true, [[L2]] ]
144140
; CHECK-NEXT: br label [[FLOW]]
145141
; CHECK: Flow4:
146-
; CHECK-NEXT: [[TMP10]] = phi i1 [ [[TMP2]], [[LOOP_EXIT_GUARD2]] ], [ false, [[H2]] ]
147-
; CHECK-NEXT: [[TMP11:%.*]] = phi i1 [ [[TMP1]], [[LOOP_EXIT_GUARD2]] ], [ true, [[H2]] ]
148-
; CHECK-NEXT: [[TMP12:%.*]] = phi i1 [ [[TMP0]], [[LOOP_EXIT_GUARD2]] ], [ true, [[H2]] ]
149-
; CHECK-NEXT: [[DOTINV]] = xor i1 [[TMP11]], true
150-
; CHECK-NEXT: br i1 [[TMP12]], label [[LOOP_EXIT_GUARD]], label [[H2]]
142+
; CHECK-NEXT: [[TMP8]] = phi i1 [ [[TMP1]], [[LOOP_EXIT_GUARD2]] ], [ false, [[H2]] ]
143+
; CHECK-NEXT: [[TMP9:%.*]] = phi i1 [ false, [[LOOP_EXIT_GUARD2]] ], [ true, [[H2]] ]
144+
; CHECK-NEXT: [[TMP10:%.*]] = phi i1 [ [[TMP0]], [[LOOP_EXIT_GUARD2]] ], [ true, [[H2]] ]
145+
; CHECK-NEXT: [[DOTINV]] = xor i1 [[TMP9]], true
146+
; CHECK-NEXT: br i1 [[TMP10]], label [[LOOP_EXIT_GUARD]], label [[H2]]
151147
; CHECK: loop.exit.guard2:
152148
; CHECK-NEXT: br label [[FLOW4]]
153149
;

llvm/test/Transforms/UnifyLoopExits/integer_guards.ll

+3-3
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ define void @inner_loop(i1 %PredEntry, i1 %PredA, i1 %PredB) {
111111
; CHECK-NEXT: [[E_PREDICATE:%.*]] = icmp eq i32 [[MERGED_BB_IDX]], 1
112112
; CHECK-NEXT: br i1 [[E_PREDICATE]], label [[E:%.*]], label [[I]]
113113
; CHECK: loop.exit.guard2:
114-
; CHECK-NEXT: [[MERGED_BB_IDX_MOVED]] = phi i32 [ 0, [[B]] ], [ 1, [[D]] ], [ undef, [[F]] ]
114+
; CHECK-NEXT: [[MERGED_BB_IDX_MOVED]] = phi i32 [ 0, [[B]] ], [ 1, [[D]] ], [ poison, [[F]] ]
115115
; CHECK-NEXT: [[MERGED_BB_IDX3:%.*]] = phi i32 [ 0, [[B]] ], [ 0, [[D]] ], [ 1, [[F]] ]
116116
; CHECK-NEXT: [[LOOP_EXIT_GUARD_PREDICATE:%.*]] = icmp eq i32 [[MERGED_BB_IDX3]], 0
117117
; CHECK-NEXT: br i1 [[LOOP_EXIT_GUARD_PREDICATE]], label [[LOOP_EXIT_GUARD]], label [[G]]
@@ -152,8 +152,8 @@ define void @inner_loop(i1 %PredEntry, i1 %PredA, i1 %PredB) {
152152
; BOOLEAN: loop.exit.guard1:
153153
; BOOLEAN-NEXT: br i1 [[GUARD_E]], label [[E:%.*]], label [[I]]
154154
; BOOLEAN: loop.exit.guard2:
155-
; BOOLEAN-NEXT: [[GUARD_E_MOVED]] = phi i1 [ false, [[B]] ], [ true, [[D]] ], [ undef, [[F]] ]
156-
; BOOLEAN-NEXT: [[GUARD_C_MOVED]] = phi i1 [ true, [[B]] ], [ false, [[D]] ], [ undef, [[F]] ]
155+
; BOOLEAN-NEXT: [[GUARD_E_MOVED]] = phi i1 [ false, [[B]] ], [ true, [[D]] ], [ poison, [[F]] ]
156+
; BOOLEAN-NEXT: [[GUARD_C_MOVED]] = phi i1 [ true, [[B]] ], [ false, [[D]] ], [ poison, [[F]] ]
157157
; BOOLEAN-NEXT: [[GUARD_LOOP_EXIT_GUARD:%.*]] = phi i1 [ true, [[B]] ], [ true, [[D]] ], [ false, [[F]] ]
158158
; BOOLEAN-NEXT: br i1 [[GUARD_LOOP_EXIT_GUARD]], label [[LOOP_EXIT_GUARD]], label [[G]]
159159
;

llvm/test/Transforms/UnifyLoopExits/nested.ll

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ define void @nested(i1 %PredB3, i1 %PredB4, i1 %PredA4, i1 %PredA3, i32 %X, i32
3131
; CHECK-NEXT: [[EXIT_PHI:%.*]] = phi i32 [ [[Z:%.*]], [[C:%.*]] ], [ [[EXIT_PHI_MOVED:%.*]], [[LOOP_EXIT_GUARD]] ]
3232
; CHECK-NEXT: ret void
3333
; CHECK: loop.exit.guard:
34-
; CHECK-NEXT: [[EXIT_PHI_MOVED]] = phi i32 [ undef, [[A4]] ], [ [[A4_PHI]], [[A5]] ]
34+
; CHECK-NEXT: [[EXIT_PHI_MOVED]] = phi i32 [ poison, [[A4]] ], [ [[A4_PHI]], [[A5]] ]
3535
; CHECK-NEXT: [[GUARD_C:%.*]] = phi i1 [ true, [[A4]] ], [ false, [[A5]] ]
3636
; CHECK-NEXT: br i1 [[GUARD_C]], label [[C]], label [[EXIT]]
3737
; CHECK: loop.exit.guard1:

0 commit comments

Comments
 (0)