Skip to content

Commit f227dc9

Browse files
authored
[UnifyLoopExits] Never generate phis of only undef values (#99924)
1 parent ca102b2 commit f227dc9

File tree

2 files changed

+67
-2
lines changed

2 files changed

+67
-2
lines changed

llvm/lib/Transforms/Utils/BasicBlockUtils.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1909,22 +1909,29 @@ static void reconnectPhis(BasicBlock *Out, BasicBlock *GuardBlock,
19091909
auto NewPhi =
19101910
PHINode::Create(Phi->getType(), Incoming.size(),
19111911
Phi->getName() + ".moved", FirstGuardBlock->begin());
1912+
bool AllUndef = true;
19121913
for (auto *In : Incoming) {
19131914
Value *V = UndefValue::get(Phi->getType());
19141915
if (In == Out) {
19151916
V = NewPhi;
19161917
} else if (Phi->getBasicBlockIndex(In) != -1) {
19171918
V = Phi->removeIncomingValue(In, false);
1919+
AllUndef &= isa<UndefValue>(V);
19181920
}
19191921
NewPhi->addIncoming(V, In);
19201922
}
19211923
assert(NewPhi->getNumIncomingValues() == Incoming.size());
1924+
Value *NewV = NewPhi;
1925+
if (AllUndef) {
1926+
NewPhi->eraseFromParent();
1927+
NewV = UndefValue::get(Phi->getType());
1928+
}
19221929
if (Phi->getNumOperands() == 0) {
1923-
Phi->replaceAllUsesWith(NewPhi);
1930+
Phi->replaceAllUsesWith(NewV);
19241931
I = Phi->eraseFromParent();
19251932
continue;
19261933
}
1927-
Phi->addIncoming(NewPhi, GuardBlock);
1934+
Phi->addIncoming(NewV, GuardBlock);
19281935
++I;
19291936
}
19301937
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt < %s -passes='unify-loop-exits' -S | FileCheck %s
3+
4+
define fastcc void @undef_phi(i64 %i5247, i1 %i4530, i1 %i4936.not) {
5+
; CHECK-LABEL: define fastcc void @undef_phi(
6+
; CHECK-SAME: i64 [[I5247:%.*]], i1 [[I4530:%.*]], i1 [[I4936_NOT:%.*]]) {
7+
; CHECK-NEXT: [[BB:.*:]]
8+
; CHECK-NEXT: br label %[[MBB3932:.*]]
9+
; CHECK: [[MBB3932]]:
10+
; CHECK-NEXT: br label %[[MBB4454:.*]]
11+
; CHECK: [[MBB4321:.*]]:
12+
; CHECK-NEXT: [[TMP0:%.*]] = trunc i64 [[I5247]] to i32
13+
; CHECK-NEXT: [[I5290:%.*]] = icmp eq i32 [[TMP0]], 0
14+
; CHECK-NEXT: br i1 [[I5290]], label %[[MBB3932]], label %[[LOOP_EXIT_GUARD:.*]]
15+
; CHECK: [[MBB4454]]:
16+
; CHECK-NEXT: br i1 [[I4530]], label %[[MBB4535:.*]], label %[[LOOP_EXIT_GUARD1:.*]]
17+
; CHECK: [[MBB4531:.*]]:
18+
; CHECK-NEXT: ret void
19+
; CHECK: [[MBB4535]]:
20+
; CHECK-NEXT: br i1 [[I4936_NOT]], label %[[LOOP_EXIT_GUARD1]], label %[[MBB4454]]
21+
; CHECK: [[MBB5291:.*]]:
22+
; CHECK-NEXT: [[I5293:%.*]] = insertvalue [2 x i32] zeroinitializer, i32 [[DOTMOVED:%.*]], 1
23+
; CHECK-NEXT: store volatile [2 x i32] [[I5293]], ptr addrspace(5) null, align 4
24+
; CHECK-NEXT: ret void
25+
; CHECK: [[LOOP_EXIT_GUARD]]:
26+
; CHECK-NEXT: [[DOTMOVED]] = phi i32 [ [[TMP0]], %[[MBB4321]] ], [ undef, %[[LOOP_EXIT_GUARD1]] ]
27+
; CHECK-NEXT: [[GUARD_MBB4531:%.*]] = phi i1 [ false, %[[MBB4321]] ], [ [[GUARD_MBB4531_MOVED:%.*]], %[[LOOP_EXIT_GUARD1]] ]
28+
; CHECK-NEXT: br i1 [[GUARD_MBB4531]], label %[[MBB4531]], label %[[MBB5291]]
29+
; CHECK: [[LOOP_EXIT_GUARD1]]:
30+
; CHECK-NEXT: [[GUARD_MBB4531_MOVED]] = phi i1 [ true, %[[MBB4454]] ], [ undef, %[[MBB4535]] ]
31+
; CHECK-NEXT: [[GUARD_LOOP_EXIT_GUARD:%.*]] = phi i1 [ true, %[[MBB4454]] ], [ false, %[[MBB4535]] ]
32+
; CHECK-NEXT: br i1 [[GUARD_LOOP_EXIT_GUARD]], label %[[LOOP_EXIT_GUARD]], label %[[MBB4321]]
33+
;
34+
mbb:
35+
br label %mbb3932
36+
37+
mbb3932: ; preds = %mbb4321, %mbb
38+
br label %mbb4454
39+
40+
mbb4321: ; preds = %mbb4535
41+
%0 = trunc i64 %i5247 to i32
42+
%i5290 = icmp eq i32 %0, 0
43+
br i1 %i5290, label %mbb3932, label %mbb5291
44+
45+
mbb4454: ; preds = %mbb4535, %mbb3932
46+
br i1 %i4530, label %mbb4535, label %mbb4531
47+
48+
mbb4531: ; preds = %mbb4454
49+
ret void
50+
51+
mbb4535: ; preds = %mbb4454
52+
br i1 %i4936.not, label %mbb4321, label %mbb4454
53+
54+
mbb5291: ; preds = %mbb4321
55+
%i5293 = insertvalue [2 x i32] zeroinitializer, i32 %0, 1
56+
store volatile [2 x i32] %i5293, ptr addrspace(5) null, align 4
57+
ret void
58+
}

0 commit comments

Comments
 (0)