6666; Check that %same.as.v1 can be folded.
6767define 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+ ;
7182entry:
7283 br label %for.body
7384
@@ -93,8 +104,19 @@ exit:
93104; Check that %same.as.v1 can be folded.
94105define 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+ ;
98120entry:
99121 br label %for.body
100122
@@ -120,8 +142,19 @@ exit:
120142; Check that %same.as.v1 can be folded.
121143define 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+ ;
125158entry:
126159 br label %for.body
127160
@@ -147,8 +180,19 @@ exit:
147180; Check that %same.as.v1 can be folded.
148181define 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+ ;
152196entry:
153197 br label %for.body
154198
@@ -174,8 +218,19 @@ exit:
174218; Check that %same.as.v1 can be folded.
175219define 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+ ;
179234entry:
180235 br label %for.body
181236
@@ -200,9 +255,22 @@ exit:
200255; Cannot fold %same.as.v1.
201256define 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+ ;
206274entry:
207275 br label %for.body
208276
@@ -227,9 +295,22 @@ exit:
227295; Cannot fold %same.as.v1.
228296define 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+ ;
233314entry:
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+ ;
260397entry:
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