@@ -13,7 +13,7 @@ declare i8 @buz.fp(float, float)
13
13
define i8 @same_parent_combine_diff_attrs (i8 %x , i8 %y ) {
14
14
; CHECK-LABEL: define i8 @same_parent_combine_diff_attrs(
15
15
; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
16
- ; CHECK-NEXT: [[C1:%.*]] = call i8 @baz(i8 [[X]], i8 noundef [[Y]]) #[[ATTR0 :[0-9]+]]
16
+ ; CHECK-NEXT: [[C1:%.*]] = call i8 @baz(i8 [[X]], i8 noundef [[Y]]) #[[ATTR1 :[0-9]+]]
17
17
; CHECK-NEXT: [[R:%.*]] = call i8 @buz(i8 [[C1]], i8 [[C1]])
18
18
; CHECK-NEXT: ret i8 [[R]]
19
19
;
@@ -27,7 +27,7 @@ define i8 @same_parent_combine_diff_attrs(i8 %x, i8 %y) {
27
27
define i8 @same_parent_combine_diff_attrs_needs_intersect (i8 %x , i8 %y ) {
28
28
; CHECK-LABEL: define i8 @same_parent_combine_diff_attrs_needs_intersect(
29
29
; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
30
- ; CHECK-NEXT: [[C1:%.*]] = call ptr @baz.ptr(i8 [[X]], i8 noundef [[Y]]) #[[ATTR0 ]]
30
+ ; CHECK-NEXT: [[C1:%.*]] = call ptr @baz.ptr(i8 [[X]], i8 noundef [[Y]]) #[[ATTR1 ]]
31
31
; CHECK-NEXT: [[R:%.*]] = call i8 @buz.ptr(ptr [[C1]], ptr [[C1]])
32
32
; CHECK-NEXT: ret i8 [[R]]
33
33
;
@@ -41,7 +41,7 @@ define i8 @same_parent_combine_diff_attrs_needs_intersect(i8 %x, i8 %y) {
41
41
define i8 @same_parent_combine_diff_attrs_fmf (float %x , float %y ) {
42
42
; CHECK-LABEL: define i8 @same_parent_combine_diff_attrs_fmf(
43
43
; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) {
44
- ; CHECK-NEXT: [[C1:%.*]] = call nnan float @baz.fp(float [[X]], float noundef [[Y]]) #[[ATTR1 :[0-9]+]]
44
+ ; CHECK-NEXT: [[C1:%.*]] = call nnan float @baz.fp(float [[X]], float noundef [[Y]]) #[[ATTR2 :[0-9]+]]
45
45
; CHECK-NEXT: [[R:%.*]] = call i8 @buz.fp(float [[C1]], float [[C1]])
46
46
; CHECK-NEXT: ret i8 [[R]]
47
47
;
@@ -55,7 +55,7 @@ define i8 @same_parent_combine_diff_attrs_fmf(float %x, float %y) {
55
55
define i8 @same_parent_combine_diff_attrs_fmf2 (float %x , float %y ) {
56
56
; CHECK-LABEL: define i8 @same_parent_combine_diff_attrs_fmf2(
57
57
; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) {
58
- ; CHECK-NEXT: [[C1:%.*]] = call nnan float @baz.fp(float [[X]], float noundef [[Y]]) #[[ATTR0 ]]
58
+ ; CHECK-NEXT: [[C1:%.*]] = call nnan float @baz.fp(float [[X]], float noundef [[Y]]) #[[ATTR1 ]]
59
59
; CHECK-NEXT: [[R:%.*]] = call i8 @buz.fp(float [[C1]], float [[C1]])
60
60
; CHECK-NEXT: ret i8 [[R]]
61
61
;
@@ -69,7 +69,7 @@ define i8 @same_parent_combine_diff_attrs_fmf2(float %x, float %y) {
69
69
define i8 @same_parent_combine_diff_attrs_needs_intersect2 (i8 %x , i8 %y ) {
70
70
; CHECK-LABEL: define i8 @same_parent_combine_diff_attrs_needs_intersect2(
71
71
; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
72
- ; CHECK-NEXT: [[C1:%.*]] = call ptr @baz.ptr(i8 [[X]], i8 noundef [[Y]]) #[[ATTR1 ]]
72
+ ; CHECK-NEXT: [[C1:%.*]] = call ptr @baz.ptr(i8 [[X]], i8 noundef [[Y]]) #[[ATTR2 ]]
73
73
; CHECK-NEXT: [[R:%.*]] = call i8 @buz.ptr(ptr [[C1]], ptr [[C1]])
74
74
; CHECK-NEXT: ret i8 [[R]]
75
75
;
@@ -83,7 +83,7 @@ define i8 @same_parent_combine_diff_attrs_needs_intersect2(i8 %x, i8 %y) {
83
83
define i8 @same_parent_combine_diff_attrs_really_needs_intersect (i8 %x , i8 %y ) {
84
84
; CHECK-LABEL: define i8 @same_parent_combine_diff_attrs_really_needs_intersect(
85
85
; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
86
- ; CHECK-NEXT: [[C1:%.*]] = call ptr @baz.ptr(i8 [[X]], i8 noundef [[Y]]) #[[ATTR1 ]]
86
+ ; CHECK-NEXT: [[C1:%.*]] = call ptr @baz.ptr(i8 [[X]], i8 noundef [[Y]]) #[[ATTR2 ]]
87
87
; CHECK-NEXT: [[R:%.*]] = call i8 @buz.ptr(ptr [[C1]], ptr noundef [[C1]])
88
88
; CHECK-NEXT: ret i8 [[R]]
89
89
;
@@ -112,7 +112,7 @@ define i8 @same_parent_combine_diff_attrs_fail_side_effects(i8 %x, i8 %y) {
112
112
define i8 @same_parent_combine_diff_attrs_quasi_side_effects2 (i8 %x , i8 %y ) {
113
113
; CHECK-LABEL: define i8 @same_parent_combine_diff_attrs_quasi_side_effects2(
114
114
; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
115
- ; CHECK-NEXT: [[C1:%.*]] = call i8 @baz(i8 noundef [[X]], i8 noundef [[Y]]) #[[ATTR0 ]]
115
+ ; CHECK-NEXT: [[C1:%.*]] = call i8 @baz(i8 noundef [[X]], i8 noundef [[Y]]) #[[ATTR1 ]]
116
116
; CHECK-NEXT: [[C0:%.*]] = call i8 @baz(i8 [[X]], i8 noundef [[Y]])
117
117
; CHECK-NEXT: [[R:%.*]] = call i8 @buz(i8 [[C0]], i8 [[C1]])
118
118
; CHECK-NEXT: ret i8 [[R]]
@@ -127,10 +127,10 @@ define i8 @same_parent_combine_diff_attrs_quasi_side_effects2(i8 %x, i8 %y) {
127
127
define i8 @diff_parent_combine_diff_attrs (i1 %c , i8 %x , i8 %y ) {
128
128
; CHECK-LABEL: define i8 @diff_parent_combine_diff_attrs(
129
129
; CHECK-SAME: i1 [[C:%.*]], i8 [[X:%.*]], i8 [[Y:%.*]]) {
130
- ; CHECK-NEXT: [[C1:%.*]] = call i8 @baz(i8 [[X]], i8 noundef [[Y]]) #[[ATTR0 ]]
130
+ ; CHECK-NEXT: [[C1:%.*]] = call i8 @baz(i8 [[X]], i8 noundef [[Y]]) #[[ATTR1 ]]
131
131
; CHECK-NEXT: br i1 [[C]], label %[[T:.*]], label %[[F:.*]]
132
132
; CHECK: [[T]]:
133
- ; CHECK-NEXT: [[C0:%.*]] = call i8 @baz(i8 noundef [[X]], i8 noundef [[Y]]) #[[ATTR1 ]]
133
+ ; CHECK-NEXT: [[C0:%.*]] = call i8 @baz(i8 noundef [[X]], i8 noundef [[Y]]) #[[ATTR2 ]]
134
134
; CHECK-NEXT: [[R:%.*]] = call i8 @buz(i8 [[C0]], i8 [[C1]])
135
135
; CHECK-NEXT: ret i8 [[R]]
136
136
; CHECK: [[F]]:
151
151
define i8 @diff_parent_combine_diff_attrs_preserves_return_attrs (i1 %c , i8 %x , i8 %y ) {
152
152
; CHECK-LABEL: define i8 @diff_parent_combine_diff_attrs_preserves_return_attrs(
153
153
; CHECK-SAME: i1 [[C:%.*]], i8 [[X:%.*]], i8 [[Y:%.*]]) {
154
- ; CHECK-NEXT: [[C1:%.*]] = call nonnull ptr @baz.ptr(i8 [[X]], i8 noundef [[Y]]) #[[ATTR1 ]]
154
+ ; CHECK-NEXT: [[C1:%.*]] = call nonnull ptr @baz.ptr(i8 [[X]], i8 noundef [[Y]]) #[[ATTR2 ]]
155
155
; CHECK-NEXT: br i1 [[C]], label %[[T:.*]], label %[[F:.*]]
156
156
; CHECK: [[T]]:
157
157
; CHECK-NEXT: [[R:%.*]] = call i8 @buz.ptr(ptr [[C1]], ptr noundef [[C1]])
172
172
define i8 @same_parent_combine_diff_attrs_todo (i8 %x , i8 %y ) {
173
173
; CHECK-LABEL: define i8 @same_parent_combine_diff_attrs_todo(
174
174
; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
175
- ; CHECK-NEXT: [[C1:%.*]] = call i8 @baz(i8 [[X]], i8 noundef [[Y]]) #[[ATTR0 ]]
176
- ; CHECK-NEXT: [[C0:%.*]] = call i8 @baz(i8 noundef [[X]], i8 noundef [[Y]]) #[[ATTR2 :[0-9]+]]
175
+ ; CHECK-NEXT: [[C1:%.*]] = call i8 @baz(i8 [[X]], i8 noundef [[Y]]) #[[ATTR1 ]]
176
+ ; CHECK-NEXT: [[C0:%.*]] = call i8 @baz(i8 noundef [[X]], i8 noundef [[Y]]) #[[ATTR3 :[0-9]+]]
177
177
; CHECK-NEXT: [[R:%.*]] = call i8 @buz(i8 [[C0]], i8 [[C1]])
178
178
; CHECK-NEXT: ret i8 [[R]]
179
179
;
@@ -187,8 +187,8 @@ define i8 @same_parent_combine_diff_attrs_todo(i8 %x, i8 %y) {
187
187
define i8 @same_parent_combine_diff_attrs_fail (i8 %x , i8 %y ) {
188
188
; CHECK-LABEL: define i8 @same_parent_combine_diff_attrs_fail(
189
189
; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
190
- ; CHECK-NEXT: [[C1:%.*]] = call i8 @baz(i8 [[X]], i8 noundef [[Y]]) #[[ATTR0 ]]
191
- ; CHECK-NEXT: [[C0:%.*]] = call i8 @baz(i8 noundef [[X]], i8 noundef [[Y]]) #[[ATTR3 :[0-9]+]]
190
+ ; CHECK-NEXT: [[C1:%.*]] = call i8 @baz(i8 [[X]], i8 noundef [[Y]]) #[[ATTR1 ]]
191
+ ; CHECK-NEXT: [[C0:%.*]] = call i8 @baz(i8 noundef [[X]], i8 noundef [[Y]]) #[[ATTR4 :[0-9]+]]
192
192
; CHECK-NEXT: [[R:%.*]] = call i8 @buz(i8 [[C0]], i8 [[C1]])
193
193
; CHECK-NEXT: ret i8 [[R]]
194
194
;
@@ -202,10 +202,10 @@ define i8 @same_parent_combine_diff_attrs_fail(i8 %x, i8 %y) {
202
202
define i8 @diff_parent_combine_diff_attrs_todo (i1 %c , i8 %x , i8 %y ) {
203
203
; CHECK-LABEL: define i8 @diff_parent_combine_diff_attrs_todo(
204
204
; CHECK-SAME: i1 [[C:%.*]], i8 [[X:%.*]], i8 [[Y:%.*]]) {
205
- ; CHECK-NEXT: [[C1:%.*]] = call i8 @baz(i8 [[X]], i8 noundef [[Y]]) #[[ATTR0 ]]
205
+ ; CHECK-NEXT: [[C1:%.*]] = call i8 @baz(i8 [[X]], i8 noundef [[Y]]) #[[ATTR1 ]]
206
206
; CHECK-NEXT: br i1 [[C]], label %[[T:.*]], label %[[F:.*]]
207
207
; CHECK: [[T]]:
208
- ; CHECK-NEXT: [[C0:%.*]] = call i8 @baz(i8 noundef [[X]], i8 noundef [[Y]]) #[[ATTR4 :[0-9]+]]
208
+ ; CHECK-NEXT: [[C0:%.*]] = call i8 @baz(i8 noundef [[X]], i8 noundef [[Y]]) #[[ATTR5 :[0-9]+]]
209
209
; CHECK-NEXT: [[R:%.*]] = call i8 @buz(i8 [[C0]], i8 [[C1]])
210
210
; CHECK-NEXT: ret i8 [[R]]
211
211
; CHECK: [[F]]:
226
226
define i8 @diff_parent_combine_diff_attrs_fail (i1 %c , i8 %x , i8 %y ) {
227
227
; CHECK-LABEL: define i8 @diff_parent_combine_diff_attrs_fail(
228
228
; CHECK-SAME: i1 [[C:%.*]], i8 [[X:%.*]], i8 [[Y:%.*]]) {
229
- ; CHECK-NEXT: [[C1:%.*]] = call i8 @baz(i8 [[X]], i8 noundef [[Y]]) #[[ATTR0 ]]
229
+ ; CHECK-NEXT: [[C1:%.*]] = call i8 @baz(i8 [[X]], i8 noundef [[Y]]) #[[ATTR1 ]]
230
230
; CHECK-NEXT: br i1 [[C]], label %[[T:.*]], label %[[F:.*]]
231
231
; CHECK: [[T]]:
232
- ; CHECK-NEXT: [[C0:%.*]] = call i8 @baz(i8 noundef [[X]], i8 noundef [[Y]]) #[[ATTR3 ]]
232
+ ; CHECK-NEXT: [[C0:%.*]] = call i8 @baz(i8 noundef [[X]], i8 noundef [[Y]]) #[[ATTR4 ]]
233
233
; CHECK-NEXT: [[R:%.*]] = call i8 @buz(i8 [[C0]], i8 [[C1]])
234
234
; CHECK-NEXT: ret i8 [[R]]
235
235
; CHECK: [[F]]:
247
247
ret i8 %r2
248
248
}
249
249
250
+ define i32 @commutative_intrinsic_intersection_failure (i32 %arg , i32 %arg1 ) {
251
+ ; CHECK-LABEL: define i32 @commutative_intrinsic_intersection_failure(
252
+ ; CHECK-SAME: i32 [[ARG:%.*]], i32 [[ARG1:%.*]]) {
253
+ ; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.smin.i32(i32 [[ARG]], i32 [[ARG1]]) #[[ATTR6:[0-9]+]]
254
+ ; CHECK-NEXT: [[CALL2:%.*]] = call i32 @llvm.smin.i32(i32 [[ARG1]], i32 [[ARG]])
255
+ ; CHECK-NEXT: [[OR:%.*]] = or i32 [[CALL2]], [[CALL]]
256
+ ; CHECK-NEXT: ret i32 [[OR]]
257
+ ;
258
+ %call = call i32 @llvm.smin.i32 (i32 %arg , i32 %arg1 ) strictfp
259
+ %call2 = call i32 @llvm.smin.i32 (i32 %arg1 , i32 %arg )
260
+ %or = or i32 %call2 , %call
261
+ ret i32 %or
262
+ }
263
+
250
264
;.
251
- ; CHECK: attributes #[[ATTR0]] = { memory(none) }
252
- ; CHECK: attributes #[[ATTR1]] = { memory(read) }
253
- ; CHECK: attributes #[[ATTR2]] = { alwaysinline memory(none) }
254
- ; CHECK: attributes #[[ATTR3]] = { strictfp memory(none) }
255
- ; CHECK: attributes #[[ATTR4]] = { noinline optnone memory(none) }
265
+ ; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
266
+ ; CHECK: attributes #[[ATTR1]] = { memory(none) }
267
+ ; CHECK: attributes #[[ATTR2]] = { memory(read) }
268
+ ; CHECK: attributes #[[ATTR3]] = { alwaysinline memory(none) }
269
+ ; CHECK: attributes #[[ATTR4]] = { strictfp memory(none) }
270
+ ; CHECK: attributes #[[ATTR5]] = { noinline optnone memory(none) }
271
+ ; CHECK: attributes #[[ATTR6]] = { strictfp }
256
272
;.
0 commit comments