xref: /llvm-project/llvm/test/Transforms/DeadStoreElimination/calloc-store.ll (revision f497a00da968b0ff90d8c98caa184d14b9a92495)
1; RUN: opt < %s -passes=dse -S | FileCheck %s
2
3declare noalias ptr @calloc(i64, i64) inaccessiblememonly allockind("alloc,zeroed")
4
5define ptr @test1() {
6; CHECK-LABEL: test1
7  %1 = tail call noalias ptr @calloc(i64 1, i64 4)
8  ; This store is dead and should be removed
9  store i32 0, ptr %1, align 4
10; CHECK-NOT: store i32 0, ptr %1, align 4
11  ret ptr %1
12}
13
14define ptr @test2() {
15; CHECK-LABEL: test2
16  %1 = tail call noalias ptr @calloc(i64 1, i64 4)
17  %2 = getelementptr i32, ptr %1, i32 5
18  store i32 0, ptr %2, align 4
19; CHECK-NOT: store i32 0, ptr %1, align 4
20  ret ptr %1
21}
22
23define ptr @test3(ptr %arg) {
24; CHECK-LABEL: test3
25  store i32 0, ptr %arg, align 4
26; CHECK: store i32 0, ptr %arg, align 4
27  ret ptr %arg
28}
29
30declare void @clobber_memory(ptr)
31define ptr @test4() {
32; CHECK-LABEL: test4
33  %1 = tail call noalias ptr @calloc(i64 1, i64 4)
34  call void @clobber_memory(ptr %1)
35  store i8 0, ptr %1, align 4
36; CHECK: store i8 0, ptr %1, align 4
37  ret ptr %1
38}
39
40define ptr @test5() {
41; CHECK-LABEL: test5
42  %1 = tail call noalias ptr @calloc(i64 1, i64 4)
43  store volatile i32 0, ptr %1, align 4
44; CHECK: store volatile i32 0, ptr %1, align 4
45  ret ptr %1
46}
47
48define ptr @test6() {
49; CHECK-LABEL: test6
50  %1 = tail call noalias ptr @calloc(i64 1, i64 4)
51  store i8 5, ptr %1, align 4
52; CHECK: store i8 5, ptr %1, align 4
53  ret ptr %1
54}
55
56define ptr @test7(i8 %arg) {
57; CHECK-LABEL: test7
58  %1 = tail call noalias ptr @calloc(i64 1, i64 4)
59  store i8 %arg, ptr %1, align 4
60; CHECK: store i8 %arg, ptr %1, align 4
61  ret ptr %1
62}
63
64define ptr @test8() {
65; CHECK-LABEL: test8
66; CHECK-NOT: store
67  %p = tail call noalias ptr @calloc(i64 1, i64 4)
68  store i8 0, ptr %p, align 1
69  %p.1 = getelementptr i8, ptr %p, i32 1
70  store i8 0, ptr %p.1, align 1
71  %p.3 = getelementptr i8, ptr %p, i32 3
72  store i8 0, ptr %p.3, align 1
73  %p.2 = getelementptr i8, ptr %p, i32 2
74  store i8 0, ptr %p.2, align 1
75  ret ptr %p
76}
77
78define ptr @test9() {
79; CHECK-LABEL: test9
80; CHECK-NEXT:    %p = tail call noalias ptr @calloc(i64 1, i64 4)
81; CHECK-NEXT:    store i8 5, ptr %p, align 1
82; CHECK-NEXT:    ret ptr %p
83
84  %p = tail call noalias ptr @calloc(i64 1, i64 4)
85  store i8 5, ptr %p, align 1
86  %p.1 = getelementptr i8, ptr %p, i32 1
87  store i8 0, ptr %p.1, align 1
88  %p.3 = getelementptr i8, ptr %p, i32 3
89  store i8 0, ptr %p.3, align 1
90  %p.2 = getelementptr i8, ptr %p, i32 2
91  store i8 0, ptr %p.2, align 1
92  ret ptr %p
93}
94
95define ptr @test10() {
96; CHECK-LABEL: @test10(
97; CHECK-NEXT:    [[P:%.*]] = tail call noalias ptr @calloc(i64 1, i64 4)
98; CHECK-NEXT:    [[P_3:%.*]] = getelementptr i8, ptr [[P]], i32 3
99; CHECK-NEXT:    store i8 5, ptr [[P_3]], align 1
100; CHECK-NEXT:    ret ptr [[P]]
101;
102
103  %p = tail call noalias ptr @calloc(i64 1, i64 4)
104  store i8 0, ptr %p, align 1
105  %p.1 = getelementptr i8, ptr %p, i32 1
106  store i8 0, ptr %p.1, align 1
107  %p.3 = getelementptr i8, ptr %p, i32 3
108  store i8 5, ptr %p.3, align 1
109  %p.2 = getelementptr i8, ptr %p, i32 2
110  store i8 0, ptr %p.2, align 1
111  ret ptr %p
112}
113
114define ptr @test11() {
115; CHECK-LABEL: @test11(
116; CHECK-NEXT:    [[P:%.*]] = tail call noalias ptr @calloc(i64 1, i64 4)
117; CHECK-NEXT:    ret ptr [[P]]
118;
119
120  %p = tail call noalias ptr @calloc(i64 1, i64 4)
121  store i8 0, ptr %p, align 1
122  %p.1 = getelementptr i8, ptr %p, i32 1
123  store i8 0, ptr %p.1, align 1
124  %p.3 = getelementptr i8, ptr %p, i32 3
125  store i8 5, ptr %p.3, align 1
126  %p.2 = getelementptr i8, ptr %p, i32 2
127  store i8 0, ptr %p.2, align 1
128  %p.3.2 = getelementptr i8, ptr %p, i32 3
129  store i8 0, ptr %p.3.2, align 1
130  ret ptr %p
131}
132
133define ptr @test12() {
134; CHECK-LABEL: @test12(
135; CHECK-NEXT:    [[P:%.*]] = tail call noalias ptr @calloc(i64 1, i64 4)
136; CHECK-NEXT:    [[P_3:%.*]] = getelementptr i8, ptr [[P]], i32 3
137; CHECK-NEXT:    store i8 5, ptr [[P_3]], align 1
138; CHECK-NEXT:    call void @use(ptr [[P]])
139; CHECK-NEXT:    [[P_3_2:%.*]] = getelementptr i8, ptr [[P]], i32 3
140; CHECK-NEXT:    store i8 0, ptr [[P_3_2]], align 1
141; CHECK-NEXT:    ret ptr [[P]]
142;
143
144  %p = tail call noalias ptr @calloc(i64 1, i64 4)
145  %p.3 = getelementptr i8, ptr %p, i32 3
146  store i8 5, ptr %p.3, align 1
147  call void @use(ptr %p)
148  %p.3.2 = getelementptr i8, ptr %p, i32 3
149  store i8 0, ptr %p.3.2, align 1
150  ret ptr %p
151}
152
153declare void @use(ptr) readonly
154