@@ -7,16 +7,22 @@ define void @test_add_zext(ptr %dst, ptr %src, i64 %j.start, i64 %p, i64 %i.star
7
7
; CHECK-NEXT: entry:
8
8
; CHECK-NEXT: br label [[LOOP:%.*]]
9
9
; CHECK: loop:
10
- ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP ]] ]
11
- ; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[HIGH:%.*]], [[ENTRY]] ], [ [[J_NEXT:%.*]], [[LOOP ]] ]
12
- ; CHECK-NEXT: [[I:%.*]] = phi i64 [ [[I_START:%.*]], [[ENTRY]] ], [ [[J_NEXT]], [[LOOP ]] ]
10
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[SELECT_END:%.* ]] ]
11
+ ; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[HIGH:%.*]], [[ENTRY]] ], [ [[J_NEXT:%.*]], [[SELECT_END ]] ]
12
+ ; CHECK-NEXT: [[I:%.*]] = phi i64 [ [[I_START:%.*]], [[ENTRY]] ], [ [[J_NEXT]], [[SELECT_END ]] ]
13
13
; CHECK-NEXT: [[GEP_I:%.*]] = getelementptr inbounds ptr, ptr [[SRC:%.*]], i64 [[I]]
14
14
; CHECK-NEXT: [[L_I:%.*]] = load ptr, ptr [[GEP_I]], align 8
15
15
; CHECK-NEXT: [[GEP_J:%.*]] = getelementptr inbounds ptr, ptr [[SRC]], i64 [[J]]
16
16
; CHECK-NEXT: [[L_J:%.*]] = load ptr, ptr [[GEP_J]], align 8
17
17
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
18
18
; CHECK-NEXT: [[DEC:%.*]] = zext i1 [[CMP3]] to i64
19
- ; CHECK-NEXT: [[J_NEXT]] = add nsw i64 [[J]], [[DEC]]
19
+ ; CHECK-NEXT: [[CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
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
+ ; CHECK-NEXT: br label [[SELECT_END]]
24
+ ; CHECK: select.end:
25
+ ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[SELECT_TRUE_SINK]] ], [ [[J]], [[LOOP]] ]
20
26
; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
21
27
; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
22
28
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
@@ -54,20 +60,26 @@ define void @test_add_zext_first_op(ptr %dst, ptr %src, i64 %j.start, i64 %p, i6
54
60
; CHECK-NEXT: entry:
55
61
; CHECK-NEXT: br label [[LOOP:%.*]]
56
62
; CHECK: loop:
57
- ; CHECK-NEXT: [[IV :%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP ]] ]
58
- ; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[J_START:%.*]], [[ENTRY]] ], [ [[J_NEXT:%.*]], [[LOOP ]] ]
59
- ; CHECK-NEXT: [[I :%.*]] = phi i64 [ [[I_START:%.*]], [[ENTRY]] ], [ [[J_NEXT]], [[LOOP ]] ]
60
- ; CHECK-NEXT: [[GEP_I :%.*]] = getelementptr inbounds ptr, ptr [[SRC :%.*]], i64 [[I ]]
61
- ; CHECK-NEXT: [[L_I:%.*]] = load ptr, ptr [[GEP_I ]], align 8
62
- ; 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]]
63
69
; CHECK-NEXT: [[L_J:%.*]] = load ptr, ptr [[GEP_J]], align 8
64
70
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
65
71
; CHECK-NEXT: [[DEC:%.*]] = zext i1 [[CMP3]] to i64
66
- ; CHECK-NEXT: [[J_NEXT]] = add nsw i64 [[DEC]], [[J]]
67
- ; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
68
- ; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
69
- ; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
70
- ; 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]]
71
83
; CHECK-NEXT: br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]
72
84
; CHECK: exit:
73
85
; CHECK-NEXT: ret void
@@ -101,17 +113,23 @@ define void @test_add_zext_not(ptr %dst, ptr %src, i64 %j.start, i64 %p, i64 %i.
101
113
; CHECK-NEXT: entry:
102
114
; CHECK-NEXT: br label [[LOOP:%.*]]
103
115
; CHECK: loop:
104
- ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP ]] ]
105
- ; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[J_START:%.*]], [[ENTRY]] ], [ [[J_NEXT:%.*]], [[LOOP ]] ]
106
- ; CHECK-NEXT: [[I:%.*]] = phi i64 [ [[I_START:%.*]], [[ENTRY]] ], [ [[J_NEXT]], [[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 ]] ]
107
119
; CHECK-NEXT: [[GEP_I:%.*]] = getelementptr inbounds ptr, ptr [[SRC:%.*]], i64 [[I]]
108
120
; CHECK-NEXT: [[L_I:%.*]] = load ptr, ptr [[GEP_I]], align 8
109
121
; CHECK-NEXT: [[GEP_J:%.*]] = getelementptr inbounds ptr, ptr [[SRC]], i64 [[J]]
110
122
; CHECK-NEXT: [[L_J:%.*]] = load ptr, ptr [[GEP_J]], align 8
111
123
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
112
124
; CHECK-NEXT: [[NOT_CMP3:%.*]] = xor i1 [[CMP3]], true
113
125
; CHECK-NEXT: [[DEC:%.*]] = zext i1 [[NOT_CMP3]] to i64
114
- ; CHECK-NEXT: [[J_NEXT]] = add nsw i64 [[J]], [[DEC]]
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
130
+ ; CHECK-NEXT: br label [[SELECT_END]]
131
+ ; CHECK: select.end:
132
+ ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[J]], [[LOOP]] ], [ [[TMP0]], [[SELECT_FALSE_SINK]] ]
115
133
; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
116
134
; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
117
135
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
@@ -356,16 +374,22 @@ define void @test_sub_zext(ptr %dst, ptr %src, i64 %j.start, i64 %p, i64 %i.star
356
374
; CHECK-NEXT: entry:
357
375
; CHECK-NEXT: br label [[LOOP:%.*]]
358
376
; CHECK: loop:
359
- ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP ]] ]
360
- ; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[HIGH:%.*]], [[ENTRY]] ], [ [[J_NEXT:%.*]], [[LOOP ]] ]
361
- ; CHECK-NEXT: [[I:%.*]] = phi i64 [ [[I_START:%.*]], [[ENTRY]] ], [ [[J_NEXT]], [[LOOP ]] ]
377
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[SELECT_END:%.* ]] ]
378
+ ; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[HIGH:%.*]], [[ENTRY]] ], [ [[J_NEXT:%.*]], [[SELECT_END ]] ]
379
+ ; CHECK-NEXT: [[I:%.*]] = phi i64 [ [[I_START:%.*]], [[ENTRY]] ], [ [[J_NEXT]], [[SELECT_END ]] ]
362
380
; CHECK-NEXT: [[GEP_I:%.*]] = getelementptr inbounds ptr, ptr [[SRC:%.*]], i64 [[I]]
363
381
; CHECK-NEXT: [[L_I:%.*]] = load ptr, ptr [[GEP_I]], align 8
364
382
; CHECK-NEXT: [[GEP_J:%.*]] = getelementptr inbounds ptr, ptr [[SRC]], i64 [[J]]
365
383
; CHECK-NEXT: [[L_J:%.*]] = load ptr, ptr [[GEP_J]], align 8
366
384
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
367
385
; CHECK-NEXT: [[DEC:%.*]] = zext i1 [[CMP3]] to i64
368
- ; CHECK-NEXT: [[J_NEXT]] = sub nsw i64 [[J]], [[DEC]]
386
+ ; CHECK-NEXT: [[CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
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
390
+ ; CHECK-NEXT: br label [[SELECT_END]]
391
+ ; CHECK: select.end:
392
+ ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[SELECT_TRUE_SINK]] ], [ [[J]], [[LOOP]] ]
369
393
; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
370
394
; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
371
395
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
@@ -403,20 +427,26 @@ define void @test_sub_zext_first_op(ptr %dst, ptr %src, i64 %j.start, i64 %p, i6
403
427
; CHECK-NEXT: entry:
404
428
; CHECK-NEXT: br label [[LOOP:%.*]]
405
429
; CHECK: loop:
406
- ; CHECK-NEXT: [[IV :%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP ]] ]
407
- ; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[J_START:%.*]], [[ENTRY]] ], [ [[J_NEXT:%.*]], [[LOOP ]] ]
408
- ; CHECK-NEXT: [[I :%.*]] = phi i64 [ [[I_START:%.*]], [[ENTRY]] ], [ [[J_NEXT]], [[LOOP ]] ]
409
- ; CHECK-NEXT: [[GEP_I :%.*]] = getelementptr inbounds ptr, ptr [[SRC :%.*]], i64 [[I ]]
410
- ; CHECK-NEXT: [[L_I:%.*]] = load ptr, ptr [[GEP_I ]], align 8
411
- ; 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]]
412
436
; CHECK-NEXT: [[L_J:%.*]] = load ptr, ptr [[GEP_J]], align 8
413
437
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
414
438
; CHECK-NEXT: [[DEC:%.*]] = zext i1 [[CMP3]] to i64
415
- ; CHECK-NEXT: [[J_NEXT]] = sub nsw i64 [[DEC]], [[J]]
416
- ; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
417
- ; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
418
- ; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
419
- ; 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]]
420
450
; CHECK-NEXT: br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]
421
451
; CHECK: exit:
422
452
; CHECK-NEXT: ret void
@@ -450,17 +480,23 @@ define void @test_sub_zext_not(ptr %dst, ptr %src, i64 %j.start, i64 %p, i64 %i.
450
480
; CHECK-NEXT: entry:
451
481
; CHECK-NEXT: br label [[LOOP:%.*]]
452
482
; CHECK: loop:
453
- ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP ]] ]
454
- ; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[J_START:%.*]], [[ENTRY]] ], [ [[J_NEXT:%.*]], [[LOOP ]] ]
455
- ; CHECK-NEXT: [[I:%.*]] = phi i64 [ [[I_START:%.*]], [[ENTRY]] ], [ [[J_NEXT]], [[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 ]] ]
456
486
; CHECK-NEXT: [[GEP_I:%.*]] = getelementptr inbounds ptr, ptr [[SRC:%.*]], i64 [[I]]
457
487
; CHECK-NEXT: [[L_I:%.*]] = load ptr, ptr [[GEP_I]], align 8
458
488
; CHECK-NEXT: [[GEP_J:%.*]] = getelementptr inbounds ptr, ptr [[SRC]], i64 [[J]]
459
489
; CHECK-NEXT: [[L_J:%.*]] = load ptr, ptr [[GEP_J]], align 8
460
490
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
461
491
; CHECK-NEXT: [[NOT_CMP3:%.*]] = xor i1 [[CMP3]], true
462
492
; CHECK-NEXT: [[DEC:%.*]] = zext i1 [[NOT_CMP3]] to i64
463
- ; CHECK-NEXT: [[J_NEXT]] = sub nsw i64 [[J]], [[DEC]]
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
497
+ ; CHECK-NEXT: br label [[SELECT_END]]
498
+ ; CHECK: select.end:
499
+ ; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[J]], [[LOOP]] ], [ [[TMP0]], [[SELECT_FALSE_SINK]] ]
464
500
; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
465
501
; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
466
502
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
0 commit comments