@@ -54,6 +54,129 @@ else:
54
54
ret i1 %res.4
55
55
}
56
56
57
+ define i1 @assume_dominates_with_may_unwind_call_before_assume (i8 %a , i8 %b , i1 %c ) {
58
+ ; CHECK-LABEL: @assume_dominates_with_may_unwind_call_before_assume(
59
+ ; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[A:%.*]], 1
60
+ ; CHECK-NEXT: [[CMP_1:%.*]] = icmp ule i8 [[ADD_1]], [[B:%.*]]
61
+ ; CHECK-NEXT: call void @may_unwind()
62
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_1]])
63
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]
64
+ ; CHECK: then:
65
+ ; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[ADD_1]], [[B]]
66
+ ; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[A]], [[B]]
67
+ ; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[T_2]]
68
+ ; CHECK-NEXT: [[ADD_2:%.*]] = add nuw nsw i8 [[A]], 2
69
+ ; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[ADD_2]], [[B]]
70
+ ; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_1]]
71
+ ; CHECK-NEXT: ret i1 [[RES_2]]
72
+ ; CHECK: else:
73
+ ; CHECK-NEXT: [[T_3:%.*]] = icmp ule i8 [[ADD_1]], [[B]]
74
+ ; CHECK-NEXT: [[T_4:%.*]] = icmp ule i8 [[A]], [[B]]
75
+ ; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[T_3]], [[T_4]]
76
+ ; CHECK-NEXT: [[ADD_2_1:%.*]] = add nuw nsw i8 [[A]], 2
77
+ ; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[ADD_2_1]], [[B]]
78
+ ; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_2]]
79
+ ; CHECK-NEXT: ret i1 [[RES_4]]
80
+ ;
81
+ %add.1 = add nsw nuw i8 %a , 1
82
+ %cmp.1 = icmp ule i8 %add.1 , %b
83
+ call void @may_unwind ()
84
+ call void @llvm.assume (i1 %cmp.1 )
85
+ br i1 %c , label %then , label %else
86
+
87
+ then:
88
+ %t.1 = icmp ule i8 %add.1 , %b
89
+ %t.2 = icmp ule i8 %a , %b
90
+ %res.1 = xor i1 %t.1 , %t.2
91
+ %add.2 = add nsw nuw i8 %a , 2
92
+ %c.1 = icmp ule i8 %add.2 , %b
93
+ %res.2 = xor i1 %res.1 , %c.1
94
+ ret i1 %res.2
95
+
96
+ else:
97
+ %t.3 = icmp ule i8 %add.1 , %b
98
+ %t.4 = icmp ule i8 %a , %b
99
+ %res.3 = xor i1 %t.3 , %t.4
100
+ %add.2.1 = add nsw nuw i8 %a , 2
101
+ %c.2 = icmp ule i8 %add.2.1 , %b
102
+ %res.4 = xor i1 %res.3 , %c.2
103
+ ret i1 %res.4
104
+ }
105
+
106
+ define i1 @assume_dominates_with_may_unwind_call_after_assume (i8 %a , i8 %b , i1 %c ) {
107
+ ; CHECK-LABEL: @assume_dominates_with_may_unwind_call_after_assume(
108
+ ; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[A:%.*]], 1
109
+ ; CHECK-NEXT: [[CMP_1:%.*]] = icmp ule i8 [[ADD_1]], [[B:%.*]]
110
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_1]])
111
+ ; CHECK-NEXT: call void @may_unwind()
112
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]
113
+ ; CHECK: then:
114
+ ; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[ADD_1]], [[B]]
115
+ ; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[A]], [[B]]
116
+ ; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[T_2]]
117
+ ; CHECK-NEXT: [[ADD_2:%.*]] = add nuw nsw i8 [[A]], 2
118
+ ; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[ADD_2]], [[B]]
119
+ ; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_1]]
120
+ ; CHECK-NEXT: ret i1 [[RES_2]]
121
+ ; CHECK: else:
122
+ ; CHECK-NEXT: [[T_3:%.*]] = icmp ule i8 [[ADD_1]], [[B]]
123
+ ; CHECK-NEXT: [[T_4:%.*]] = icmp ule i8 [[A]], [[B]]
124
+ ; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[T_3]], [[T_4]]
125
+ ; CHECK-NEXT: [[ADD_2_1:%.*]] = add nuw nsw i8 [[A]], 2
126
+ ; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[ADD_2_1]], [[B]]
127
+ ; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_2]]
128
+ ; CHECK-NEXT: ret i1 [[RES_4]]
129
+ ;
130
+ %add.1 = add nsw nuw i8 %a , 1
131
+ %cmp.1 = icmp ule i8 %add.1 , %b
132
+ call void @llvm.assume (i1 %cmp.1 )
133
+ call void @may_unwind ()
134
+ br i1 %c , label %then , label %else
135
+
136
+ then:
137
+ %t.1 = icmp ule i8 %add.1 , %b
138
+ %t.2 = icmp ule i8 %a , %b
139
+ %res.1 = xor i1 %t.1 , %t.2
140
+ %add.2 = add nsw nuw i8 %a , 2
141
+ %c.1 = icmp ule i8 %add.2 , %b
142
+ %res.2 = xor i1 %res.1 , %c.1
143
+ ret i1 %res.2
144
+
145
+ else:
146
+ %t.3 = icmp ule i8 %add.1 , %b
147
+ %t.4 = icmp ule i8 %a , %b
148
+ %res.3 = xor i1 %t.3 , %t.4
149
+ %add.2.1 = add nsw nuw i8 %a , 2
150
+ %c.2 = icmp ule i8 %add.2.1 , %b
151
+ %res.4 = xor i1 %res.3 , %c.2
152
+ ret i1 %res.4
153
+ }
154
+
155
+ define i1 @assume_single_bb (i8 %a , i8 %b , i1 %c ) {
156
+ ; CHECK-LABEL: @assume_single_bb(
157
+ ; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[A:%.*]], 1
158
+ ; CHECK-NEXT: [[CMP_1:%.*]] = icmp ule i8 [[ADD_1]], [[B:%.*]]
159
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_1]])
160
+ ; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[ADD_1]], [[B]]
161
+ ; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[A]], [[B]]
162
+ ; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[T_2]]
163
+ ; CHECK-NEXT: [[ADD_2:%.*]] = add nuw nsw i8 [[A]], 2
164
+ ; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[ADD_2]], [[B]]
165
+ ; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_1]]
166
+ ; CHECK-NEXT: ret i1 [[RES_2]]
167
+ ;
168
+ %add.1 = add nsw nuw i8 %a , 1
169
+ %cmp.1 = icmp ule i8 %add.1 , %b
170
+ call void @llvm.assume (i1 %cmp.1 )
171
+ %t.1 = icmp ule i8 %add.1 , %b
172
+ %t.2 = icmp ule i8 %a , %b
173
+ %res.1 = xor i1 %t.1 , %t.2
174
+ %add.2 = add nsw nuw i8 %a , 2
175
+ %c.1 = icmp ule i8 %add.2 , %b
176
+ %res.2 = xor i1 %res.1 , %c.1
177
+ ret i1 %res.2
178
+ }
179
+
57
180
define i1 @assume_same_bb (i8 %a , i8 %b , i1 %c ) {
58
181
; CHECK-LABEL: @assume_same_bb(
59
182
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[A:%.*]], 1
@@ -101,7 +224,6 @@ else:
101
224
ret i1 %res.4
102
225
}
103
226
104
-
105
227
define i1 @assume_same_bb2 (i8 %a , i8 %b , i1 %c ) {
106
228
; CHECK-LABEL: @assume_same_bb2(
107
229
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[A:%.*]], 1
@@ -270,3 +392,97 @@ define i1 @assume_same_bb_after_condition_may_unwind_between(i8 %a, i8 %b, i1 %c
270
392
exit:
271
393
ret i1 %res.2
272
394
}
395
+
396
+ ; The information of from the assume can be used to simplify %t.2.
397
+ define i1 @assume_single_bb_conditions_after_assume (i8 %a , i8 %b , i1 %c ) {
398
+ ; CHECK-LABEL: @assume_single_bb_conditions_after_assume(
399
+ ; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[A:%.*]], 1
400
+ ; CHECK-NEXT: [[CMP_1:%.*]] = icmp ule i8 [[ADD_1]], [[B:%.*]]
401
+ ; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[ADD_1]], [[B]]
402
+ ; CHECK-NEXT: call void @use(i1 [[C_1]])
403
+ ; CHECK-NEXT: call void @may_unwind()
404
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_1]])
405
+ ; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[A]], [[B]]
406
+ ; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_1]], [[T_2]]
407
+ ; CHECK-NEXT: [[ADD_2:%.*]] = add nuw nsw i8 [[A]], 2
408
+ ; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[ADD_2]], [[B]]
409
+ ; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]]
410
+ ; CHECK-NEXT: ret i1 [[RES_2]]
411
+ ;
412
+ %add.1 = add nsw nuw i8 %a , 1
413
+ %cmp.1 = icmp ule i8 %add.1 , %b
414
+ %c.1 = icmp ule i8 %add.1 , %b
415
+ call void @use (i1 %c.1 )
416
+
417
+ call void @may_unwind ()
418
+ call void @llvm.assume (i1 %cmp.1 )
419
+ %t.2 = icmp ule i8 %a , %b
420
+ %res.1 = xor i1 %c.1 , %t.2
421
+ %add.2 = add nsw nuw i8 %a , 2
422
+ %c.2 = icmp ule i8 %add.2 , %b
423
+ %res.2 = xor i1 %res.1 , %c.2
424
+ ret i1 %res.2
425
+ }
426
+
427
+ ; The information of from the assume can be used to simplify %t.2.
428
+ define i1 @assume_single_bb_assume_at_end_after_may_unwind (i8 %a , i8 %b , i1 %c ) {
429
+ ; CHECK-LABEL: @assume_single_bb_assume_at_end_after_may_unwind(
430
+ ; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[A:%.*]], 1
431
+ ; CHECK-NEXT: [[CMP_1:%.*]] = icmp ule i8 [[ADD_1]], [[B:%.*]]
432
+ ; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[ADD_1]], [[B]]
433
+ ; CHECK-NEXT: call void @use(i1 [[C_1]])
434
+ ; CHECK-NEXT: call void @may_unwind()
435
+ ; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[A]], [[B]]
436
+ ; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_1]], [[T_2]]
437
+ ; CHECK-NEXT: [[ADD_2:%.*]] = add nuw nsw i8 [[A]], 2
438
+ ; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[ADD_2]], [[B]]
439
+ ; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]]
440
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_1]])
441
+ ; CHECK-NEXT: ret i1 [[RES_2]]
442
+ ;
443
+ %add.1 = add nsw nuw i8 %a , 1
444
+ %cmp.1 = icmp ule i8 %add.1 , %b
445
+ %c.1 = icmp ule i8 %add.1 , %b
446
+ call void @use (i1 %c.1 )
447
+
448
+ call void @may_unwind ()
449
+ %t.2 = icmp ule i8 %a , %b
450
+ %res.1 = xor i1 %c.1 , %t.2
451
+ %add.2 = add nsw nuw i8 %a , 2
452
+ %c.2 = icmp ule i8 %add.2 , %b
453
+ %res.2 = xor i1 %res.1 , %c.2
454
+ call void @llvm.assume (i1 %cmp.1 )
455
+ ret i1 %res.2
456
+ }
457
+
458
+ ; The definition of %t.2 is before the @llvm.assume call, but all uses are
459
+ ; after the call. %t.2 can be simplified.
460
+ define i1 @all_uses_after_assume (i8 %a , i8 %b , i1 %c ) {
461
+ ; CHECK-LABEL: @all_uses_after_assume(
462
+ ; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[A:%.*]], 1
463
+ ; CHECK-NEXT: [[CMP_1:%.*]] = icmp ule i8 [[ADD_1]], [[B:%.*]]
464
+ ; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[ADD_1]], [[B]]
465
+ ; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[A]], [[B]]
466
+ ; CHECK-NEXT: call void @use(i1 [[C_1]])
467
+ ; CHECK-NEXT: call void @may_unwind()
468
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_1]])
469
+ ; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_1]], [[T_2]]
470
+ ; CHECK-NEXT: [[ADD_2:%.*]] = add nuw nsw i8 [[A]], 2
471
+ ; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[ADD_2]], [[B]]
472
+ ; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]]
473
+ ; CHECK-NEXT: ret i1 [[RES_2]]
474
+ ;
475
+ %add.1 = add nsw nuw i8 %a , 1
476
+ %cmp.1 = icmp ule i8 %add.1 , %b
477
+ %c.1 = icmp ule i8 %add.1 , %b
478
+ %t.2 = icmp ule i8 %a , %b
479
+ call void @use (i1 %c.1 )
480
+
481
+ call void @may_unwind ()
482
+ call void @llvm.assume (i1 %cmp.1 )
483
+ %res.1 = xor i1 %c.1 , %t.2
484
+ %add.2 = add nsw nuw i8 %a , 2
485
+ %c.2 = icmp ule i8 %add.2 , %b
486
+ %res.2 = xor i1 %res.1 , %c.2
487
+ ret i1 %res.2
488
+ }
0 commit comments