Skip to content

Commit d6e9655

Browse files
Address comments made on Oct 23rd.
1 parent 2baa72a commit d6e9655

File tree

1 file changed

+159
-22
lines changed

1 file changed

+159
-22
lines changed

llvm/test/Transforms/InstCombine/select_with_identical_phi.ll

Lines changed: 159 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,19 @@ exit:
6666
; Check that %same.as.v1 can be folded.
6767
define void @select_with_identical_phi_2(i1 %cmp1, i1 %cmp2, float %x) {
6868
; CHECK-LABEL: @select_with_identical_phi_2(
69-
; CHECK: select
70-
; CHECK-NOT: select
69+
; CHECK-NEXT: entry:
70+
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
71+
; CHECK: for.body:
72+
; CHECK-NEXT: [[V1:%.*]] = phi float [ 0xC415AF1D80000000, [[ENTRY:%.*]] ], [ [[V1_1:%.*]], [[FOR_BODY]] ]
73+
; CHECK-NEXT: [[I:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INC_I:%.*]], [[FOR_BODY]] ]
74+
; CHECK-NEXT: [[V1_1]] = select i1 [[CMP2:%.*]], float [[X:%.*]], float [[V1]]
75+
; CHECK-NEXT: [[INC_I]] = add nuw nsw i32 [[I]], 1
76+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC_I]], 100
77+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[EXIT:%.*]], label [[FOR_BODY]]
78+
; CHECK: exit:
79+
; CHECK-NEXT: store float [[V1_1]], ptr @A, align 4
80+
; CHECK-NEXT: ret void
81+
;
7182
entry:
7283
br label %for.body
7384

@@ -93,8 +104,19 @@ exit:
93104
; Check that %same.as.v1 can be folded.
94105
define void @select_with_identical_phi_3(i1 %cmp1, i1 %cmp2, float %x) {
95106
; CHECK-LABEL: @select_with_identical_phi_3(
96-
; CHECK: select
97-
; CHECK-NOT: select
107+
; CHECK-NEXT: entry:
108+
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
109+
; CHECK: for.body:
110+
; CHECK-NEXT: [[V1:%.*]] = phi float [ 0xC415AF1D80000000, [[ENTRY:%.*]] ], [ [[V1_1:%.*]], [[FOR_BODY]] ]
111+
; CHECK-NEXT: [[I:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INC_I:%.*]], [[FOR_BODY]] ]
112+
; CHECK-NEXT: [[V1_1]] = select i1 [[CMP2:%.*]], float [[V1]], float [[X:%.*]]
113+
; CHECK-NEXT: [[INC_I]] = add nuw nsw i32 [[I]], 1
114+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC_I]], 100
115+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[EXIT:%.*]], label [[FOR_BODY]]
116+
; CHECK: exit:
117+
; CHECK-NEXT: store float [[V1_1]], ptr @A, align 4
118+
; CHECK-NEXT: ret void
119+
;
98120
entry:
99121
br label %for.body
100122

@@ -120,8 +142,19 @@ exit:
120142
; Check that %same.as.v1 can be folded.
121143
define void @select_with_identical_phi_4(i1 %cmp1, i1 %cmp2, float %x) {
122144
; CHECK-LABEL: @select_with_identical_phi_4(
123-
; CHECK: select
124-
; CHECK-NOT: select
145+
; CHECK-NEXT: entry:
146+
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
147+
; CHECK: for.body:
148+
; CHECK-NEXT: [[V1:%.*]] = phi float [ 0xC415AF1D80000000, [[ENTRY:%.*]] ], [ [[V1_1:%.*]], [[FOR_BODY]] ]
149+
; CHECK-NEXT: [[I:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INC_I:%.*]], [[FOR_BODY]] ]
150+
; CHECK-NEXT: [[V1_1]] = select i1 [[CMP2:%.*]], float [[X:%.*]], float [[V1]]
151+
; CHECK-NEXT: [[INC_I]] = add nuw nsw i32 [[I]], 1
152+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC_I]], 100
153+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[EXIT:%.*]], label [[FOR_BODY]]
154+
; CHECK: exit:
155+
; CHECK-NEXT: store float [[V1_1]], ptr @A, align 4
156+
; CHECK-NEXT: ret void
157+
;
125158
entry:
126159
br label %for.body
127160

