Skip to content

Commit 04a73ab

Browse files
goldsteinnSterling-Augustine
authored andcommitted
[SimplifyCFG] Add tests for sinking calls with differing number of attrs; NFC
1 parent cd3fde8 commit 04a73ab

File tree

1 file changed

+79
-19
lines changed

1 file changed

+79
-19
lines changed

llvm/test/Transforms/SimplifyCFG/sink-cb-diff-attrs.ll

Lines changed: 79 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,69 @@
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()
45
declare ptr @foo(ptr %p, i64 %x)
56
declare ptr @foo2(ptr %p, ptr %p2, i64 %x)
67
declare 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+
867
define 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

Comments
 (0)