@@ -7,15 +7,11 @@ declare void @side.effect()
7
7
define ptr @test_hoist_int_attrs (i1 %c , ptr %p , i64 %x ) {
8
8
; CHECK-LABEL: define {{[^@]+}}@test_hoist_int_attrs
9
9
; CHECK-SAME: (i1 [[C:%.*]], ptr [[P:%.*]], i64 [[X:%.*]]) {
10
- ; CHECK-NEXT: br i1 [[C]], label [[IF:%.*]], label [[ELSE:%.*]]
10
+ ; CHECK-NEXT: [[R:%.*]] = call ptr @foo(ptr align 32 dereferenceable(50) dereferenceable_or_null(100) [[P]], i64 range(i64 10, 100000) [[X]]) #[[ATTR0:[0-9]+]]
11
+ ; CHECK-NEXT: br i1 [[C]], label [[COMMON_RET:%.*]], label [[ELSE:%.*]]
11
12
; CHECK: common.ret:
12
- ; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi ptr [ [[R:%.*]], [[IF]] ], [ [[R2:%.*]], [[ELSE]] ]
13
- ; CHECK-NEXT: ret ptr [[COMMON_RET_OP]]
14
- ; CHECK: if:
15
- ; CHECK-NEXT: [[R]] = call ptr @foo(ptr align 64 dereferenceable(50) dereferenceable_or_null(100) [[P]], i64 range(i64 10, 1000) [[X]]) #[[ATTR0:[0-9]+]]
16
- ; CHECK-NEXT: br label [[COMMON_RET:%.*]]
13
+ ; CHECK-NEXT: ret ptr [[R]]
17
14
; CHECK: else:
18
- ; CHECK-NEXT: [[R2]] = call ptr @foo(ptr align 32 dereferenceable(100) dereferenceable_or_null(200) [[P]], i64 range(i64 10000, 100000) [[X]]) #[[ATTR1:[0-9]+]]
19
15
; CHECK-NEXT: call void @side.effect()
20
16
; CHECK-NEXT: br label [[COMMON_RET]]
21
17
;
@@ -33,15 +29,11 @@ else:
33
29
define ptr @test_hoist_int_attrs2 (i1 %c , ptr %p , i64 %x ) {
34
30
; CHECK-LABEL: define {{[^@]+}}@test_hoist_int_attrs2
35
31
; CHECK-SAME: (i1 [[C:%.*]], ptr [[P:%.*]], i64 [[X:%.*]]) {
36
- ; CHECK-NEXT: br i1 [[C]], label [[IF:%.*]], label [[ELSE:%.*]]
32
+ ; CHECK-NEXT: [[R:%.*]] = call ptr @foo(ptr dereferenceable(50) [[P]], i64 range(i64 10, 1000) [[X]]) #[[ATTR1:[0-9]+]]
33
+ ; CHECK-NEXT: br i1 [[C]], label [[COMMON_RET:%.*]], label [[ELSE:%.*]]
37
34
; CHECK: common.ret:
38
- ; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi ptr [ [[R:%.*]], [[IF]] ], [ [[R2:%.*]], [[ELSE]] ]
39
- ; CHECK-NEXT: ret ptr [[COMMON_RET_OP]]
40
- ; CHECK: if:
41
- ; CHECK-NEXT: [[R]] = call ptr @foo(ptr dereferenceable(50) [[P]], i64 range(i64 10, 1000) [[X]]) #[[ATTR0]]
42
- ; CHECK-NEXT: br label [[COMMON_RET:%.*]]
35
+ ; CHECK-NEXT: ret ptr [[R]]
43
36
; CHECK: else:
44
- ; CHECK-NEXT: [[R2]] = call ptr @foo(ptr align 32 dereferenceable(100) dereferenceable_or_null(200) [[P]], i64 range(i64 11, 100) [[X]]) #[[ATTR2:[0-9]+]]
45
37
; CHECK-NEXT: call void @side.effect()
46
38
; CHECK-NEXT: br label [[COMMON_RET]]
47
39
;
@@ -59,15 +51,11 @@ else:
59
51
define ptr @test_hoist_bool_attrs2 (i1 %c , ptr %p , i64 %x ) {
60
52
; CHECK-LABEL: define {{[^@]+}}@test_hoist_bool_attrs2
61
53
; CHECK-SAME: (i1 [[C:%.*]], ptr [[P:%.*]], i64 [[X:%.*]]) {
62
- ; CHECK-NEXT: br i1 [[C]], label [[IF:%.*]], label [[ELSE:%.*]]
54
+ ; CHECK-NEXT: [[R:%.*]] = call noundef ptr @foo(ptr nonnull [[P]], i64 noundef [[X]]) #[[ATTR2:[0-9]+]]
55
+ ; CHECK-NEXT: br i1 [[C]], label [[COMMON_RET:%.*]], label [[ELSE:%.*]]
63
56
; CHECK: common.ret:
64
- ; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi ptr [ [[R:%.*]], [[IF]] ], [ [[R2:%.*]], [[ELSE]] ]
65
- ; CHECK-NEXT: ret ptr [[COMMON_RET_OP]]
66
- ; CHECK: if:
67
- ; CHECK-NEXT: [[R]] = call noundef ptr @foo(ptr noundef nonnull readnone [[P]], i64 noundef [[X]]) #[[ATTR3:[0-9]+]]
68
- ; CHECK-NEXT: br label [[COMMON_RET:%.*]]
57
+ ; CHECK-NEXT: ret ptr [[R]]
69
58
; CHECK: else:
70
- ; CHECK-NEXT: [[R2]] = call noundef nonnull ptr @foo(ptr nonnull readonly [[P]], i64 noundef [[X]]) #[[ATTR4:[0-9]+]]
71
59
; CHECK-NEXT: call void @side.effect()
72
60
; CHECK-NEXT: br label [[COMMON_RET]]
73
61
;
@@ -85,15 +73,11 @@ else:
85
73
define ptr @test_hoist_bool_attrs3 (i1 %c , ptr %p , i64 %x ) {
86
74
; CHECK-LABEL: define {{[^@]+}}@test_hoist_bool_attrs3
87
75
; CHECK-SAME: (i1 [[C:%.*]], ptr [[P:%.*]], i64 [[X:%.*]]) {
88
- ; CHECK-NEXT: br i1 [[C]], label [[IF:%.*]], label [[ELSE:%.*]]
76
+ ; CHECK-NEXT: [[R:%.*]] = call nonnull ptr @foo(ptr [[P]], i64 noundef [[X]]) #[[ATTR3:[0-9]+]]
77
+ ; CHECK-NEXT: br i1 [[C]], label [[COMMON_RET:%.*]], label [[ELSE:%.*]]
89
78
; CHECK: common.ret:
90
- ; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi ptr [ [[R:%.*]], [[IF]] ], [ [[R2:%.*]], [[ELSE]] ]
91
- ; CHECK-NEXT: ret ptr [[COMMON_RET_OP]]
92
- ; CHECK: if:
93
- ; CHECK-NEXT: [[R]] = call nonnull ptr @foo(ptr noundef readonly [[P]], i64 noundef [[X]]) #[[ATTR5:[0-9]+]]
94
- ; CHECK-NEXT: br label [[COMMON_RET:%.*]]
79
+ ; CHECK-NEXT: ret ptr [[R]]
95
80
; CHECK: else:
96
- ; CHECK-NEXT: [[R2]] = call noundef nonnull ptr @foo(ptr nonnull writeonly [[P]], i64 noundef [[X]]) #[[ATTR6:[0-9]+]]
97
81
; CHECK-NEXT: call void @side.effect()
98
82
; CHECK-NEXT: br label [[COMMON_RET]]
99
83
;
@@ -116,10 +100,10 @@ define ptr @test_hoist_bool_attrs_fail_non_droppable(i1 %c, ptr %p, i64 %x) {
116
100
; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi ptr [ [[R:%.*]], [[IF]] ], [ [[R2:%.*]], [[ELSE]] ]
117
101
; CHECK-NEXT: ret ptr [[COMMON_RET_OP]]
118
102
; CHECK: if:
119
- ; CHECK-NEXT: [[R]] = call nonnull ptr @foo(ptr noundef readonly [[P]], i64 noundef [[X]]) #[[ATTR5 ]]
103
+ ; CHECK-NEXT: [[R]] = call nonnull ptr @foo(ptr noundef readonly [[P]], i64 noundef [[X]]) #[[ATTR4:[0-9]+ ]]
120
104
; CHECK-NEXT: br label [[COMMON_RET:%.*]]
121
105
; CHECK: else:
122
- ; CHECK-NEXT: [[R2]] = call noundef nonnull ptr @foo(ptr nonnull writeonly [[P]], i64 noundef [[X]]) #[[ATTR7 :[0-9]+]]
106
+ ; CHECK-NEXT: [[R2]] = call noundef nonnull ptr @foo(ptr nonnull writeonly [[P]], i64 noundef [[X]]) #[[ATTR5 :[0-9]+]]
123
107
; CHECK-NEXT: call void @side.effect()
124
108
; CHECK-NEXT: br label [[COMMON_RET]]
125
109
;
@@ -142,10 +126,10 @@ define ptr @test_hoist_bool_attrs_fail_non_droppable2(i1 %c, ptr %p, i64 %x) {
142
126
; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi ptr [ [[R:%.*]], [[IF]] ], [ [[R2:%.*]], [[ELSE]] ]
143
127
; CHECK-NEXT: ret ptr [[COMMON_RET_OP]]
144
128
; CHECK: if:
145
- ; CHECK-NEXT: [[R]] = call nonnull ptr @foo(ptr noundef readonly [[P]], i64 noundef [[X]]) #[[ATTR8 :[0-9]+]]
129
+ ; CHECK-NEXT: [[R]] = call nonnull ptr @foo(ptr noundef readonly [[P]], i64 noundef [[X]]) #[[ATTR6 :[0-9]+]]
146
130
; CHECK-NEXT: br label [[COMMON_RET:%.*]]
147
131
; CHECK: else:
148
- ; CHECK-NEXT: [[R2]] = call noundef nonnull ptr @foo(ptr nonnull writeonly byval(i64) [[P]], i64 noundef [[X]]) #[[ATTR7 ]]
132
+ ; CHECK-NEXT: [[R2]] = call noundef nonnull ptr @foo(ptr nonnull writeonly byval(i64) [[P]], i64 noundef [[X]]) #[[ATTR5 ]]
149
133
; CHECK-NEXT: call void @side.effect()
150
134
; CHECK-NEXT: br label [[COMMON_RET]]
151
135
;
@@ -168,10 +152,10 @@ define ptr @test_hoist_bool_attrs_fail_non_droppable3(i1 %c, ptr %p, i64 %x) {
168
152
; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi ptr [ [[R:%.*]], [[IF]] ], [ [[R2:%.*]], [[ELSE]] ]
169
153
; CHECK-NEXT: ret ptr [[COMMON_RET_OP]]
170
154
; CHECK: if:
171
- ; CHECK-NEXT: [[R]] = call nonnull ptr @foo(ptr noundef readonly byval(i32) [[P]], i64 noundef [[X]]) #[[ATTR8 ]]
155
+ ; CHECK-NEXT: [[R]] = call nonnull ptr @foo(ptr noundef readonly byval(i32) [[P]], i64 noundef [[X]]) #[[ATTR6 ]]
172
156
; CHECK-NEXT: br label [[COMMON_RET:%.*]]
173
157
; CHECK: else:
174
- ; CHECK-NEXT: [[R2]] = call noundef nonnull ptr @foo(ptr nonnull writeonly byval(i64) [[P]], i64 noundef [[X]]) #[[ATTR7 ]]
158
+ ; CHECK-NEXT: [[R2]] = call noundef nonnull ptr @foo(ptr nonnull writeonly byval(i64) [[P]], i64 noundef [[X]]) #[[ATTR5 ]]
175
159
; CHECK-NEXT: call void @side.effect()
176
160
; CHECK-NEXT: br label [[COMMON_RET]]
177
161
;
@@ -189,15 +173,11 @@ else:
189
173
define ptr @test_hoist_bool_attrs4 (i1 %c , ptr %p , i64 %x ) {
190
174
; CHECK-LABEL: define {{[^@]+}}@test_hoist_bool_attrs4
191
175
; CHECK-SAME: (i1 [[C:%.*]], ptr [[P:%.*]], i64 [[X:%.*]]) {
192
- ; CHECK-NEXT: br i1 [[C]], label [[IF:%.*]], label [[ELSE:%.*]]
176
+ ; CHECK-NEXT: [[R:%.*]] = call nonnull ptr @foo(ptr byval(i64) [[P]], i64 noundef [[X]]) #[[ATTR5]]
177
+ ; CHECK-NEXT: br i1 [[C]], label [[COMMON_RET:%.*]], label [[ELSE:%.*]]
193
178
; CHECK: common.ret:
194
- ; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi ptr [ [[R:%.*]], [[IF]] ], [ [[R2:%.*]], [[ELSE]] ]
195
- ; CHECK-NEXT: ret ptr [[COMMON_RET_OP]]
196
- ; CHECK: if:
197
- ; CHECK-NEXT: [[R]] = call nonnull ptr @foo(ptr noundef readonly byval(i64) [[P]], i64 noundef [[X]]) #[[ATTR8]]
198
- ; CHECK-NEXT: br label [[COMMON_RET:%.*]]
179
+ ; CHECK-NEXT: ret ptr [[R]]
199
180
; CHECK: else:
200
- ; CHECK-NEXT: [[R2]] = call noundef nonnull ptr @foo(ptr nonnull writeonly byval(i64) [[P]], i64 noundef [[X]]) #[[ATTR7]]
201
181
; CHECK-NEXT: call void @side.effect()
202
182
; CHECK-NEXT: br label [[COMMON_RET]]
203
183
;
@@ -212,13 +192,11 @@ else:
212
192
ret ptr %r2
213
193
}
214
194
;.
215
- ; CHECK: attributes #[[ATTR0]] = { memory(read) }
216
- ; CHECK: attributes #[[ATTR1]] = { memory(write) }
217
- ; CHECK: attributes #[[ATTR2]] = { memory(none) }
218
- ; CHECK: attributes #[[ATTR3]] = { cold mustprogress nocallback nofree nosync willreturn }
219
- ; CHECK: attributes #[[ATTR4]] = { mustprogress nocallback nofree willreturn }
220
- ; CHECK: attributes #[[ATTR5]] = { alwaysinline cold nocallback nofree nosync willreturn }
221
- ; CHECK: attributes #[[ATTR6]] = { alwaysinline nosync willreturn }
222
- ; CHECK: attributes #[[ATTR7]] = { nosync willreturn }
223
- ; CHECK: attributes #[[ATTR8]] = { cold nocallback nofree nosync willreturn }
195
+ ; CHECK: attributes #[[ATTR0]] = { memory(readwrite) }
196
+ ; CHECK: attributes #[[ATTR1]] = { memory(read) }
197
+ ; CHECK: attributes #[[ATTR2]] = { mustprogress nocallback nofree willreturn }
198
+ ; CHECK: attributes #[[ATTR3]] = { alwaysinline nosync willreturn }
199
+ ; CHECK: attributes #[[ATTR4]] = { alwaysinline cold nocallback nofree nosync willreturn }
200
+ ; CHECK: attributes #[[ATTR5]] = { nosync willreturn }
201
+ ; CHECK: attributes #[[ATTR6]] = { cold nocallback nofree nosync willreturn }
224
202
;.
0 commit comments