@@ -178,12 +178,12 @@ define void @test_add_sext(ptr %dst, ptr %src, i64 %j.start, i64 %p, i64 %i.star
178178; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
179179; CHECK-NEXT: [[DEC:%.*]] = sext i1 [[CMP3]] to i64
180180; CHECK-NEXT: [[CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
181- ; CHECK-NEXT: [[TMP0 :%.*]] = add i64 [[J]], -1
182- ; CHECK-NEXT : br i1 [[CMP3_FROZEN]], label [[SELECT_END]], label [[SELECT_FALSE:%.*]]
183- ; CHECK: select.false:
181+ ; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_TRUE_SINK :%.*]], label [[SELECT_END]]
182+ ; CHECK: select.true.sink:
183+ ; CHECK-NEXT : [[TMP0:%.*]] = add nsw i64 [[J]], -1
184184; CHECK-NEXT: br label [[SELECT_END]]
185185; CHECK: select.end:
186- ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[LOOP ]] ], [ [[J]], [[SELECT_FALSE ]] ]
186+ ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[SELECT_TRUE_SINK ]] ], [ [[J]], [[LOOP ]] ]
187187; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
188188; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
189189; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
@@ -231,13 +231,13 @@ define void @test_add_sext_not(ptr %dst, ptr %src, i64 %j.start, i64 %p, i64 %i.
231231; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
232232; CHECK-NEXT: [[NOT_CMP3:%.*]] = xor i1 [[CMP3]], true
233233; CHECK-NEXT: [[DEC:%.*]] = sext i1 [[NOT_CMP3]] to i64
234- ; CHECK-NEXT: [[NOT_CMP3_FROZEN:%.*]] = freeze i1 [[NOT_CMP3]]
235- ; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[J]], -1
234+ ; CHECK-NEXT: [[NOT_CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
236235; CHECK-NEXT: br i1 [[NOT_CMP3_FROZEN]], label [[SELECT_END]], label [[SELECT_FALSE:%.*]]
237- ; CHECK: select.false:
236+ ; CHECK: select.false.sink:
237+ ; CHECK-NEXT: [[TMP0:%.*]] = add nsw i64 [[J]], -1
238238; CHECK-NEXT: br label [[SELECT_END]]
239239; CHECK: select.end:
240- ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0 ]], [[LOOP]] ], [ [[J ]], [[SELECT_FALSE]] ]
240+ ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[J ]], [[LOOP]] ], [ [[TMP0 ]], [[SELECT_FALSE]] ]
241241; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
242242; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
243243; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
@@ -286,19 +286,14 @@ define void @test_add_sext_not_and_regular_select(ptr %dst, ptr %src, i64 %j.sta
286286; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
287287; CHECK-NEXT: [[NOT_CMP3:%.*]] = xor i1 [[CMP3]], true
288288; CHECK-NEXT: [[DEC:%.*]] = sext i1 [[NOT_CMP3]] to i64
289- ; CHECK-NEXT: [[NOT_CMP3_FROZEN:%.*]] = freeze i1 [[NOT_CMP3]]
290- ; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[J]], -1
291- ; CHECK-NEXT: br i1 [[NOT_CMP3_FROZEN]], label [[SELECT_END:%.*]], label [[SELECT_FALSE:%.*]]
292- ; CHECK: select.false:
293- ; CHECK-NEXT: br label [[SELECT_END]]
294- ; CHECK: select.end:
295- ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[LOOP]] ], [ [[J]], [[SELECT_FALSE]] ]
296289; CHECK-NEXT: [[CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
297- ; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_END1]], label [[SELECT_FALSE2:%.*]]
298- ; CHECK: select.false2:
290+ ; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_END1]], label [[SELECT_FALSE_SINK:%.*]]
291+ ; CHECK: select.false.sink:
292+ ; CHECK-NEXT: [[TMP0:%.*]] = add nsw i64 [[J]], -1
299293; CHECK-NEXT: br label [[SELECT_END1]]
300- ; CHECK: select.end1:
301- ; CHECK-NEXT: [[SINK:%.*]] = phi ptr [ [[L_I]], [[SELECT_END]] ], [ [[L_J]], [[SELECT_FALSE2]] ]
294+ ; CHECK: select.end:
295+ ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[J]], [[LOOP]] ], [ [[TMP0]], [[SELECT_FALSE_SINK]] ]
296+ ; CHECK-NEXT: [[SINK:%.*]] = phi ptr [ [[L_I]], [[LOOP]] ], [ [[L_J]], [[SELECT_FALSE_SINK]] ]
302297; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
303298; CHECK-NEXT: store ptr [[SINK]], ptr [[GEP_DST]], align 8
304299; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
@@ -351,20 +346,15 @@ define void @test_add_sext_not_and_regular_select2(ptr %dst, ptr %src, i64 %j.st
351346; CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr [[ARRAYIDX1_I]], align 8
352347; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i64 [[TMP2]], [[TMP3]]
353348; CHECK-NEXT: [[CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
354- ; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_END:%.*]], label [[SELECT_FALSE:%.*]]
355- ; CHECK: select.false:
356- ; CHECK-NEXT: br label [[SELECT_END]]
349+ ; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_END1]], label [[SELECT_FALSE:%.*]]
350+ ; CHECK: select.false.sink:
351+ ; CHECK-NEXT: [[TMP5:%.*]] = add nsw i64 [[J]], -1
352+ ; CHECK-NEXT: br label [[SELECT_END1]]
357353; CHECK: select.end:
358354; CHECK-NEXT: [[DOTSINK:%.*]] = phi ptr [ [[TMP0]], [[LOOP]] ], [ [[TMP1]], [[SELECT_FALSE]] ]
355+ ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[J]], [[LOOP]] ], [ [[TMP5]], [[SELECT_FALSE]] ]
359356; CHECK-NEXT: [[NOT_CMP3:%.*]] = xor i1 [[CMP3]], true
360357; CHECK-NEXT: [[DEC:%.*]] = sext i1 [[NOT_CMP3]] to i64
361- ; CHECK-NEXT: [[NOT_CMP3_FROZEN:%.*]] = freeze i1 [[NOT_CMP3]]
362- ; CHECK-NEXT: [[TMP5:%.*]] = add i64 [[J]], -1
363- ; CHECK-NEXT: br i1 [[NOT_CMP3_FROZEN]], label [[SELECT_END1]], label [[SELECT_FALSE2:%.*]]
364- ; CHECK: select.false2:
365- ; CHECK-NEXT: br label [[SELECT_END1]]
366- ; CHECK: select.end1:
367- ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP5]], [[SELECT_END]] ], [ [[J]], [[SELECT_FALSE2]] ]
368358; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
369359; CHECK-NEXT: store ptr [[DOTSINK]], ptr [[TMP4]], align 8
370360; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
@@ -579,12 +569,12 @@ define void @test_sub_sext(ptr %dst, ptr %src, i64 %j.start, i64 %p, i64 %i.star
579569; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
580570; CHECK-NEXT: [[DEC:%.*]] = sext i1 [[CMP3]] to i64
581571; CHECK-NEXT: [[CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
582- ; CHECK-NEXT: [[TMP0 :%.*]] = sub i64 [[J]], -1
583- ; CHECK-NEXT : br i1 [[CMP3_FROZEN]], label [[SELECT_END]], label [[SELECT_FALSE:%.*]]
584- ; CHECK: select.false:
572+ ; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_TRUE_SINK :%.*]], label [[SELECT_END]]
573+ ; CHECK: select.true.sink:
574+ ; CHECK-NEXT : [[TMP0:%.*]] = sub nsw i64 [[J]], -1
585575; CHECK-NEXT: br label [[SELECT_END]]
586576; CHECK: select.end:
587- ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[LOOP ]] ], [ [[J]], [[SELECT_FALSE ]] ]
577+ ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[SELECT_TRUE_SINK ]] ], [ [[J]], [[LOOP ]] ]
588578; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
589579; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
590580; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
@@ -632,13 +622,13 @@ define void @test_sub_sext_not(ptr %dst, ptr %src, i64 %j.start, i64 %p, i64 %i.
632622; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
633623; CHECK-NEXT: [[NOT_CMP3:%.*]] = xor i1 [[CMP3]], true
634624; CHECK-NEXT: [[DEC:%.*]] = sext i1 [[NOT_CMP3]] to i64
635- ; CHECK-NEXT: [[NOT_CMP3_FROZEN:%.*]] = freeze i1 [[NOT_CMP3]]
636- ; CHECK-NEXT: [[TMP0:%.*]] = sub i64 [[J]], -1
625+ ; CHECK-NEXT: [[NOT_CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
637626; CHECK-NEXT: br i1 [[NOT_CMP3_FROZEN]], label [[SELECT_END]], label [[SELECT_FALSE:%.*]]
638- ; CHECK: select.false:
627+ ; CHECK: select.false.sink:
628+ ; CHECK-NEXT: [[TMP0:%.*]] = sub nsw i64 [[J]], -1
639629; CHECK-NEXT: br label [[SELECT_END]]
640630; CHECK: select.end:
641- ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0 ]], [[LOOP]] ], [ [[J ]], [[SELECT_FALSE]] ]
631+ ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[J ]], [[LOOP]] ], [ [[TMP0 ]], [[SELECT_FALSE]] ]
642632; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
643633; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
644634; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
@@ -687,19 +677,14 @@ define void @test_sub_sext_not_and_regular_select(ptr %dst, ptr %src, i64 %j.sta
687677; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
688678; CHECK-NEXT: [[NOT_CMP3:%.*]] = xor i1 [[CMP3]], true
689679; CHECK-NEXT: [[DEC:%.*]] = sext i1 [[NOT_CMP3]] to i64
690- ; CHECK-NEXT: [[NOT_CMP3_FROZEN:%.*]] = freeze i1 [[NOT_CMP3]]
691- ; CHECK-NEXT: [[TMP0:%.*]] = sub i64 [[J]], -1
692- ; CHECK-NEXT: br i1 [[NOT_CMP3_FROZEN]], label [[SELECT_END:%.*]], label [[SELECT_FALSE:%.*]]
693- ; CHECK: select.false:
694- ; CHECK-NEXT: br label [[SELECT_END]]
695- ; CHECK: select.end:
696- ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[LOOP]] ], [ [[J]], [[SELECT_FALSE]] ]
697680; CHECK-NEXT: [[CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
698- ; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_END1]], label [[SELECT_FALSE2:%.*]]
699- ; CHECK: select.false2:
681+ ; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_END1]], label [[SELECT_FALSE_SINK:%.*]]
682+ ; CHECK: select.false.sink:
683+ ; CHECK-NEXT: [[TMP0:%.*]] = sub nsw i64 [[J]], -1
700684; CHECK-NEXT: br label [[SELECT_END1]]
701- ; CHECK: select.end1:
702- ; CHECK-NEXT: [[SINK:%.*]] = phi ptr [ [[L_I]], [[SELECT_END]] ], [ [[L_J]], [[SELECT_FALSE2]] ]
685+ ; CHECK: select.end:
686+ ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[J]], [[LOOP]] ], [ [[TMP0]], [[SELECT_FALSE_SINK]] ]
687+ ; CHECK-NEXT: [[SINK:%.*]] = phi ptr [ [[L_I]], [[LOOP]] ], [ [[L_J]], [[SELECT_FALSE_SINK]] ]
703688; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
704689; CHECK-NEXT: store ptr [[SINK]], ptr [[GEP_DST]], align 8
705690; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
@@ -752,20 +737,15 @@ define void @test_sub_sext_not_and_regular_select2(ptr %dst, ptr %src, i64 %j.st
752737; CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr [[ARRAYIDX1_I]], align 8
753738; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i64 [[TMP2]], [[TMP3]]
754739; CHECK-NEXT: [[CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
755- ; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_END:%.*]], label [[SELECT_FALSE:%.*]]
756- ; CHECK: select.false:
757- ; CHECK-NEXT: br label [[SELECT_END]]
740+ ; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_END1]], label [[SELECT_FALSE:%.*]]
741+ ; CHECK: select.false.sink:
742+ ; CHECK-NEXT: [[TMP5:%.*]] = sub nsw i64 [[J]], -1
743+ ; CHECK-NEXT: br label [[SELECT_END1]]
758744; CHECK: select.end:
759745; CHECK-NEXT: [[DOTSINK:%.*]] = phi ptr [ [[TMP0]], [[LOOP]] ], [ [[TMP1]], [[SELECT_FALSE]] ]
746+ ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[J]], [[LOOP]] ], [ [[TMP5]], [[SELECT_FALSE]] ]
760747; CHECK-NEXT: [[NOT_CMP3:%.*]] = xor i1 [[CMP3]], true
761748; CHECK-NEXT: [[DEC:%.*]] = sext i1 [[NOT_CMP3]] to i64
762- ; CHECK-NEXT: [[NOT_CMP3_FROZEN:%.*]] = freeze i1 [[NOT_CMP3]]
763- ; CHECK-NEXT: [[TMP5:%.*]] = sub i64 [[J]], -1
764- ; CHECK-NEXT: br i1 [[NOT_CMP3_FROZEN]], label [[SELECT_END1]], label [[SELECT_FALSE2:%.*]]
765- ; CHECK: select.false2:
766- ; CHECK-NEXT: br label [[SELECT_END1]]
767- ; CHECK: select.end1:
768- ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP5]], [[SELECT_END]] ], [ [[J]], [[SELECT_FALSE2]] ]
769749; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
770750; CHECK-NEXT: store ptr [[DOTSINK]], ptr [[TMP4]], align 8
771751; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
0 commit comments