@@ -7,15 +7,11 @@ declare void @side.effect()
77define ptr @test_hoist_int_attrs (i1 %c , ptr %p , i64 %x ) {
88; CHECK-LABEL: define {{[^@]+}}@test_hoist_int_attrs
99; 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:%.*]]
1112; 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]]
1714; 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]+]]
1915; CHECK-NEXT: call void @side.effect()
2016; CHECK-NEXT: br label [[COMMON_RET]]
2117;
@@ -33,15 +29,11 @@ else:
3329define ptr @test_hoist_int_attrs2 (i1 %c , ptr %p , i64 %x ) {
3430; CHECK-LABEL: define {{[^@]+}}@test_hoist_int_attrs2
3531; 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:%.*]]
3734; 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]]
4336; 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]+]]
4537; CHECK-NEXT: call void @side.effect()
4638; CHECK-NEXT: br label [[COMMON_RET]]
4739;
@@ -59,15 +51,11 @@ else:
5951define ptr @test_hoist_bool_attrs2 (i1 %c , ptr %p , i64 %x ) {
6052; CHECK-LABEL: define {{[^@]+}}@test_hoist_bool_attrs2
6153; 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:%.*]]
6356; 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]]
6958; CHECK: else:
70- ; CHECK-NEXT: [[R2]] = call noundef nonnull ptr @foo(ptr nonnull readonly [[P]], i64 noundef [[X]]) #[[ATTR4:[0-9]+]]
7159; CHECK-NEXT: call void @side.effect()
7260; CHECK-NEXT: br label [[COMMON_RET]]
7361;
@@ -85,15 +73,11 @@ else:
8573define ptr @test_hoist_bool_attrs3 (i1 %c , ptr %p , i64 %x ) {
8674; CHECK-LABEL: define {{[^@]+}}@test_hoist_bool_attrs3
8775; 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:%.*]]
8978; 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]]
9580; CHECK: else:
96- ; CHECK-NEXT: [[R2]] = call noundef nonnull ptr @foo(ptr nonnull writeonly [[P]], i64 noundef [[X]]) #[[ATTR6:[0-9]+]]
9781; CHECK-NEXT: call void @side.effect()
9882; CHECK-NEXT: br label [[COMMON_RET]]
9983;
@@ -116,10 +100,10 @@ define ptr @test_hoist_bool_attrs_fail_non_droppable(i1 %c, ptr %p, i64 %x) {
116100; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi ptr [ [[R:%.*]], [[IF]] ], [ [[R2:%.*]], [[ELSE]] ]
117101; CHECK-NEXT: ret ptr [[COMMON_RET_OP]]
118102; 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]+ ]]
120104; CHECK-NEXT: br label [[COMMON_RET:%.*]]
121105; 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]+]]
123107; CHECK-NEXT: call void @side.effect()
124108; CHECK-NEXT: br label [[COMMON_RET]]
125109;
@@ -142,10 +126,10 @@ define ptr @test_hoist_bool_attrs_fail_non_droppable2(i1 %c, ptr %p, i64 %x) {
142126; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi ptr [ [[R:%.*]], [[IF]] ], [ [[R2:%.*]], [[ELSE]] ]
143127; CHECK-NEXT: ret ptr [[COMMON_RET_OP]]
144128; 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]+]]
146130; CHECK-NEXT: br label [[COMMON_RET:%.*]]
147131; 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 ]]
149133; CHECK-NEXT: call void @side.effect()
150134; CHECK-NEXT: br label [[COMMON_RET]]
151135;
@@ -168,10 +152,10 @@ define ptr @test_hoist_bool_attrs_fail_non_droppable3(i1 %c, ptr %p, i64 %x) {
168152; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi ptr [ [[R:%.*]], [[IF]] ], [ [[R2:%.*]], [[ELSE]] ]
169153; CHECK-NEXT: ret ptr [[COMMON_RET_OP]]
170154; 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 ]]
172156; CHECK-NEXT: br label [[COMMON_RET:%.*]]
173157; 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 ]]
175159; CHECK-NEXT: call void @side.effect()
176160; CHECK-NEXT: br label [[COMMON_RET]]
177161;
@@ -189,15 +173,11 @@ else:
189173define ptr @test_hoist_bool_attrs4 (i1 %c , ptr %p , i64 %x ) {
190174; CHECK-LABEL: define {{[^@]+}}@test_hoist_bool_attrs4
191175; 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:%.*]]
193178; 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]]
199180; CHECK: else:
200- ; CHECK-NEXT: [[R2]] = call noundef nonnull ptr @foo(ptr nonnull writeonly byval(i64) [[P]], i64 noundef [[X]]) #[[ATTR7]]
201181; CHECK-NEXT: call void @side.effect()
202182; CHECK-NEXT: br label [[COMMON_RET]]
203183;
@@ -212,13 +192,11 @@ else:
212192 ret ptr %r2
213193}
214194;.
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 }
224202;.
0 commit comments