Skip to content

Commit 0f5ed03

Browse files
Review fix 1
Change-Id: I40d22b4b8f34bcc12b2d5f76784dd3c42d00422d
1 parent 71665e7 commit 0f5ed03

File tree

2 files changed

+85
-62
lines changed

2 files changed

+85
-62
lines changed

llvm/lib/Transforms/InstCombine/InstructionCombining.cpp

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5169,6 +5169,7 @@ Instruction *InstCombinerImpl::visitFreeze(FreezeInst &I) {
51695169
// - or: pick -1
51705170
// - select's condition: if the true value is constant, choose it by making
51715171
// the condition true.
5172+
// - phi: pick the common constant across operands
51725173
// - default: pick 0
51735174
//
51745175
// Note that this transform is intentionally done here rather than
@@ -5193,6 +5194,9 @@ Instruction *InstCombinerImpl::visitFreeze(FreezeInst &I) {
51935194

51945195
C = cast<Constant>(V);
51955196

5197+
if (isa<UndefValue>(C) || isa<PoisonValue>(C))
5198+
return nullptr;
5199+
51965200
if (BestValue && BestValue != C)
51975201
return nullptr;
51985202

@@ -5203,28 +5207,8 @@ Instruction *InstCombinerImpl::visitFreeze(FreezeInst &I) {
52035207

52045208
Value *NullValue = Constant::getNullValue(Ty);
52055209

5206-
bool OnlyPHIUsers =
5207-
all_of(I.users(), [](const User *U) { return isa<PHINode>(U); });
5208-
if (OnlyPHIUsers) {
5209-
Value *BestValue = nullptr;
5210-
for (auto *U : I.users()) {
5211-
Value *V = pickCommonConstantFromPHI(*cast<PHINode>(U));
5212-
if (!V)
5213-
continue;
5214-
5215-
if (!BestValue) {
5216-
BestValue = V;
5217-
} else if (BestValue && BestValue == NullValue) {
5218-
BestValue = NullValue;
5219-
}
5220-
}
5221-
5222-
if (BestValue)
5223-
return BestValue;
5224-
}
5225-
52265210
Value *BestValue = nullptr;
5227-
for (const auto *U : I.users()) {
5211+
for (auto *U : I.users()) {
52285212
Value *V = NullValue;
52295213
if (match(U, m_Or(m_Value(), m_Value())))
52305214
V = ConstantInt::getAllOnesValue(Ty);
@@ -5233,6 +5217,10 @@ Instruction *InstCombinerImpl::visitFreeze(FreezeInst &I) {
52335217
else if (match(U, m_c_Select(m_Specific(&I), m_Value(V)))) {
52345218
if (!isGuaranteedNotToBeUndefOrPoison(V, &AC, &I, &DT))
52355219
V = NullValue;
5220+
} else if (auto *PHI = dyn_cast<PHINode>(U)) {
5221+
Value *MaybeV = pickCommonConstantFromPHI(*PHI);
5222+
if (MaybeV)
5223+
V = MaybeV;
52365224
}
52375225

52385226
if (!BestValue)

llvm/test/Transforms/InstCombine/in-freeze-phi.ll

Lines changed: 76 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -147,62 +147,27 @@ final:
147147
ret <4 x i8> %phi
148148
}
149149

150-
define i32 @multi_use_one_folds_one_not(i1 %c0, i1 %c1) {
151-
; CHECK-LABEL: define i32 @multi_use_one_folds_one_not(
152-
; CHECK-SAME: i1 [[C0:%.*]], i1 [[C1:%.*]]) {
153-
; CHECK-NEXT: [[ENTRY:.*:]]
154-
; CHECK-NEXT: br i1 [[C0]], label %[[BB_FREEZE:.*]], label %[[BB_OTHER:.*]]
155-
; CHECK: [[BB_FREEZE]]:
156-
; CHECK-NEXT: br label %[[MID:.*]]
157-
; CHECK: [[BB_OTHER]]:
158-
; CHECK-NEXT: br i1 [[C1]], label %[[CA:.*]], label %[[CB:.*]]
159-
; CHECK: [[CA]]:
160-
; CHECK-NEXT: br label %[[MID]]
161-
; CHECK: [[CB]]:
162-
; CHECK-NEXT: br label %[[MID]]
163-
; CHECK: [[MID]]:
164-
; CHECK-NEXT: [[A:%.*]] = phi i32 [ 2, %[[BB_FREEZE]] ], [ 4, %[[CA]] ], [ 3, %[[CB]] ]
165-
; CHECK-NEXT: ret i32 [[A]]
166-
;
167-
entry:
168-
br i1 %c0, label %bb_freeze, label %bb_other
169-
bb_freeze:
170-
%f = freeze i32 undef
171-
br label %mid
172-
bb_other:
173-
br i1 %c1, label %cA, label %cB
174-
cA:
175-
br label %mid
176-
cB:
177-
br label %mid
178-
mid:
179-
%phi_fold = phi i32 [ %f, %bb_freeze ], [ 1, %cA ], [ 1, %cB ]
180-
%phi_nofld = phi i32 [ %f, %bb_freeze ], [ 3, %cA ], [ 2, %cB ]
181-
%a = add i32 %phi_fold, %phi_nofld
182-
ret i32 %a
183-
}
184-
185150
define i32 @multi_use_one_folds_one_not_zero(i1 %c0, i1 %c1, i1 %c2) {
186151
; CHECK-LABEL: define i32 @multi_use_one_folds_one_not_zero(
187152
; CHECK-SAME: i1 [[C0:%.*]], i1 [[C1:%.*]], i1 [[C2:%.*]]) {
188153
; CHECK-NEXT: [[ENTRY:.*:]]
189-
; CHECK-NEXT: br i1 [[C0]], label %[[BB_OTHER3:.*]], label %[[CC1:.*]]
190-
; CHECK: [[BB_OTHER3]]:
154+
; CHECK-NEXT: br i1 [[C0]], label %[[BB_OTHER2:.*]], label %[[CC:.*]]
155+
; CHECK: [[BB_OTHER2]]:
191156
; CHECK-NEXT: br label %[[MID:.*]]
192-
; CHECK: [[CC1]]:
157+
; CHECK: [[CC]]:
193158
; CHECK-NEXT: br i1 [[C1]], label %[[CA:.*]], label %[[CB:.*]]
194159
; CHECK: [[CA]]:
195160
; CHECK-NEXT: br label %[[MID]]
196161
; CHECK: [[CB]]:
197162
; CHECK-NEXT: br label %[[MID]]
198163
; CHECK: [[MID]]:
199-
; CHECK-NEXT: [[PHI_FOLD:%.*]] = phi i32 [ 0, %[[BB_OTHER3]] ], [ 1, %[[CA]] ], [ 1, %[[CB]] ]
164+
; CHECK-NEXT: [[PHI_FOLD:%.*]] = phi i32 [ 0, %[[BB_OTHER2]] ], [ 1, %[[CA]] ], [ 1, %[[CB]] ]
200165
; CHECK-NEXT: br i1 [[C2]], label %[[BB_FREEZE2:.*]], label %[[CD:.*]]
201166
; CHECK: [[BB_FREEZE2]]:
202167
; CHECK-NEXT: br label %[[FINAL:.*]]
203-
; CHECK: [[BB_OTHER2:.*:]]
168+
; CHECK: [[BB_OTHER3:.*:]]
204169
; CHECK-NEXT: br i1 true, label %[[CA]], label %[[CB]]
205-
; CHECK: [[CC:.*:]]
170+
; CHECK: [[CC1:.*:]]
206171
; CHECK-NEXT: br label %[[FINAL]]
207172
; CHECK: [[CD]]:
208173
; CHECK-NEXT: br label %[[FINAL]]
@@ -236,3 +201,73 @@ final:
236201
%a = add i32 %phi_fold, %phi_no_fold
237202
ret i32 %a
238203
}
204+
205+
define i32 @phi_freeze_poison(i1 %c0, i1 %c1) {
206+
; CHECK-LABEL: define i32 @phi_freeze_poison(
207+
; CHECK-SAME: i1 [[C0:%.*]], i1 [[C1:%.*]]) {
208+
; CHECK-NEXT: [[ENTRY:.*:]]
209+
; CHECK-NEXT: br i1 [[C0]], label %[[BB_FREEZE:.*]], label %[[BB_OTHER:.*]]
210+
; CHECK: [[BB_FREEZE]]:
211+
; CHECK-NEXT: br label %[[FINAL:.*]]
212+
; CHECK: [[BB_OTHER]]:
213+
; CHECK-NEXT: br i1 [[C1]], label %[[CA:.*]], label %[[CB:.*]]
214+
; CHECK: [[CA]]:
215+
; CHECK-NEXT: br label %[[FINAL]]
216+
; CHECK: [[CB]]:
217+
; CHECK-NEXT: br label %[[FINAL]]
218+
; CHECK: [[FINAL]]:
219+
; CHECK-NEXT: ret i32 0
220+
;
221+
entry:
222+
br i1 %c0, label %bb_freeze, label %bb_other
223+
224+
bb_freeze:
225+
%f = freeze i32 undef
226+
br label %final
227+
228+
bb_other:
229+
br i1 %c1, label %cA, label %cB
230+
cA:
231+
br label %final
232+
cB:
233+
br label %final
234+
235+
final:
236+
%phi = phi i32 [ %f, %bb_freeze ], [ poison, %cA ], [ poison, %cB ]
237+
ret i32 %phi
238+
}
239+
240+
define i32 @phi_freeze_undef(i1 %c0, i1 %c1) {
241+
; CHECK-LABEL: define i32 @phi_freeze_undef(
242+
; CHECK-SAME: i1 [[C0:%.*]], i1 [[C1:%.*]]) {
243+
; CHECK-NEXT: [[ENTRY:.*:]]
244+
; CHECK-NEXT: br i1 [[C0]], label %[[BB_FREEZE:.*]], label %[[BB_OTHER:.*]]
245+
; CHECK: [[BB_FREEZE]]:
246+
; CHECK-NEXT: br label %[[FINAL:.*]]
247+
; CHECK: [[BB_OTHER]]:
248+
; CHECK-NEXT: br i1 [[C1]], label %[[CA:.*]], label %[[CB:.*]]
249+
; CHECK: [[CA]]:
250+
; CHECK-NEXT: br label %[[FINAL]]
251+
; CHECK: [[CB]]:
252+
; CHECK-NEXT: br label %[[FINAL]]
253+
; CHECK: [[FINAL]]:
254+
; CHECK-NEXT: ret i32 0
255+
;
256+
entry:
257+
br i1 %c0, label %bb_freeze, label %bb_other
258+
259+
bb_freeze:
260+
%f = freeze i32 undef
261+
br label %final
262+
263+
bb_other:
264+
br i1 %c1, label %cA, label %cB
265+
cA:
266+
br label %final
267+
cB:
268+
br label %final
269+
270+
final:
271+
%phi = phi i32 [ %f, %bb_freeze ], [ undef, %cA ], [ undef, %cB ]
272+
ret i32 %phi
273+
}

0 commit comments

Comments
 (0)