xref: /llvm-project/llvm/test/Transforms/GlobalOpt/ctor-memset.ll (revision a722e2366bede3d476c5bf3ff11428102aa4891f)
1999aa6bfSNikita Popov; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals
20676acb6SBjorn Pettersson; RUN: opt -S -passes=globalopt < %s | FileCheck %s
3999aa6bfSNikita Popov
4f65c88c4SNikita Popovtarget datalayout = "p1:32:32"
5f65c88c4SNikita Popov
6*a722e236SNikita Popov@llvm.global_ctors = appending global [11 x { i32, ptr, ptr }] [
7999aa6bfSNikita Popov  { i32, ptr, ptr } { i32 65535, ptr @ctor0, ptr null },
8999aa6bfSNikita Popov  { i32, ptr, ptr } { i32 65535, ptr @ctor1, ptr null },
9999aa6bfSNikita Popov  { i32, ptr, ptr } { i32 65535, ptr @ctor2, ptr null },
10999aa6bfSNikita Popov  { i32, ptr, ptr } { i32 65535, ptr @ctor3, ptr null },
11999aa6bfSNikita Popov  { i32, ptr, ptr } { i32 65535, ptr @ctor4, ptr null },
12771c46adSNikita Popov  { i32, ptr, ptr } { i32 65535, ptr @ctor5, ptr null },
13771c46adSNikita Popov  { i32, ptr, ptr } { i32 65535, ptr @ctor6, ptr null },
14f65c88c4SNikita Popov  { i32, ptr, ptr } { i32 65535, ptr @ctor7, ptr null },
15*a722e236SNikita Popov  { i32, ptr, ptr } { i32 65535, ptr @ctor8, ptr null },
16*a722e236SNikita Popov  { i32, ptr, ptr } { i32 65535, ptr @ctor9, ptr null },
17*a722e236SNikita Popov  { i32, ptr, ptr } { i32 65535, ptr @ctor10, ptr null }
18999aa6bfSNikita Popov]
19999aa6bfSNikita Popov
20*a722e236SNikita Popov
21*a722e236SNikita Popov; memset of all-zero global
22*a722e236SNikita Popov@g0 = global { i32, i32 } zeroinitializer
23999aa6bfSNikita Popov;.
24*a722e236SNikita Popov; CHECK: @[[LLVM_GLOBAL_CTORS:[a-zA-Z0-9_$"\\.-]+]] = appending global [4 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @ctor3, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @ctor4, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @ctor7, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @ctor10, ptr null }]
25999aa6bfSNikita Popov; CHECK: @[[G0:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i32, i32 } zeroinitializer
26999aa6bfSNikita Popov; CHECK: @[[G1:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i32, i32, i32 } { i32 0, i32 0, i32 1 }
27999aa6bfSNikita Popov; CHECK: @[[G2:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i32, i32, i32 } { i32 1, i32 0, i32 0 }
28999aa6bfSNikita Popov; CHECK: @[[G3:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i32, i32 } { i32 0, i32 1 }
29999aa6bfSNikita Popov; CHECK: @[[G4:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i32, i32 } { i32 0, i32 undef }
30999aa6bfSNikita Popov; CHECK: @[[G5:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i16, i32 } { i16 0, i32 1 }
31771c46adSNikita Popov; CHECK: @[[G6:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i32, i32 } { i32 -1, i32 -1 }
32771c46adSNikita Popov; CHECK: @[[G7:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i32, i32 } { i32 -1, i32 1 }
33f65c88c4SNikita Popov; CHECK: @[[G8:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr addrspace(1) global { i32, i32 } zeroinitializer
34*a722e236SNikita Popov; CHECK: @[[G9:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global [100000000 x i32] zeroinitializer
35*a722e236SNikita Popov; CHECK: @[[G10:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { [99999999 x i32], i32 } { [99999999 x i32] zeroinitializer, i32 1 }
36999aa6bfSNikita Popov;.
37999aa6bfSNikita Popovdefine internal void @ctor0() {
38999aa6bfSNikita Popov  call void @llvm.memset.p0.i64(ptr @g0, i8 0, i64 8, i1 false)
39999aa6bfSNikita Popov  ret void
40999aa6bfSNikita Popov}
41999aa6bfSNikita Popov
42999aa6bfSNikita Popov; memset of zero prefix
43999aa6bfSNikita Popov@g1 = global { i32, i32, i32 } { i32 0, i32 0, i32 1 }
44999aa6bfSNikita Popov
45999aa6bfSNikita Popovdefine internal void @ctor1() {
46999aa6bfSNikita Popov  call void @llvm.memset.p0.i64(ptr @g1, i8 0, i64 8, i1 false)
47999aa6bfSNikita Popov  ret void
48999aa6bfSNikita Popov}
49999aa6bfSNikita Popov
50999aa6bfSNikita Popov; memset of zero suffix
51999aa6bfSNikita Popov@g2 = global { i32, i32, i32 } { i32 1, i32 0, i32 0 }
52999aa6bfSNikita Popov
53999aa6bfSNikita Popovdefine internal void @ctor2() {
54999aa6bfSNikita Popov  call void @llvm.memset.p0.i64(ptr getelementptr (i32, ptr @g2, i64 1), i8 0, i64 8, i1 false)
55999aa6bfSNikita Popov  ret void
56999aa6bfSNikita Popov}
57999aa6bfSNikita Popov
58999aa6bfSNikita Popov; memset of some non-zero bytes
59999aa6bfSNikita Popov@g3 = global { i32, i32 } { i32 0, i32 1 }
60999aa6bfSNikita Popov
61999aa6bfSNikita Popovdefine internal void @ctor3() {
62f65c88c4SNikita Popov; CHECK-LABEL: @ctor3(
63f65c88c4SNikita Popov; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr @g3, i8 0, i64 8, i1 false)
64f65c88c4SNikita Popov; CHECK-NEXT:    ret void
65f65c88c4SNikita Popov;
66999aa6bfSNikita Popov  call void @llvm.memset.p0.i64(ptr @g3, i8 0, i64 8, i1 false)
67999aa6bfSNikita Popov  ret void
68999aa6bfSNikita Popov}
69999aa6bfSNikita Popov
70999aa6bfSNikita Popov; memset of some undef bytes
71999aa6bfSNikita Popov@g4 = global { i32, i32 } { i32 0, i32 undef }
72999aa6bfSNikita Popov
73999aa6bfSNikita Popovdefine internal void @ctor4() {
74f65c88c4SNikita Popov; CHECK-LABEL: @ctor4(
75f65c88c4SNikita Popov; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr @g4, i8 0, i64 8, i1 false)
76f65c88c4SNikita Popov; CHECK-NEXT:    ret void
77f65c88c4SNikita Popov;
78999aa6bfSNikita Popov  call void @llvm.memset.p0.i64(ptr @g4, i8 0, i64 8, i1 false)
79999aa6bfSNikita Popov  ret void
80999aa6bfSNikita Popov}
81999aa6bfSNikita Popov
82999aa6bfSNikita Popov; memset including padding bytes
83f65c88c4SNikita Popov; FIXME: We still incorrectly optimize the memset away here, even though code
84f65c88c4SNikita Popov; might access the padding.
85999aa6bfSNikita Popov@g5 = global { i16, i32 } { i16 0, i32 1 }
86999aa6bfSNikita Popov
87999aa6bfSNikita Popovdefine internal void @ctor5() {
88999aa6bfSNikita Popov  call void @llvm.memset.p0.i64(ptr @g5, i8 0, i64 4, i1 false)
89999aa6bfSNikita Popov  ret void
90999aa6bfSNikita Popov}
91999aa6bfSNikita Popov
92771c46adSNikita Popov; memset of non-zero value (matching initializer)
93771c46adSNikita Popov@g6 = global { i32, i32 } { i32 -1, i32 -1 }
94771c46adSNikita Popov
95771c46adSNikita Popovdefine internal void @ctor6() {
96771c46adSNikita Popov  call void @llvm.memset.p0.i64(ptr @g6, i8 -1, i64 8, i1 false)
97771c46adSNikita Popov  ret void
98771c46adSNikita Popov}
99771c46adSNikita Popov
100771c46adSNikita Popov; memset of non-zero value (not matching initializer)
101771c46adSNikita Popov@g7 = global { i32, i32 } { i32 -1, i32 1 }
102771c46adSNikita Popov
103771c46adSNikita Popovdefine internal void @ctor7() {
104771c46adSNikita Popov; CHECK-LABEL: @ctor7(
105771c46adSNikita Popov; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr @g7, i8 -1, i64 8, i1 false)
106771c46adSNikita Popov; CHECK-NEXT:    ret void
107771c46adSNikita Popov;
108771c46adSNikita Popov  call void @llvm.memset.p0.i64(ptr @g7, i8 -1, i64 8, i1 false)
109771c46adSNikita Popov  ret void
110771c46adSNikita Popov}
111771c46adSNikita Popov
112f65c88c4SNikita Popov; memset of zero value in differently-sized address space
113f65c88c4SNikita Popov@g8 = addrspace(1) global { i32, i32 } zeroinitializer
114f65c88c4SNikita Popov
115f65c88c4SNikita Popovdefine internal void @ctor8() {
116f65c88c4SNikita Popov  call void @llvm.memset.p0.i64(ptr addrspacecast (ptr addrspace(1) @g8 to ptr), i8 0, i64 8, i1 false)
117f65c88c4SNikita Popov  ret void
118f65c88c4SNikita Popov}
119f65c88c4SNikita Popov
120*a722e236SNikita Popov@g9 = global [100000000 x i32] zeroinitializer
121*a722e236SNikita Popov
122*a722e236SNikita Popovdefine internal void @ctor9() {
123*a722e236SNikita Popov  call void @llvm.memset.p0.i64(ptr @g9, i8 0, i64 100000000, i1 false)
124*a722e236SNikita Popov  ret void
125*a722e236SNikita Popov}
126*a722e236SNikita Popov
127*a722e236SNikita Popov@g10 = global { [99999999 x i32], i32 } { [99999999 x i32 ] zeroinitializer, i32 1 }
128*a722e236SNikita Popov
129*a722e236SNikita Popovdefine internal void @ctor10() {
130*a722e236SNikita Popov; CHECK-LABEL: @ctor10(
131*a722e236SNikita Popov; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr @g10, i8 0, i64 100000000, i1 false)
132*a722e236SNikita Popov; CHECK-NEXT:    ret void
133*a722e236SNikita Popov;
134*a722e236SNikita Popov  call void @llvm.memset.p0.i64(ptr @g10, i8 0, i64 100000000, i1 false)
135*a722e236SNikita Popov  ret void
136*a722e236SNikita Popov}
137*a722e236SNikita Popov
138999aa6bfSNikita Popovdeclare void @llvm.memset.p0.i64(ptr, i8, i64, i1)
139771c46adSNikita Popov;.
140304f1d59SNikita Popov; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: write) }
141771c46adSNikita Popov;.
142