@@ -17,12 +17,12 @@ define void @test_add_zext(ptr %dst, ptr %src, i64 %j.start, i64 %p, i64 %i.star
17
17
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
18
18
; CHECK-NEXT: [[DEC:%.*]] = zext i1 [[CMP3]] to i64
19
19
; 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
23
23
; CHECK-NEXT: br label [[SELECT_END]]
24
24
; 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 ]] ]
26
26
; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
27
27
; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
28
28
; 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
60
60
; CHECK-NEXT: entry:
61
61
; CHECK-NEXT: br label [[LOOP:%.*]]
62
62
; 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]]
69
69
; CHECK-NEXT: [[L_J:%.*]] = load ptr, ptr [[GEP_J]], align 8
70
70
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
71
71
; 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]]
77
83
; CHECK-NEXT: br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]
78
84
; CHECK: exit:
79
85
; 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.
107
113
; CHECK-NEXT: entry:
108
114
; CHECK-NEXT: br label [[LOOP:%.*]]
109
115
; 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]] ]
110
119
; CHECK-NEXT: [[GEP_I:%.*]] = getelementptr inbounds ptr, ptr [[SRC:%.*]], i64 [[I]]
111
120
; CHECK-NEXT: [[L_I:%.*]] = load ptr, ptr [[GEP_I]], align 8
112
121
; CHECK-NEXT: [[GEP_J:%.*]] = getelementptr inbounds ptr, ptr [[SRC]], i64 [[J]]
113
122
; CHECK-NEXT: [[L_J:%.*]] = load ptr, ptr [[GEP_J]], align 8
114
123
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
115
124
; CHECK-NEXT: [[NOT_CMP3:%.*]] = xor i1 [[CMP3]], true
116
125
; 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
121
130
; CHECK-NEXT: br label [[SELECT_END]]
122
131
; 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 ]] ]
124
133
; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
125
134
; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
126
135
; 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
375
384
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
376
385
; CHECK-NEXT: [[DEC:%.*]] = zext i1 [[CMP3]] to i64
377
386
; 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
381
390
; CHECK-NEXT: br label [[SELECT_END]]
382
391
; 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 ]] ]
384
393
; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
385
394
; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
386
395
; 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
418
427
; CHECK-NEXT: entry:
419
428
; CHECK-NEXT: br label [[LOOP:%.*]]
420
429
; 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]]
427
436
; CHECK-NEXT: [[L_J:%.*]] = load ptr, ptr [[GEP_J]], align 8
428
437
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
429
438
; 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]]
435
450
; CHECK-NEXT: br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]
436
451
; CHECK: exit:
437
452
; 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.
465
480
; CHECK-NEXT: entry:
466
481
; CHECK-NEXT: br label [[LOOP:%.*]]
467
482
; 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]] ]
468
486
; CHECK-NEXT: [[GEP_I:%.*]] = getelementptr inbounds ptr, ptr [[SRC:%.*]], i64 [[I]]
469
487
; CHECK-NEXT: [[L_I:%.*]] = load ptr, ptr [[GEP_I]], align 8
470
488
; CHECK-NEXT: [[GEP_J:%.*]] = getelementptr inbounds ptr, ptr [[SRC]], i64 [[J]]
471
489
; CHECK-NEXT: [[L_J:%.*]] = load ptr, ptr [[GEP_J]], align 8
472
490
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
473
491
; CHECK-NEXT: [[NOT_CMP3:%.*]] = xor i1 [[CMP3]], true
474
492
; 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
479
497
; CHECK-NEXT: br label [[SELECT_END]]
480
498
; 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 ]] ]
482
500
; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
483
501
; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
484
502
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
0 commit comments