@@ -147,8 +180,19 @@ exit:
147180
; Check that %same.as.v1 can be folded.
148181
define void @select_with_identical_phi_5(i1 %cmp1, i1 %cmp2, float %x) {
149182
; CHECK-LABEL: @select_with_identical_phi_5(
150-
; CHECK: select
151-
; CHECK-NOT: select
183+
; CHECK-NEXT: entry:
184+
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
185+
; CHECK: for.body:
186+
; CHECK-NEXT: [[V1:%.*]] = phi float [ 0xC415AF1D80000000, [[ENTRY:%.*]] ], [ [[V1_1:%.*]], [[FOR_BODY]] ]
187+
; CHECK-NEXT: [[I:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INC_I:%.*]], [[FOR_BODY]] ]
188+
; CHECK-NEXT: [[V1_1]] = select i1 [[CMP2:%.*]], float [[V1]], float [[X:%.*]]
189+
; CHECK-NEXT: [[INC_I]] = add nuw nsw i32 [[I]], 1
190+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC_I]], 100
191+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[EXIT:%.*]], label [[FOR_BODY]]
192+
; CHECK: exit:
193+
; CHECK-NEXT: store float [[V1_1]], ptr @A, align 4
194+
; CHECK-NEXT: ret void
195+
;
152196
entry:
153197
br label %for.body
154198

@@ -174,8 +218,19 @@ exit:
174218
; Check that %same.as.v1 can be folded.
175219
define void @select_with_identical_phi_6(i1 %cmp1, i1 %cmp2, float %x) {
176220
; CHECK-LABEL: @select_with_identical_phi_6(
177-
; CHECK: select
178-
; CHECK-NOT: select
221+
; CHECK-NEXT: entry:
222+
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
223+
; CHECK: for.body:
224+
; CHECK-NEXT: [[V1:%.*]] = phi float [ 0xC415AF1D80000000, [[ENTRY:%.*]] ], [ [[V1_1:%.*]], [[FOR_BODY]] ]
225+
; CHECK-NEXT: [[I:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INC_I:%.*]], [[FOR_BODY]] ]
226+
; CHECK-NEXT: [[V1_1]] = select i1 [[CMP2:%.*]], float [[X:%.*]], float [[V1]]
227+
; CHECK-NEXT: [[INC_I]] = add nuw nsw i32 [[I]], 1
228+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC_I]], 100
229+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[EXIT:%.*]], label [[FOR_BODY]]
230+
; CHECK: exit:
231+
; CHECK-NEXT: store float [[V1_1]], ptr @A, align 4
232+
; CHECK-NEXT: ret void
233+
;
179234
entry:
180235
br label %for.body
181236

@@ -200,9 +255,22 @@ exit:
200255
; Cannot fold %same.as.v1.
201256
define void @select_with_identical_phi_negative_1(i1 %cmp1, i1 %cmp2, float %x) {
202257
; CHECK-LABEL: @select_with_identical_phi_negative_1(
203-
; CHECK: select
204-
; CHECK: select
205-
; CHECK: select
258+
; CHECK-NEXT: entry:
259+
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
260+
; CHECK: for.body:
261+
; CHECK-NEXT: [[V1:%.*]] = phi float [ 0x4415AF1D80000000, [[ENTRY:%.*]] ], [ [[V1_1:%.*]], [[FOR_BODY]] ]
262+
; CHECK-NEXT: [[PHI_TO_REMOVE:%.*]] = phi float [ 0xC415AF1D80000000, [[ENTRY]] ], [ [[PHI_TO_REMOVE_NEXT:%.*]], [[FOR_BODY]] ]
263+
; CHECK-NEXT: [[I:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INC_I:%.*]], [[FOR_BODY]] ]
264+
; CHECK-NEXT: [[SAME_AS_V1:%.*]] = select i1 [[CMP1:%.*]], float [[V1]], float [[PHI_TO_REMOVE]]
265+
; CHECK-NEXT: [[V1_1]] = select i1 [[CMP2:%.*]], float [[X:%.*]], float [[V1]]
266+
; CHECK-NEXT: [[PHI_TO_REMOVE_NEXT]] = select i1 [[CMP2]], float [[X]], float [[SAME_AS_V1]]
267+
; CHECK-NEXT: [[INC_I]] = add nuw nsw i32 [[I]], 1
268+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC_I]], 100
269+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[EXIT:%.*]], label [[FOR_BODY]]
270+
; CHECK: exit:
271+
; CHECK-NEXT: store float [[V1_1]], ptr @A, align 4
272+
; CHECK-NEXT: ret void
273+
;
206274
entry:
207275
br label %for.body
208276

