@@ -195,3 +195,89 @@ join:
195195 %sel = select i1 %phi1 , i32 %phi2 , i32 %phi3
196196 ret i32 %sel
197197}
198+
199+ define i32 @dominating_values_select_same_block (i1 %c1 , i1 %c2 , ptr %p , ptr %p2 ) {
200+ ; CHECK-LABEL: @dominating_values_select_same_block(
201+ ; CHECK-NEXT: entry:
202+ ; CHECK-NEXT: [[B:%.*]] = load i32, ptr [[P2:%.*]], align 4
203+ ; CHECK-NEXT: br i1 [[C1:%.*]], label [[FINAL:%.*]], label [[DELAY:%.*]]
204+ ; CHECK: delay:
205+ ; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P:%.*]], align 4
206+ ; CHECK-NEXT: [[TMP0:%.*]] = select i1 [[C2:%.*]], i32 [[A]], i32 [[B]]
207+ ; CHECK-NEXT: br label [[FINAL]]
208+ ; CHECK: final:
209+ ; CHECK-NEXT: [[USE2:%.*]] = phi i32 [ [[B]], [[ENTRY:%.*]] ], [ [[TMP0]], [[DELAY]] ]
210+ ; CHECK-NEXT: ret i32 [[USE2]]
211+ ;
212+ entry:
213+ %a = load i32 , ptr %p
214+ %b = load i32 , ptr %p2
215+ br i1 %c1 , label %final , label %delay
216+
217+ delay:
218+ br label %final
219+
220+ final:
221+ %use2 = phi i1 [ false , %entry ], [ %c2 , %delay ]
222+ %value = select i1 %use2 , i32 %a , i32 %b
223+ ret i32 %value
224+ }
225+
226+ define i32 @dominating_values_select_not_same_block (i1 %c1 , i1 %c2 , ptr %p , ptr %p2 ) {
227+ ; CHECK-LABEL: @dominating_values_select_not_same_block(
228+ ; CHECK-NEXT: entry:
229+ ; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P:%.*]], align 4
230+ ; CHECK-NEXT: [[B:%.*]] = load i32, ptr [[P2:%.*]], align 4
231+ ; CHECK-NEXT: br i1 [[C1:%.*]], label [[FINAL:%.*]], label [[DELAY:%.*]]
232+ ; CHECK: delay:
233+ ; CHECK-NEXT: br label [[FINAL]]
234+ ; CHECK: final:
235+ ; CHECK-NEXT: [[USE2:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ [[C2:%.*]], [[DELAY]] ]
236+ ; CHECK-NEXT: br label [[SPLIT:%.*]]
237+ ; CHECK: split:
238+ ; CHECK-NEXT: [[VALUE:%.*]] = select i1 [[USE2]], i32 [[A]], i32 [[B]]
239+ ; CHECK-NEXT: ret i32 [[VALUE]]
240+ ;
241+ entry:
242+ %a = load i32 , ptr %p
243+ %b = load i32 , ptr %p2
244+ br i1 %c1 , label %final , label %delay
245+
246+ delay:
247+ br label %final
248+
249+ final:
250+ %use2 = phi i1 [ false , %entry ], [ %c2 , %delay ]
251+ br label %split
252+
253+ split:
254+ %value = select i1 %use2 , i32 %a , i32 %b
255+ ret i32 %value
256+ }
257+
258+ define i32 @not_dominating_values (i1 %c1 , i1 %c2 , ptr %p , ptr %p2 ) {
259+ ; CHECK-LABEL: @not_dominating_values(
260+ ; CHECK-NEXT: entry:
261+ ; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P:%.*]], align 4
262+ ; CHECK-NEXT: br i1 [[C1:%.*]], label [[FINAL:%.*]], label [[DELAY:%.*]]
263+ ; CHECK: delay:
264+ ; CHECK-NEXT: br label [[FINAL]]
265+ ; CHECK: final:
266+ ; CHECK-NEXT: [[USE2:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ [[C2:%.*]], [[DELAY]] ]
267+ ; CHECK-NEXT: [[B:%.*]] = load i32, ptr [[P2:%.*]], align 4
268+ ; CHECK-NEXT: [[VALUE:%.*]] = select i1 [[USE2]], i32 [[A]], i32 [[B]]
269+ ; CHECK-NEXT: ret i32 [[VALUE]]
270+ ;
271+ entry:
272+ %a = load i32 , ptr %p
273+ br i1 %c1 , label %final , label %delay
274+
275+ delay:
276+ br label %final
277+
278+ final:
279+ %use2 = phi i1 [ false , %entry ], [ %c2 , %delay ]
280+ %b = load i32 , ptr %p2
281+ %value = select i1 %use2 , i32 %a , i32 %b
282+ ret i32 %value
283+ }
0 commit comments