@@ -8,15 +8,11 @@ declare void @side.effect()
88define ptr @test_hoist_int_attrs (i1 %c , ptr %p , ptr %p2 , i64 %x ) {
99; CHECK-LABEL: define {{[^@]+}}@test_hoist_int_attrs
1010; 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:%.*]]
1213; 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]]
1815; 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]+]]
2016; CHECK-NEXT: call void @side.effect()
2117; CHECK-NEXT: br label [[COMMON_RET]]
2218;
@@ -34,15 +30,11 @@ else:
3430define ptr @test_hoist_int_attrs2 (i1 %c , ptr %p , i64 %x ) {
3531; CHECK-LABEL: define {{[^@]+}}@test_hoist_int_attrs2
3632; 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:%.*]]
3835; 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]]
4437; 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]+]]
4638; CHECK-NEXT: call void @side.effect()
4739; CHECK-NEXT: br label [[COMMON_RET]]
4840;
@@ -60,15 +52,11 @@ else:
6052define ptr @test_hoist_bool_attrs2 (i1 %c , ptr %p , i64 %x ) {
6153; CHECK-LABEL: define {{[^@]+}}@test_hoist_bool_attrs2
6254; 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:%.*]]
6457; 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]]
7059; CHECK: else:
71- ; CHECK-NEXT: [[R2]] = call noundef nonnull ptr @foo(ptr nonnull readonly [[P]], i64 noundef [[X]]) #[[ATTR4:[0-9]+]]
7260; CHECK-NEXT: call void @side.effect()
7361; CHECK-NEXT: br label [[COMMON_RET]]
7462;
@@ -86,15 +74,11 @@ else:
8674define ptr @test_hoist_bool_attrs3 (i1 %c , ptr %p , i64 %x ) {
8775; CHECK-LABEL: define {{[^@]+}}@test_hoist_bool_attrs3
8876; 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:%.*]]
9079; 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]]
9681; CHECK: else:
97- ; CHECK-NEXT: [[R2]] = call noundef nonnull ptr @foo(ptr nonnull writeonly [[P]], i64 noundef [[X]]) #[[ATTR6:[0-9]+]]
9882; CHECK-NEXT: call void @side.effect()
9983; CHECK-NEXT: br label [[COMMON_RET]]
10084;
@@ -117,10 +101,10 @@ define ptr @test_hoist_bool_attrs_fail_non_droppable(i1 %c, ptr %p, i64 %x) {
117101; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi ptr [ [[R:%.*]], [[IF]] ], [ [[R2:%.*]], [[ELSE]] ]
118102; CHECK-NEXT: ret ptr [[COMMON_RET_OP]]
119103; 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]+ ]]
121105; CHECK-NEXT: br label [[COMMON_RET:%.*]]
122106; 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]+]]
124108; CHECK-NEXT: call void @side.effect()
125109; CHECK-NEXT: br label [[COMMON_RET]]
126110;
@@ -143,10 +127,10 @@ define ptr @test_hoist_bool_attrs_fail_non_droppable2(i1 %c, ptr %p, i64 %x) {
143127; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi ptr [ [[R:%.*]], [[IF]] ], [ [[R2:%.*]], [[ELSE]] ]
144128; CHECK-NEXT: ret ptr [[COMMON_RET_OP]]
145129; 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]+]]
147131; CHECK-NEXT: br label [[COMMON_RET:%.*]]
148132; 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 ]]
150134; CHECK-NEXT: call void @side.effect()
151135; CHECK-NEXT: br label [[COMMON_RET]]
152136;
@@ -169,10 +153,10 @@ define ptr @test_hoist_bool_attrs_fail_non_droppable3(i1 %c, ptr %p, i64 %x) {
169153; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi ptr [ [[R:%.*]], [[IF]] ], [ [[R2:%.*]], [[ELSE]] ]
170154; CHECK-NEXT: ret ptr [[COMMON_RET_OP]]
171155; 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 ]]
173157; CHECK-NEXT: br label [[COMMON_RET:%.*]]
174158; 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 ]]
176160; CHECK-NEXT: call void @side.effect()
177161; CHECK-NEXT: br label [[COMMON_RET]]
178162;
@@ -190,15 +174,11 @@ else:
190174define ptr @test_hoist_bool_attrs4 (i1 %c , ptr %p , i64 %x ) {
191175; CHECK-LABEL: define {{[^@]+}}@test_hoist_bool_attrs4
192176; 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:%.*]]
194179; 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]]
200181; CHECK: else:
201- ; CHECK-NEXT: [[R2]] = call noundef nonnull ptr @foo(ptr nonnull writeonly byval(i64) [[P]], i64 noundef [[X]]) #[[ATTR7]]
202182; CHECK-NEXT: call void @side.effect()
203183; CHECK-NEXT: br label [[COMMON_RET]]
204184;
@@ -214,13 +194,11 @@ else:
214194}
215195
216196;.
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 }
226204;.
0 commit comments