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