11; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals
22; RUN: opt < %s -passes='simplifycfg<sink-common-insts>' -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck %s
33
4+ declare ptr @foo0 ()
45declare ptr @foo (ptr %p , i64 %x )
56declare ptr @foo2 (ptr %p , ptr %p2 , i64 %x )
67declare void @side.effect ()
78
9+ define ptr @test_sink_no_args_oneside (i1 %c ) {
10+ ; CHECK-LABEL: define {{[^@]+}}@test_sink_no_args_oneside
11+ ; CHECK-SAME: (i1 [[C:%.*]]) {
12+ ; CHECK-NEXT: br i1 [[C]], label [[IF:%.*]], label [[ELSE:%.*]]
13+ ; CHECK: if:
14+ ; CHECK-NEXT: call void @side.effect()
15+ ; CHECK-NEXT: [[R:%.*]] = call ptr @foo0()
16+ ; CHECK-NEXT: br label [[END:%.*]]
17+ ; CHECK: else:
18+ ; CHECK-NEXT: [[R2:%.*]] = call ptr @foo0() #[[ATTR0:[0-9]+]]
19+ ; CHECK-NEXT: br label [[END]]
20+ ; CHECK: end:
21+ ; CHECK-NEXT: [[PR:%.*]] = phi ptr [ [[R]], [[IF]] ], [ [[R2]], [[ELSE]] ]
22+ ; CHECK-NEXT: ret ptr [[PR]]
23+ ;
24+ br i1 %c , label %if , label %else
25+ if:
26+ call void @side.effect ()
27+ %r = call ptr @foo0 ()
28+ br label %end
29+
30+ else:
31+ %r2 = call ptr @foo0 () readonly
32+ br label %end
33+ end:
34+ %pr = phi ptr [ %r , %if ], [%r2 , %else ]
35+ ret ptr %pr
36+ }
37+
38+ define ptr @test_sink_no_args_oneside_fail (i1 %c ) {
39+ ; CHECK-LABEL: define {{[^@]+}}@test_sink_no_args_oneside_fail
40+ ; CHECK-SAME: (i1 [[C:%.*]]) {
41+ ; CHECK-NEXT: br i1 [[C]], label [[IF:%.*]], label [[ELSE:%.*]]
42+ ; CHECK: if:
43+ ; CHECK-NEXT: call void @side.effect()
44+ ; CHECK-NEXT: [[R:%.*]] = call ptr @foo0()
45+ ; CHECK-NEXT: br label [[END:%.*]]
46+ ; CHECK: else:
47+ ; CHECK-NEXT: [[R2:%.*]] = call ptr @foo0() #[[ATTR1:[0-9]+]]
48+ ; CHECK-NEXT: br label [[END]]
49+ ; CHECK: end:
50+ ; CHECK-NEXT: [[PR:%.*]] = phi ptr [ [[R]], [[IF]] ], [ [[R2]], [[ELSE]] ]
51+ ; CHECK-NEXT: ret ptr [[PR]]
52+ ;
53+ br i1 %c , label %if , label %else
54+ if:
55+ call void @side.effect ()
56+ %r = call ptr @foo0 ()
57+ br label %end
58+
59+ else:
60+ %r2 = call ptr @foo0 () readonly alwaysinline
61+ br label %end
62+ end:
63+ %pr = phi ptr [ %r , %if ], [%r2 , %else ]
64+ ret ptr %pr
65+ }
66+
867define ptr @test_sink_int_attrs (i1 %c , ptr %p , ptr %p2 , i64 %x ) {
968; CHECK-LABEL: define {{[^@]+}}@test_sink_int_attrs
1069; CHECK-SAME: (i1 [[C:%.*]], ptr [[P:%.*]], ptr [[P2:%.*]], i64 [[X:%.*]]) {
@@ -13,7 +72,7 @@ define ptr @test_sink_int_attrs(i1 %c, ptr %p, ptr %p2, i64 %x) {
1372; CHECK-NEXT: call void @side.effect()
1473; CHECK-NEXT: br label [[END]]
1574; CHECK: end:
16- ; CHECK-NEXT: [[R2:%.*]] = 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]+]]
75+ ; CHECK-NEXT: [[R2:%.*]] = call ptr @foo2(ptr align 32 dereferenceable_or_null(100) [[P]], ptr align 32 dereferenceable(50) [[P2]], i64 range(i64 10, 100000) [[X]]) #[[ATTR2 :[0-9]+]]
1776; CHECK-NEXT: ret ptr [[R2]]
1877;
1978 br i1 %c , label %if , label %else
@@ -38,7 +97,7 @@ define ptr @test_sink_int_attrs2(i1 %c, ptr %p, i64 %x) {
3897; CHECK-NEXT: call void @side.effect()
3998; CHECK-NEXT: br label [[END]]
4099; CHECK: end:
41- ; CHECK-NEXT: [[R2:%.*]] = call ptr @foo(ptr dereferenceable(50) [[P]], i64 range(i64 10, 1000) [[X]]) #[[ATTR1:[0-9]+ ]]
100+ ; CHECK-NEXT: [[R2:%.*]] = call ptr @foo(ptr dereferenceable(50) [[P]], i64 range(i64 10, 1000) [[X]]) #[[ATTR0 ]]
42101; CHECK-NEXT: ret ptr [[R2]]
43102;
44103 br i1 %c , label %if , label %else
@@ -63,7 +122,7 @@ define ptr @test_sink_bool_attrs2(i1 %c, ptr %p, i64 %x) {
63122; CHECK-NEXT: call void @side.effect()
64123; CHECK-NEXT: br label [[END]]
65124; CHECK: end:
66- ; CHECK-NEXT: [[R2:%.*]] = call noundef ptr @foo(ptr nonnull [[P]], i64 noundef [[X]]) #[[ATTR2 :[0-9]+]]
125+ ; CHECK-NEXT: [[R2:%.*]] = call noundef ptr @foo(ptr nonnull [[P]], i64 noundef [[X]]) #[[ATTR3 :[0-9]+]]
67126; CHECK-NEXT: ret ptr [[R2]]
68127;
69128 br i1 %c , label %if , label %else
@@ -88,7 +147,7 @@ define ptr @test_sink_bool_attrs3(i1 %c, ptr %p, i64 %x) {
88147; CHECK-NEXT: call void @side.effect()
89148; CHECK-NEXT: br label [[END]]
90149; CHECK: end:
91- ; CHECK-NEXT: [[R2:%.*]] = call nonnull ptr @foo(ptr [[P]], i64 noundef [[X]]) #[[ATTR3 :[0-9]+]]
150+ ; CHECK-NEXT: [[R2:%.*]] = call nonnull ptr @foo(ptr [[P]], i64 noundef [[X]]) #[[ATTR4 :[0-9]+]]
92151; CHECK-NEXT: ret ptr [[R2]]
93152;
94153 br i1 %c , label %if , label %else
@@ -111,10 +170,10 @@ define ptr @test_sink_bool_attrs_fail_non_droppable(i1 %c, ptr %p, i64 %x) {
111170; CHECK-NEXT: br i1 [[C]], label [[IF:%.*]], label [[ELSE:%.*]]
112171; CHECK: if:
113172; CHECK-NEXT: call void @side.effect()
114- ; CHECK-NEXT: [[R:%.*]] = call nonnull ptr @foo(ptr noundef readonly [[P]], i64 noundef [[X]]) #[[ATTR4 :[0-9]+]]
173+ ; CHECK-NEXT: [[R:%.*]] = call nonnull ptr @foo(ptr noundef readonly [[P]], i64 noundef [[X]]) #[[ATTR5 :[0-9]+]]
115174; CHECK-NEXT: br label [[END:%.*]]
116175; CHECK: else:
117- ; CHECK-NEXT: [[R2:%.*]] = call noundef nonnull ptr @foo(ptr nonnull writeonly [[P]], i64 noundef [[X]]) #[[ATTR5 :[0-9]+]]
176+ ; CHECK-NEXT: [[R2:%.*]] = call noundef nonnull ptr @foo(ptr nonnull writeonly [[P]], i64 noundef [[X]]) #[[ATTR6 :[0-9]+]]
118177; CHECK-NEXT: br label [[END]]
119178; CHECK: end:
120179; CHECK-NEXT: [[PR:%.*]] = phi ptr [ [[R]], [[IF]] ], [ [[R2]], [[ELSE]] ]
@@ -140,10 +199,10 @@ define ptr @test_sink_bool_attrs_fail_non_droppable2(i1 %c, ptr %p, i64 %x) {
140199; CHECK-NEXT: br i1 [[C]], label [[IF:%.*]], label [[ELSE:%.*]]
141200; CHECK: if:
142201; CHECK-NEXT: call void @side.effect()
143- ; CHECK-NEXT: [[R:%.*]] = call nonnull ptr @foo(ptr noundef readonly [[P]], i64 noundef [[X]]) #[[ATTR6 :[0-9]+]]
202+ ; CHECK-NEXT: [[R:%.*]] = call nonnull ptr @foo(ptr noundef readonly [[P]], i64 noundef [[X]]) #[[ATTR7 :[0-9]+]]
144203; CHECK-NEXT: br label [[END:%.*]]
145204; CHECK: else:
146- ; CHECK-NEXT: [[R2:%.*]] = call noundef nonnull ptr @foo(ptr nonnull writeonly byval(i64) [[P]], i64 noundef [[X]]) #[[ATTR5 ]]
205+ ; CHECK-NEXT: [[R2:%.*]] = call noundef nonnull ptr @foo(ptr nonnull writeonly byval(i64) [[P]], i64 noundef [[X]]) #[[ATTR6 ]]
147206; CHECK-NEXT: br label [[END]]
148207; CHECK: end:
149208; CHECK-NEXT: [[PR:%.*]] = phi ptr [ [[R]], [[IF]] ], [ [[R2]], [[ELSE]] ]
@@ -169,10 +228,10 @@ define ptr @test_sink_bool_attrs_fail_non_droppable3(i1 %c, ptr %p, i64 %x) {
169228; CHECK-NEXT: br i1 [[C]], label [[IF:%.*]], label [[ELSE:%.*]]
170229; CHECK: if:
171230; CHECK-NEXT: call void @side.effect()
172- ; CHECK-NEXT: [[R:%.*]] = call nonnull ptr @foo(ptr noundef readonly byval(i32) [[P]], i64 noundef [[X]]) #[[ATTR6 ]]
231+ ; CHECK-NEXT: [[R:%.*]] = call nonnull ptr @foo(ptr noundef readonly byval(i32) [[P]], i64 noundef [[X]]) #[[ATTR7 ]]
173232; CHECK-NEXT: br label [[END:%.*]]
174233; CHECK: else:
175- ; CHECK-NEXT: [[R2:%.*]] = call noundef nonnull ptr @foo(ptr nonnull writeonly byval(i64) [[P]], i64 noundef [[X]]) #[[ATTR7 :[0-9]+]]
234+ ; CHECK-NEXT: [[R2:%.*]] = call noundef nonnull ptr @foo(ptr nonnull writeonly byval(i64) [[P]], i64 noundef [[X]]) #[[ATTR8 :[0-9]+]]
176235; CHECK-NEXT: br label [[END]]
177236; CHECK: end:
178237; CHECK-NEXT: [[PR:%.*]] = phi ptr [ [[R]], [[IF]] ], [ [[R2]], [[ELSE]] ]
@@ -200,7 +259,7 @@ define ptr @test_sink_bool_attrs4(i1 %c, ptr %p, i64 %x) {
200259; CHECK-NEXT: call void @side.effect()
201260; CHECK-NEXT: br label [[END]]
202261; CHECK: end:
203- ; CHECK-NEXT: [[R2:%.*]] = call nonnull ptr @foo(ptr byval(i64) [[P]], i64 noundef [[X]]) #[[ATTR7 ]]
262+ ; CHECK-NEXT: [[R2:%.*]] = call nonnull ptr @foo(ptr byval(i64) [[P]], i64 noundef [[X]]) #[[ATTR8 ]]
204263; CHECK-NEXT: ret ptr [[R2]]
205264;
206265 br i1 %c , label %if , label %else
@@ -218,12 +277,13 @@ end:
218277}
219278
220279;.
221- ; CHECK: attributes #[[ATTR0]] = { memory(readwrite) }
222- ; CHECK: attributes #[[ATTR1]] = { memory(read) }
223- ; CHECK: attributes #[[ATTR2]] = { mustprogress nocallback nofree willreturn }
224- ; CHECK: attributes #[[ATTR3]] = { alwaysinline nosync willreturn }
225- ; CHECK: attributes #[[ATTR4]] = { alwaysinline cold nocallback nofree nosync willreturn }
226- ; CHECK: attributes #[[ATTR5]] = { nosync willreturn }
227- ; CHECK: attributes #[[ATTR6]] = { cold nocallback nofree nosync willreturn }
228- ; CHECK: attributes #[[ATTR7]] = { nosync }
280+ ; CHECK: attributes #[[ATTR0]] = { memory(read) }
281+ ; CHECK: attributes #[[ATTR1]] = { alwaysinline memory(read) }
282+ ; CHECK: attributes #[[ATTR2]] = { memory(readwrite) }
283+ ; CHECK: attributes #[[ATTR3]] = { mustprogress nocallback nofree willreturn }
284+ ; CHECK: attributes #[[ATTR4]] = { alwaysinline nosync willreturn }
285+ ; CHECK: attributes #[[ATTR5]] = { alwaysinline cold nocallback nofree nosync willreturn }
286+ ; CHECK: attributes #[[ATTR6]] = { nosync willreturn }
287+ ; CHECK: attributes #[[ATTR7]] = { cold nocallback nofree nosync willreturn }
288+ ; CHECK: attributes #[[ATTR8]] = { nosync }
229289;.
0 commit comments