@@ -227,9 +295,22 @@ exit:
227295
; Cannot fold %same.as.v1.
228296
define void @select_with_identical_phi_negative_2(i1 %cmp1, i1 %cmp2, float %x) {
229297
; CHECK-LABEL: @select_with_identical_phi_negative_2(
230-
; CHECK: select
231-
; CHECK: select
232-
; CHECK: select
298+
; CHECK-NEXT: entry:
299+
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
300+
; CHECK: for.body:
301+
; CHECK-NEXT: [[V1:%.*]] = phi float [ 0xC415AF1D80000000, [[ENTRY:%.*]] ], [ [[V1_1:%.*]], [[FOR_BODY]] ]
302+
; CHECK-NEXT: [[PHI_TO_REMOVE:%.*]] = phi float [ 0xC415AF1D80000000, [[ENTRY]] ], [ [[PHI_TO_REMOVE_NEXT:%.*]], [[FOR_BODY]] ]
303+
; CHECK-NEXT: [[I:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INC_I:%.*]], [[FOR_BODY]] ]
304+
; CHECK-NEXT: [[SAME_AS_V1:%.*]] = select i1 [[CMP1:%.*]], float [[V1]], float [[PHI_TO_REMOVE]]
305+
; CHECK-NEXT: [[V1_1]] = select i1 [[CMP2:%.*]], float [[V1]], float [[X:%.*]]
306+
; CHECK-NEXT: [[PHI_TO_REMOVE_NEXT]] = select i1 [[CMP2]], float [[X]], float [[SAME_AS_V1]]
307+
; CHECK-NEXT: [[INC_I]] = add nuw nsw i32 [[I]], 1
308+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC_I]], 100
309+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[EXIT:%.*]], label [[FOR_BODY]]
310+
; CHECK: exit:
311+
; CHECK-NEXT: store float [[V1_1]], ptr @A, align 4
312+
; CHECK-NEXT: ret void
313+
;
233314
entry:
234315
br label %for.body
235316

@@ -250,13 +331,69 @@ exit:
250331
ret void
251332
}
252333

