[AArch64][NFC] NFC for const vector as Instruction operand (#116790)
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / hoist-cb-diff-attrs.ll
blobee6c0cfd43b253d6d562e73febb473f684704f1e
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals
2 ; RUN: opt < %s -passes='simplifycfg<hoist-common-insts>' -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck %s
4 declare ptr @foo(ptr %p, i64 %x)
5 declare ptr @foo2(ptr %p, ptr %p2, i64 %x)
6 declare void @side.effect()
8 define ptr @test_hoist_int_attrs(i1 %c, ptr %p, ptr %p2, i64 %x) {
9 ; CHECK-LABEL: define {{[^@]+}}@test_hoist_int_attrs
10 ; CHECK-SAME: (i1 [[C:%.*]], ptr [[P:%.*]], ptr [[P2:%.*]], i64 [[X:%.*]]) {
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:%.*]]
13 ; CHECK:       common.ret:
14 ; CHECK-NEXT:    ret ptr [[R]]
15 ; CHECK:       else:
16 ; CHECK-NEXT:    call void @side.effect()
17 ; CHECK-NEXT:    br label [[COMMON_RET]]
19   br i1 %c, label %if, label %else
20 if:
21   %r = call ptr @foo2(ptr align 64 dereferenceable_or_null(100) %p, ptr dereferenceable(50) align 64 %p2, i64 range(i64 10, 1000) %x) memory(read)
22   ret ptr %r
24 else:
25   %r2 = call ptr @foo2(ptr align 32 dereferenceable_or_null(200) %p, ptr dereferenceable(100) align 32 %p2, i64 range(i64 10000, 100000) %x) memory(write)
26   call void @side.effect()
27   ret ptr %r2
30 define ptr @test_hoist_int_attrs2(i1 %c, ptr %p, i64 %x) {
31 ; CHECK-LABEL: define {{[^@]+}}@test_hoist_int_attrs2
32 ; CHECK-SAME: (i1 [[C:%.*]], ptr [[P:%.*]], i64 [[X:%.*]]) {
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:%.*]]
35 ; CHECK:       common.ret:
36 ; CHECK-NEXT:    ret ptr [[R]]
37 ; CHECK:       else:
38 ; CHECK-NEXT:    call void @side.effect()
39 ; CHECK-NEXT:    br label [[COMMON_RET]]
41   br i1 %c, label %if, label %else
42 if:
43   %r = call ptr @foo(ptr dereferenceable(50) %p, i64 range(i64 10, 1000) %x) memory(read)
44   ret ptr %r
46 else:
47   %r2 = call ptr @foo(ptr dereferenceable(100) align 32 dereferenceable_or_null(200) %p, i64 range(i64 11, 100) %x) memory(none)
48   call void @side.effect()
49   ret ptr %r2
52 define ptr @test_hoist_bool_attrs2(i1 %c, ptr %p, i64 %x) {
53 ; CHECK-LABEL: define {{[^@]+}}@test_hoist_bool_attrs2
54 ; CHECK-SAME: (i1 [[C:%.*]], ptr [[P:%.*]], i64 [[X:%.*]]) {
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:%.*]]
57 ; CHECK:       common.ret:
58 ; CHECK-NEXT:    ret ptr [[R]]
59 ; CHECK:       else:
60 ; CHECK-NEXT:    call void @side.effect()
61 ; CHECK-NEXT:    br label [[COMMON_RET]]
63   br i1 %c, label %if, label %else
64 if:
65   %r = call noundef ptr @foo(ptr readnone nonnull noundef %p, i64 noundef %x) cold mustprogress nocallback nofree nosync willreturn
66   ret ptr %r
68 else:
69   %r2 = call noundef nonnull ptr @foo(ptr readonly nonnull %p, i64 noundef %x) mustprogress nocallback nofree willreturn
70   call void @side.effect()
71   ret ptr %r2
74 define ptr @test_hoist_bool_attrs3(i1 %c, ptr %p, i64 %x) {
75 ; CHECK-LABEL: define {{[^@]+}}@test_hoist_bool_attrs3
76 ; CHECK-SAME: (i1 [[C:%.*]], ptr [[P:%.*]], i64 [[X:%.*]]) {
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:%.*]]
79 ; CHECK:       common.ret:
80 ; CHECK-NEXT:    ret ptr [[R]]
81 ; CHECK:       else:
82 ; CHECK-NEXT:    call void @side.effect()
83 ; CHECK-NEXT:    br label [[COMMON_RET]]
85   br i1 %c, label %if, label %else
86 if:
87   %r = call nonnull ptr @foo(ptr readonly noundef %p, i64 noundef %x) cold nocallback nofree nosync willreturn alwaysinline
88   ret ptr %r
90 else:
91   %r2 = call noundef nonnull ptr @foo(ptr writeonly nonnull %p, i64 noundef %x) nosync willreturn alwaysinline
92   call void @side.effect()
93   ret ptr %r2
96 define ptr @test_hoist_bool_attrs_fail_non_droppable(i1 %c, ptr %p, i64 %x) {
97 ; CHECK-LABEL: define {{[^@]+}}@test_hoist_bool_attrs_fail_non_droppable
98 ; CHECK-SAME: (i1 [[C:%.*]], ptr [[P:%.*]], i64 [[X:%.*]]) {
99 ; CHECK-NEXT:    br i1 [[C]], label [[IF:%.*]], label [[ELSE:%.*]]
100 ; CHECK:       common.ret:
101 ; CHECK-NEXT:    [[COMMON_RET_OP:%.*]] = phi ptr [ [[R:%.*]], [[IF]] ], [ [[R2:%.*]], [[ELSE]] ]
102 ; CHECK-NEXT:    ret ptr [[COMMON_RET_OP]]
103 ; CHECK:       if:
104 ; CHECK-NEXT:    [[R]] = call nonnull ptr @foo(ptr noundef readonly [[P]], i64 noundef [[X]]) #[[ATTR4:[0-9]+]]
105 ; CHECK-NEXT:    br label [[COMMON_RET:%.*]]
106 ; CHECK:       else:
107 ; CHECK-NEXT:    [[R2]] = call noundef nonnull ptr @foo(ptr nonnull writeonly [[P]], i64 noundef [[X]]) #[[ATTR5:[0-9]+]]
108 ; CHECK-NEXT:    call void @side.effect()
109 ; CHECK-NEXT:    br label [[COMMON_RET]]
111   br i1 %c, label %if, label %else
113   %r = call nonnull ptr @foo(ptr readonly noundef %p, i64 noundef %x) cold nocallback nofree nosync willreturn alwaysinline
114   ret ptr %r
116 else:
117   %r2 = call noundef nonnull ptr @foo(ptr writeonly nonnull %p, i64 noundef %x) nosync willreturn
118   call void @side.effect()
119   ret ptr %r2
122 define ptr @test_hoist_bool_attrs_fail_non_droppable2(i1 %c, ptr %p, i64 %x) {
123 ; CHECK-LABEL: define {{[^@]+}}@test_hoist_bool_attrs_fail_non_droppable2
124 ; CHECK-SAME: (i1 [[C:%.*]], ptr [[P:%.*]], i64 [[X:%.*]]) {
125 ; CHECK-NEXT:    br i1 [[C]], label [[IF:%.*]], label [[ELSE:%.*]]
126 ; CHECK:       common.ret:
127 ; CHECK-NEXT:    [[COMMON_RET_OP:%.*]] = phi ptr [ [[R:%.*]], [[IF]] ], [ [[R2:%.*]], [[ELSE]] ]
128 ; CHECK-NEXT:    ret ptr [[COMMON_RET_OP]]
129 ; CHECK:       if:
130 ; CHECK-NEXT:    [[R]] = call nonnull ptr @foo(ptr noundef readonly [[P]], i64 noundef [[X]]) #[[ATTR6:[0-9]+]]
131 ; CHECK-NEXT:    br label [[COMMON_RET:%.*]]
132 ; CHECK:       else:
133 ; CHECK-NEXT:    [[R2]] = call noundef nonnull ptr @foo(ptr nonnull writeonly byval(i64) [[P]], i64 noundef [[X]]) #[[ATTR5]]
134 ; CHECK-NEXT:    call void @side.effect()
135 ; CHECK-NEXT:    br label [[COMMON_RET]]
137   br i1 %c, label %if, label %else
139   %r = call nonnull ptr @foo(ptr readonly noundef %p, i64 noundef %x) cold nocallback nofree nosync willreturn
140   ret ptr %r
142 else:
143   %r2 = call noundef nonnull ptr @foo(ptr byval(i64) writeonly nonnull %p, i64 noundef %x) nosync willreturn
144   call void @side.effect()
145   ret ptr %r2
148 define ptr @test_hoist_bool_attrs_fail_non_droppable3(i1 %c, ptr %p, i64 %x) {
149 ; CHECK-LABEL: define {{[^@]+}}@test_hoist_bool_attrs_fail_non_droppable3
150 ; CHECK-SAME: (i1 [[C:%.*]], ptr [[P:%.*]], i64 [[X:%.*]]) {
151 ; CHECK-NEXT:    br i1 [[C]], label [[IF:%.*]], label [[ELSE:%.*]]
152 ; CHECK:       common.ret:
153 ; CHECK-NEXT:    [[COMMON_RET_OP:%.*]] = phi ptr [ [[R:%.*]], [[IF]] ], [ [[R2:%.*]], [[ELSE]] ]
154 ; CHECK-NEXT:    ret ptr [[COMMON_RET_OP]]
155 ; CHECK:       if:
156 ; CHECK-NEXT:    [[R]] = call nonnull ptr @foo(ptr noundef readonly byval(i32) [[P]], i64 noundef [[X]]) #[[ATTR6]]
157 ; CHECK-NEXT:    br label [[COMMON_RET:%.*]]
158 ; CHECK:       else:
159 ; CHECK-NEXT:    [[R2]] = call noundef nonnull ptr @foo(ptr nonnull writeonly byval(i64) [[P]], i64 noundef [[X]]) #[[ATTR5]]
160 ; CHECK-NEXT:    call void @side.effect()
161 ; CHECK-NEXT:    br label [[COMMON_RET]]
163   br i1 %c, label %if, label %else
165   %r = call nonnull ptr @foo(ptr byval(i32) readonly noundef %p, i64 noundef %x) cold nocallback nofree nosync willreturn
166   ret ptr %r
168 else:
169   %r2 = call noundef nonnull ptr @foo(ptr byval(i64) writeonly nonnull %p, i64 noundef %x) nosync willreturn
170   call void @side.effect()
171   ret ptr %r2
174 define ptr @test_hoist_bool_attrs4(i1 %c, ptr %p, i64 %x) {
175 ; CHECK-LABEL: define {{[^@]+}}@test_hoist_bool_attrs4
176 ; CHECK-SAME: (i1 [[C:%.*]], ptr [[P:%.*]], i64 [[X:%.*]]) {
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:%.*]]
179 ; CHECK:       common.ret:
180 ; CHECK-NEXT:    ret ptr [[R]]
181 ; CHECK:       else:
182 ; CHECK-NEXT:    call void @side.effect()
183 ; CHECK-NEXT:    br label [[COMMON_RET]]
185   br i1 %c, label %if, label %else
187   %r = call nonnull ptr @foo(ptr byval(i64) readonly noundef %p, i64 noundef %x) cold nocallback nofree nosync willreturn
188   ret ptr %r
190 else:
191   %r2 = call noundef nonnull ptr @foo(ptr byval(i64) writeonly nonnull %p, i64 noundef %x) nosync willreturn
192   call void @side.effect()
193   ret ptr %r2
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 }