@@ -17,12 +17,12 @@ define void @test_add_zext(ptr %dst, ptr %src, i64 %j.start, i64 %p, i64 %i.star
1717; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
1818; CHECK-NEXT: [[DEC:%.*]] = zext i1 [[CMP3]] to i64
1919; CHECK-NEXT: [[CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
20- ; CHECK-NEXT: [[TMP0 :%.*]] = add i64 [[J]], 1
21- ; CHECK-NEXT : br i1 [[CMP3_FROZEN]], label [[SELECT_END]], label [[SELECT_FALSE:%.*]]
22- ; CHECK: select.false:
20+ ; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_TRUE_SINK :%.*]], label [[SELECT_END]]
21+ ; CHECK: select.true.sink:
22+ ; CHECK-NEXT : [[TMP0:%.*]] = add nsw i64 [[J]], 1
2323; CHECK-NEXT: br label [[SELECT_END]]
2424; CHECK: select.end:
25- ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[LOOP ]] ], [ [[J]], [[SELECT_FALSE ]] ]
25+ ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[SELECT_TRUE_SINK ]] ], [ [[J]], [[LOOP ]] ]
2626; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
2727; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
2828; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
@@ -60,20 +60,26 @@ define void @test_add_zext_first_op(ptr %dst, ptr %src, i64 %j.start, i64 %p, i6
6060; CHECK-NEXT: entry:
6161; CHECK-NEXT: br label [[LOOP:%.*]]
6262; CHECK: loop:
63- ; CHECK-NEXT: [[IV :%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP ]] ]
64- ; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[J_START:%.*]], [[ENTRY]] ], [ [[J_NEXT:%.*]], [[LOOP ]] ]
65- ; CHECK-NEXT: [[I :%.*]] = phi i64 [ [[I_START:%.*]], [[ENTRY]] ], [ [[J_NEXT]], [[LOOP ]] ]
66- ; CHECK-NEXT: [[GEP_I :%.*]] = getelementptr inbounds ptr, ptr [[SRC :%.*]], i64 [[I ]]
67- ; CHECK-NEXT: [[L_I:%.*]] = load ptr, ptr [[GEP_I ]], align 8
68- ; CHECK-NEXT: [[GEP_J:%.*]] = getelementptr inbounds ptr, ptr [[SRC ]], i64 [[J]]
63+ ; CHECK-NEXT: [[IV1 :%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[SELECT_END:%.* ]] ]
64+ ; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[J_START:%.*]], [[ENTRY]] ], [ [[J_NEXT:%.*]], [[SELECT_END ]] ]
65+ ; CHECK-NEXT: [[IV :%.*]] = phi i64 [ [[I_START:%.*]], [[ENTRY]] ], [ [[J_NEXT]], [[SELECT_END ]] ]
66+ ; CHECK-NEXT: [[GEP_DST :%.*]] = getelementptr inbounds ptr, ptr [[DST :%.*]], i64 [[IV ]]
67+ ; CHECK-NEXT: [[L_I:%.*]] = load ptr, ptr [[GEP_DST ]], align 8
68+ ; CHECK-NEXT: [[GEP_J:%.*]] = getelementptr inbounds ptr, ptr [[DST ]], i64 [[J]]
6969; CHECK-NEXT: [[L_J:%.*]] = load ptr, ptr [[GEP_J]], align 8
7070; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
7171; CHECK-NEXT: [[DEC:%.*]] = zext i1 [[CMP3]] to i64
72- ; CHECK-NEXT: [[J_NEXT]] = add nsw i64 [[DEC]], [[J]]
73- ; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
74- ; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
75- ; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
76- ; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV]], [[J_START]]
72+ ; CHECK-NEXT: [[CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
73+ ; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_TRUE_SINK:%.*]], label [[SELECT_END]]
74+ ; CHECK: select.true.sink:
75+ ; CHECK-NEXT: [[TMP0:%.*]] = add nsw i64 1, [[J]]
76+ ; CHECK-NEXT: br label [[SELECT_END]]
77+ ; CHECK: select.end:
78+ ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[SELECT_TRUE_SINK]] ], [ [[J]], [[LOOP]] ]
79+ ; CHECK-NEXT: [[GEP_DST1:%.*]] = getelementptr inbounds ptr, ptr [[DST1:%.*]], i64 [[IV1]]
80+ ; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST1]], align 8
81+ ; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV1]], 1
82+ ; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV1]], [[J_START]]
7783; CHECK-NEXT: br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]
7884; CHECK: exit:
7985; CHECK-NEXT: ret void
@@ -107,20 +113,23 @@ define void @test_add_zext_not(ptr %dst, ptr %src, i64 %j.start, i64 %p, i64 %i.
107113; CHECK-NEXT: entry:
108114; CHECK-NEXT: br label [[LOOP:%.*]]
109115; CHECK: loop:
116+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[SELECT_END:%.*]] ]
117+ ; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[J_START:%.*]], [[ENTRY]] ], [ [[J_NEXT:%.*]], [[SELECT_END]] ]
118+ ; CHECK-NEXT: [[I:%.*]] = phi i64 [ [[I_START:%.*]], [[ENTRY]] ], [ [[J_NEXT]], [[SELECT_END]] ]
110119; CHECK-NEXT: [[GEP_I:%.*]] = getelementptr inbounds ptr, ptr [[SRC:%.*]], i64 [[I]]
111120; CHECK-NEXT: [[L_I:%.*]] = load ptr, ptr [[GEP_I]], align 8
112121; CHECK-NEXT: [[GEP_J:%.*]] = getelementptr inbounds ptr, ptr [[SRC]], i64 [[J]]
113122; CHECK-NEXT: [[L_J:%.*]] = load ptr, ptr [[GEP_J]], align 8
114123; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
115124; CHECK-NEXT: [[NOT_CMP3:%.*]] = xor i1 [[CMP3]], true
116125; CHECK-NEXT: [[DEC:%.*]] = zext i1 [[NOT_CMP3]] to i64
117- ; CHECK-NEXT: [[NOT_CMP3_FROZEN :%.*]] = freeze i1 [[NOT_CMP3 ]]
118- ; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[J ]], 1
119- ; CHECK-NEXT : br i1 [[NOT_CMP3_FROZEN]], label [[SELECT_END]], label [[SELECT_FALSE:%.*]]
120- ; CHECK: select.false:
126+ ; CHECK-NEXT: [[CMP3_FROZEN :%.*]] = freeze i1 [[CMP3 ]]
127+ ; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_END ]], label [[SELECT_FALSE_SINK:%.*]]
128+ ; CHECK: select.false.sink:
129+ ; CHECK-NEXT : [[TMP0:%.*]] = add nsw i64 [[J]], 1
121130; CHECK-NEXT: br label [[SELECT_END]]
122131; CHECK: select.end:
123- ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0 ]], [[LOOP]] ], [ [[J ]], [[SELECT_FALSE ]] ]
132+ ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[J ]], [[LOOP]] ], [ [[TMP0 ]], [[SELECT_FALSE_SINK ]] ]
124133; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
125134; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
126135; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
@@ -375,12 +384,12 @@ define void @test_sub_zext(ptr %dst, ptr %src, i64 %j.start, i64 %p, i64 %i.star
375384; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
376385; CHECK-NEXT: [[DEC:%.*]] = zext i1 [[CMP3]] to i64
377386; CHECK-NEXT: [[CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
378- ; CHECK-NEXT: [[TMP0 :%.*]] = sub i64 [[J]], 1
379- ; CHECK-NEXT : br i1 [[CMP3_FROZEN]], label [[SELECT_END]], label [[SELECT_FALSE:%.*]]
380- ; CHECK: select.false:
387+ ; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_TRUE_SINK :%.*]], label [[SELECT_END]]
388+ ; CHECK: select.true.sink:
389+ ; CHECK-NEXT : [[TMP0:%.*]] = sub nsw i64 [[J]], 1
381390; CHECK-NEXT: br label [[SELECT_END]]
382391; CHECK: select.end:
383- ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[LOOP ]] ], [ [[J]], [[SELECT_FALSE ]] ]
392+ ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[SELECT_TRUE_SINK ]] ], [ [[J]], [[LOOP ]] ]
384393; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
385394; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
386395; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
@@ -418,20 +427,26 @@ define void @test_sub_zext_first_op(ptr %dst, ptr %src, i64 %j.start, i64 %p, i6
418427; CHECK-NEXT: entry:
419428; CHECK-NEXT: br label [[LOOP:%.*]]
420429; CHECK: loop:
421- ; CHECK-NEXT: [[IV :%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP ]] ]
422- ; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[J_START:%.*]], [[ENTRY]] ], [ [[J_NEXT:%.*]], [[LOOP ]] ]
423- ; CHECK-NEXT: [[I :%.*]] = phi i64 [ [[I_START:%.*]], [[ENTRY]] ], [ [[J_NEXT]], [[LOOP ]] ]
424- ; CHECK-NEXT: [[GEP_I :%.*]] = getelementptr inbounds ptr, ptr [[SRC :%.*]], i64 [[I ]]
425- ; CHECK-NEXT: [[L_I:%.*]] = load ptr, ptr [[GEP_I ]], align 8
426- ; CHECK-NEXT: [[GEP_J:%.*]] = getelementptr inbounds ptr, ptr [[SRC ]], i64 [[J]]
430+ ; CHECK-NEXT: [[IV1 :%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[SELECT_END:%.* ]] ]
431+ ; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[J_START:%.*]], [[ENTRY]] ], [ [[J_NEXT:%.*]], [[SELECT_END ]] ]
432+ ; CHECK-NEXT: [[IV :%.*]] = phi i64 [ [[I_START:%.*]], [[ENTRY]] ], [ [[J_NEXT]], [[SELECT_END ]] ]
433+ ; CHECK-NEXT: [[GEP_DST :%.*]] = getelementptr inbounds ptr, ptr [[DST :%.*]], i64 [[IV ]]
434+ ; CHECK-NEXT: [[L_I:%.*]] = load ptr, ptr [[GEP_DST ]], align 8
435+ ; CHECK-NEXT: [[GEP_J:%.*]] = getelementptr inbounds ptr, ptr [[DST ]], i64 [[J]]
427436; CHECK-NEXT: [[L_J:%.*]] = load ptr, ptr [[GEP_J]], align 8
428437; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
429438; CHECK-NEXT: [[DEC:%.*]] = zext i1 [[CMP3]] to i64
430- ; CHECK-NEXT: [[J_NEXT]] = sub nsw i64 [[DEC]], [[J]]
431- ; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
432- ; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
433- ; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
434- ; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV]], [[J_START]]
439+ ; CHECK-NEXT: [[CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
440+ ; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_TRUE_SINK:%.*]], label [[SELECT_END]]
441+ ; CHECK: select.true.sink:
442+ ; CHECK-NEXT: [[TMP0:%.*]] = sub nsw i64 1, [[J]]
443+ ; CHECK-NEXT: br label [[SELECT_END]]
444+ ; CHECK: select.end:
445+ ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[SELECT_TRUE_SINK]] ], [ [[J]], [[LOOP]] ]
446+ ; CHECK-NEXT: [[GEP_DST1:%.*]] = getelementptr inbounds ptr, ptr [[DST1:%.*]], i64 [[IV1]]
447+ ; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST1]], align 8
448+ ; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV1]], 1
449+ ; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV1]], [[J_START]]
435450; CHECK-NEXT: br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]
436451; CHECK: exit:
437452; CHECK-NEXT: ret void
@@ -465,20 +480,23 @@ define void @test_sub_zext_not(ptr %dst, ptr %src, i64 %j.start, i64 %p, i64 %i.
465480; CHECK-NEXT: entry:
466481; CHECK-NEXT: br label [[LOOP:%.*]]
467482; CHECK: loop:
483+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[SELECT_END:%.*]] ]
484+ ; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[J_START:%.*]], [[ENTRY]] ], [ [[J_NEXT:%.*]], [[SELECT_END]] ]
485+ ; CHECK-NEXT: [[I:%.*]] = phi i64 [ [[I_START:%.*]], [[ENTRY]] ], [ [[J_NEXT]], [[SELECT_END]] ]
468486; CHECK-NEXT: [[GEP_I:%.*]] = getelementptr inbounds ptr, ptr [[SRC:%.*]], i64 [[I]]
469487; CHECK-NEXT: [[L_I:%.*]] = load ptr, ptr [[GEP_I]], align 8
470488; CHECK-NEXT: [[GEP_J:%.*]] = getelementptr inbounds ptr, ptr [[SRC]], i64 [[J]]
471489; CHECK-NEXT: [[L_J:%.*]] = load ptr, ptr [[GEP_J]], align 8
472490; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
473491; CHECK-NEXT: [[NOT_CMP3:%.*]] = xor i1 [[CMP3]], true
474492; CHECK-NEXT: [[DEC:%.*]] = zext i1 [[NOT_CMP3]] to i64
475- ; CHECK-NEXT: [[NOT_CMP3_FROZEN :%.*]] = freeze i1 [[NOT_CMP3 ]]
476- ; CHECK-NEXT: [[TMP0:%.*]] = sub i64 [[J ]], 1
477- ; CHECK-NEXT : br i1 [[NOT_CMP3_FROZEN]], label [[SELECT_END]], label [[SELECT_FALSE:%.*]]
478- ; CHECK: select.false:
493+ ; CHECK-NEXT: [[CMP3_FROZEN :%.*]] = freeze i1 [[CMP3 ]]
494+ ; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_END ]], label [[SELECT_FALSE_SINK:%.*]]
495+ ; CHECK: select.false.sink:
496+ ; CHECK-NEXT : [[TMP0:%.*]] = sub nsw i64 [[J]], 1
479497; CHECK-NEXT: br label [[SELECT_END]]
480498; CHECK: select.end:
481- ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0 ]], [[LOOP]] ], [ [[J ]], [[SELECT_FALSE ]] ]
499+ ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[J ]], [[LOOP]] ], [ [[TMP0 ]], [[SELECT_FALSE_SINK ]] ]
482500; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
483501; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
484502; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
0 commit comments