253-
; The true and false values of %same.as.v1 are not really the same phi.
334+
; %v1 and %phi.to.remove do not act as the same phi since %v1.1 and %phi.to.remove.next do not
335+
; have the same condition.
254336
; Cannot fold %same.as.v1.
255-
define void @select_with_identical_phi_negative_3(i1 %cmp1, i1 %cmp2, float %x) {
337+
define void @select_with_identical_phi_negative_3(i1 %cmp1, i1 %cmp2, i1 %cmp3, float %x) {
256338
; CHECK-LABEL: @select_with_identical_phi_negative_3(
257-
; CHECK: select
258-
; CHECK: select
259-
; CHECK: select
339+
; CHECK-NEXT: entry:
340+
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
341+
; CHECK: for.body:
342+
; CHECK-NEXT: [[V1:%.*]] = phi float [ 0xC415AF1D80000000, [[ENTRY:%.*]] ], [ [[V1_1:%.*]], [[FOR_BODY]] ]
343+
; CHECK-NEXT: [[PHI_TO_REMOVE:%.*]] = phi float [ 0xC415AF1D80000000, [[ENTRY]] ], [ [[PHI_TO_REMOVE_NEXT:%.*]], [[FOR_BODY]] ]
344+
; CHECK-NEXT: [[I:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INC_I:%.*]], [[FOR_BODY]] ]
345+
; CHECK-NEXT: [[SAME_AS_V1:%.*]] = select i1 [[CMP1:%.*]], float [[V1]], float [[PHI_TO_REMOVE]]
346+
; CHECK-NEXT: [[V1_1]] = select i1 [[CMP3:%.*]], float [[V1]], float [[X:%.*]]
347+
; CHECK-NEXT: [[PHI_TO_REMOVE_NEXT]] = select i1 [[CMP2:%.*]], float [[X]], float [[SAME_AS_V1]]
348+
; CHECK-NEXT: [[INC_I]] = add nuw nsw i32 [[I]], 1
349+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC_I]], 100
350+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[EXIT:%.*]], label [[FOR_BODY]]
351+
; CHECK: exit:
352+
; CHECK-NEXT: store float [[V1_1]], ptr @A, align 4
353+
; CHECK-NEXT: ret void
354+
;
355+
entry:
356+
br label %for.body
357+
358+
for.body: ; preds = %entry, %for.body
359+
%v1 = phi float [ 0xC415AF1D80000000, %entry ], [ %v1.1, %for.body ]
360+
%phi.to.remove = phi float [ 0xC415AF1D80000000, %entry ], [ %phi.to.remove.next, %for.body ]
361+
%i = phi i32 [ 0, %entry ], [ %inc.i, %for.body ]
362+
%same.as.v1 = select i1 %cmp1, float %v1, float %phi.to.remove
363+
%v1.1 = select i1 %cmp3, float %v1, float %x
364+
%phi.to.remove.next = select i1 %cmp2, float %x, float %same.as.v1
365+
%inc.i = add nuw nsw i32 %i, 1
366+
%exitcond = icmp eq i32 %inc.i, 100
367+
br i1 %exitcond, label %exit, label %for.body
368+
369+
exit:
370+
%vl.1.lcssa = phi float [ %v1.1, %for.body ]
371+
store float %vl.1.lcssa, ptr @A
372+
ret void
373+
}
374+
375+
; The true and false values of %same.as.v1 are not really the same phi.
376+
; Cannot fold %same.as.v1.
377+
define void @select_with_identical_phi_negative_4(i1 %cmp1, i1 %cmp2, float %x) {
378+
; CHECK-LABEL: @select_with_identical_phi_negative_4(
379+
; CHECK-NEXT: entry:
380+
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
381+
; CHECK: for.body:
382+
; CHECK-NEXT: [[V0:%.*]] = phi float [ 0x4415AF1D80000000, [[ENTRY:%.*]] ], [ [[V0_1:%.*]], [[FOR_BODY]] ]
383+
; CHECK-NEXT: [[V1:%.*]] = phi float [ 0xC415AF1D80000000, [[ENTRY]] ], [ [[V1_1:%.*]], [[FOR_BODY]] ]
384+
; CHECK-NEXT: [[PHI_TO_REMOVE:%.*]] = phi float [ 0xC415AF1D80000000, [[ENTRY]] ], [ [[PHI_TO_REMOVE_NEXT:%.*]], [[FOR_BODY]] ]
385+
; CHECK-NEXT: [[I:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INC_I:%.*]], [[FOR_BODY]] ]
386+
; CHECK-NEXT: [[SAME_AS_V1:%.*]] = select i1 [[CMP1:%.*]], float [[V0]], float [[PHI_TO_REMOVE]]
387+
; CHECK-NEXT: [[V1_1]] = select i1 [[CMP2:%.*]], float [[X:%.*]], float [[V1]]
388+
; CHECK-NEXT: [[PHI_TO_REMOVE_NEXT]] = select i1 [[CMP2]], float [[X]], float [[SAME_AS_V1]]
389+
; CHECK-NEXT: [[V0_1]] = fadd float [[V0]], 1.000000e+00
390+
; CHECK-NEXT: [[INC_I]] = add nuw nsw i32 [[I]], 1
391+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC_I]], 100
392+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[EXIT:%.*]], label [[FOR_BODY]]
393+
; CHECK: exit:
394+
; CHECK-NEXT: store float [[V1_1]], ptr @A, align 4
395+
; CHECK-NEXT: ret void
396+
;
260397
entry:
261398
br label %for.body
262399

@@ -277,4 +414,4 @@ exit:
277414
%vl.1.lcssa = phi float [ %v1.1, %for.body ]
278415
store float %vl.1.lcssa, ptr @A
279416
ret void
280-
}
417+
}

0 commit comments

Comments
 (0)