xref: /llvm-project/llvm/test/Transforms/Attributor/misc_crash.ll (revision 29441e4f5fa5f5c7709f7cf180815ba97f611297)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals
2; RUN: opt -passes=attributor -S %s | FileCheck %s
3
4@var1 = internal global [1 x i32] undef
5@var2 = internal global i32 0
6
7;.
8; CHECK: @var1 = internal global [1 x i32] undef
9; CHECK: @var2 = internal global i32 0
10;.
11define ptr addrspace(1) @foo(ptr addrspace(4) %arg) {
12; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
13; CHECK-LABEL: define {{[^@]+}}@foo
14; CHECK-SAME: (ptr addrspace(4) nofree readnone [[ARG:%.*]]) #[[ATTR0:[0-9]+]] {
15; CHECK-NEXT:  entry:
16; CHECK-NEXT:    [[TMP0:%.*]] = addrspacecast ptr addrspace(4) [[ARG]] to ptr addrspace(1)
17; CHECK-NEXT:    ret ptr addrspace(1) [[TMP0]]
18;
19entry:
20  %0 = addrspacecast ptr addrspace(4) %arg to ptr addrspace(1)
21  ret ptr addrspace(1) %0
22}
23
24define ptr @func1() {
25; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
26; CHECK-LABEL: define {{[^@]+}}@func1
27; CHECK-SAME: () #[[ATTR0]] {
28; CHECK-NEXT:    ret ptr @var1
29;
30  %ptr = call ptr @func1a(ptr @var1)
31  ret ptr %ptr
32}
33
34define internal ptr @func1a(ptr %arg) {
35  ret ptr %arg
36}
37
38define internal void @func2a(ptr %0) {
39; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)
40; CHECK-LABEL: define {{[^@]+}}@func2a
41; CHECK-SAME: (ptr nofree nonnull writeonly align 4 captures(none) dereferenceable(4) [[TMP0:%.*]]) #[[ATTR1:[0-9]+]] {
42; CHECK-NEXT:    ret void
43;
44  store i32 0, ptr %0
45  ret void
46}
47
48define i32 @func2() {
49; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)
50; CHECK-LABEL: define {{[^@]+}}@func2
51; CHECK-SAME: () #[[ATTR1]] {
52; CHECK-NEXT:    [[TMP1:%.*]] = tail call i32 (ptr, ...) @func2a(ptr nofree nonnull writeonly align 4 captures(none) dereferenceable(4) undef) #[[ATTR3:[0-9]+]]
53; CHECK-NEXT:    ret i32 0
54;
55  %1 = tail call i32 (ptr, ...) @func2a(ptr @var2)
56  %2 = load i32, ptr @var2
57  ret i32 %2
58}
59
60define i32 @func3(i1 %false) {
61; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)
62; CHECK-LABEL: define {{[^@]+}}@func3
63; CHECK-SAME: (i1 [[FALSE:%.*]]) #[[ATTR1]] {
64; CHECK-NEXT:    [[TMP1:%.*]] = tail call i32 (ptr, ...) @func2a(ptr nofree nonnull writeonly align 4 captures(none) dereferenceable(4) undef) #[[ATTR3]]
65; CHECK-NEXT:    br i1 [[FALSE]], label [[USE_BB:%.*]], label [[RET_BB:%.*]]
66; CHECK:       use_bb:
67; CHECK-NEXT:    ret i32 [[TMP1]]
68; CHECK:       ret_bb:
69; CHECK-NEXT:    ret i32 0
70;
71  %1 = tail call i32 (ptr, ...) @func2a(ptr @var2)
72  br i1 %false, label %use_bb, label %ret_bb
73use_bb:
74  ret i32 %1
75ret_bb:
76  %2 = load i32, ptr @var2
77  ret i32 %2
78}
79
80define void @func4() {
81; CHECK-LABEL: define {{[^@]+}}@func4() {
82; CHECK-NEXT:    call void @func5()
83; CHECK-NEXT:    ret void
84;
85  call void @func5(i32 0)
86  ret void
87}
88
89define internal void @func5(i32 %0) {
90; CHECK: Function Attrs: memory(readwrite, argmem: none)
91; CHECK-LABEL: define {{[^@]+}}@func5
92; CHECK-SAME: () #[[ATTR2:[0-9]+]] {
93; CHECK-NEXT:    br label [[BLOCK:%.*]]
94; CHECK:       block:
95; CHECK-NEXT:    call void @func6(ptr blockaddress(@func5, [[BLOCK]]))
96; CHECK-NEXT:    ret void
97;
98  %tmp = alloca ptr
99  br label %block
100
101block:
102  store ptr blockaddress(@func5, %block), ptr %tmp
103  %addr = load ptr, ptr %tmp
104  call void @func6(ptr %addr)
105  ret void
106}
107
108define i16 @foo3() {
109; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
110; CHECK-LABEL: define {{[^@]+}}@foo3
111; CHECK-SAME: () #[[ATTR0]] {
112; CHECK-NEXT:    [[CALL:%.*]] = call i16 @bar3() #[[ATTR4:[0-9]+]]
113; CHECK-NEXT:    ret i16 [[CALL]]
114;
115  %call = call i16 @bar3()
116  ret i16 %call
117}
118define internal i16 @bar3(ptr %p1, i16 %p2) {
119; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
120; CHECK-LABEL: define {{[^@]+}}@bar3
121; CHECK-SAME: (ptr nofree readnone captures(none) [[P1:%.*]], i16 returned [[P2:%.*]]) #[[ATTR0]] {
122; CHECK-NEXT:    ret i16 [[P2]]
123;
124  ret i16 %p2
125}
126
127declare void @func6(ptr)
128;.
129; CHECK: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) }
130; CHECK: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) }
131; CHECK: attributes #[[ATTR2]] = { memory(readwrite, argmem: none) }
132; CHECK: attributes #[[ATTR3]] = { nofree nosync nounwind willreturn memory(write) }
133; CHECK: attributes #[[ATTR4]] = { nofree nosync nounwind willreturn memory(none) }
134;.
135