blob: 2a61fff15ade0af3244c0933f1158d5e8a4a523e [file] [log] [blame]
Sanjay Patel1d04b5b2017-09-26 13:54:28 +00001; RUN: opt -S -dse -enable-dse-partial-store-merging=false < %s | FileCheck %s
Hal Finkela1271032016-06-23 13:46:39 +00002target datalayout = "E-m:e-i64:64-n32:64"
3target triple = "powerpc64-bgq-linux"
4
5%"struct.std::complex" = type { { float, float } }
6
7define void @_Z4testSt7complexIfE(%"struct.std::complex"* noalias nocapture sret %agg.result, i64 %c.coerce) {
8entry:
9; CHECK-LABEL: @_Z4testSt7complexIfE
10
11 %ref.tmp = alloca i64, align 8
12 %tmpcast = bitcast i64* %ref.tmp to %"struct.std::complex"*
13 %c.sroa.0.0.extract.shift = lshr i64 %c.coerce, 32
14 %c.sroa.0.0.extract.trunc = trunc i64 %c.sroa.0.0.extract.shift to i32
15 %0 = bitcast i32 %c.sroa.0.0.extract.trunc to float
16 %c.sroa.2.0.extract.trunc = trunc i64 %c.coerce to i32
17 %1 = bitcast i32 %c.sroa.2.0.extract.trunc to float
18 call void @_Z3barSt7complexIfE(%"struct.std::complex"* nonnull sret %tmpcast, i64 %c.coerce)
19 %2 = bitcast %"struct.std::complex"* %agg.result to i64*
20 %3 = load i64, i64* %ref.tmp, align 8
21 store i64 %3, i64* %2, align 4
22; CHECK-NOT: store i64
23
24 %_M_value.realp.i.i = getelementptr inbounds %"struct.std::complex", %"struct.std::complex"* %agg.result, i64 0, i32 0, i32 0
25 %4 = lshr i64 %3, 32
26 %5 = trunc i64 %4 to i32
27 %6 = bitcast i32 %5 to float
28 %_M_value.imagp.i.i = getelementptr inbounds %"struct.std::complex", %"struct.std::complex"* %agg.result, i64 0, i32 0, i32 1
29 %7 = trunc i64 %3 to i32
30 %8 = bitcast i32 %7 to float
31 %mul_ad.i.i = fmul fast float %6, %1
32 %mul_bc.i.i = fmul fast float %8, %0
33 %mul_i.i.i = fadd fast float %mul_ad.i.i, %mul_bc.i.i
34 %mul_ac.i.i = fmul fast float %6, %0
35 %mul_bd.i.i = fmul fast float %8, %1
36 %mul_r.i.i = fsub fast float %mul_ac.i.i, %mul_bd.i.i
37 store float %mul_r.i.i, float* %_M_value.realp.i.i, align 4
38 store float %mul_i.i.i, float* %_M_value.imagp.i.i, align 4
39 ret void
40; CHECK: ret void
41}
42
43declare void @_Z3barSt7complexIfE(%"struct.std::complex"* sret, i64)
44
45define void @test1(i32 *%ptr) {
46entry:
47; CHECK-LABEL: @test1
48
49 store i32 5, i32* %ptr
50 %bptr = bitcast i32* %ptr to i8*
51 store i8 7, i8* %bptr
52 %wptr = bitcast i32* %ptr to i16*
53 store i16 -30062, i16* %wptr
54 %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2
55 store i8 25, i8* %bptr2
56 %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3
57 store i8 47, i8* %bptr3
58 %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1
59 %wptrp = bitcast i8* %bptr1 to i16*
60 store i16 2020, i16* %wptrp, align 1
61 ret void
62
63; CHECK-NOT: store i32 5, i32* %ptr
64; CHECK-NOT: store i8 7, i8* %bptr
65; CHECK: store i16 -30062, i16* %wptr
66; CHECK-NOT: store i8 25, i8* %bptr2
67; CHECK: store i8 47, i8* %bptr3
68; CHECK: store i16 2020, i16* %wptrp, align 1
69
70; CHECK: ret void
71}
72
73define void @test2(i32 *%ptr) {
74entry:
75; CHECK-LABEL: @test2
76
77 store i32 5, i32* %ptr
78
79 %bptr = bitcast i32* %ptr to i8*
80 %bptrm1 = getelementptr inbounds i8, i8* %bptr, i64 -1
81 %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1
82 %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2
83 %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3
84
85 %wptr = bitcast i8* %bptr to i16*
86 %wptrm1 = bitcast i8* %bptrm1 to i16*
87 %wptr1 = bitcast i8* %bptr1 to i16*
88 %wptr2 = bitcast i8* %bptr2 to i16*
89 %wptr3 = bitcast i8* %bptr3 to i16*
90
91 store i16 1456, i16* %wptrm1, align 1
92 store i16 1346, i16* %wptr, align 1
93 store i16 1756, i16* %wptr1, align 1
94 store i16 1126, i16* %wptr2, align 1
95 store i16 5656, i16* %wptr3, align 1
96
97; CHECK-NOT: store i32 5, i32* %ptr
98
99; CHECK: store i16 1456, i16* %wptrm1, align 1
100; CHECK: store i16 1346, i16* %wptr, align 1
101; CHECK: store i16 1756, i16* %wptr1, align 1
102; CHECK: store i16 1126, i16* %wptr2, align 1
103; CHECK: store i16 5656, i16* %wptr3, align 1
104
105 ret void
106
107; CHECK: ret void
108}
109
110define signext i8 @test3(i32 *%ptr) {
111entry:
112; CHECK-LABEL: @test3
113
114 store i32 5, i32* %ptr
115
116 %bptr = bitcast i32* %ptr to i8*
117 %bptrm1 = getelementptr inbounds i8, i8* %bptr, i64 -1
118 %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1
119 %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2
120 %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3
121
122 %wptr = bitcast i8* %bptr to i16*
123 %wptrm1 = bitcast i8* %bptrm1 to i16*
124 %wptr1 = bitcast i8* %bptr1 to i16*
125 %wptr2 = bitcast i8* %bptr2 to i16*
126 %wptr3 = bitcast i8* %bptr3 to i16*
127
128 %v = load i8, i8* %bptr, align 1
129 store i16 1456, i16* %wptrm1, align 1
130 store i16 1346, i16* %wptr, align 1
131 store i16 1756, i16* %wptr1, align 1
132 store i16 1126, i16* %wptr2, align 1
133 store i16 5656, i16* %wptr3, align 1
134
135; CHECK: store i32 5, i32* %ptr
136
137 ret i8 %v
138
139; CHECK: ret i8 %v
140}
141
142%struct.foostruct = type {
143i32 (i8*, i8**, i32, i8, i8*)*,
144i32 (i8*, i8**, i32, i8, i8*)*,
145i32 (i8*, i8**, i32, i8, i8*)*,
146i32 (i8*, i8**, i32, i8, i8*)*,
147void (i8*, i32, i32)*
148}
Daniel Neilson1e687242018-01-19 17:13:12 +0000149declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1)
Hal Finkela1271032016-06-23 13:46:39 +0000150declare void @goFunc(%struct.foostruct*)
151declare i32 @fa(i8*, i8**, i32, i8, i8*)
152
153define void @test4() {
154entry:
155; CHECK-LABEL: @test4
156
157 %bang = alloca %struct.foostruct, align 8
158 %v1 = bitcast %struct.foostruct* %bang to i8*
Daniel Neilson1e687242018-01-19 17:13:12 +0000159 call void @llvm.memset.p0i8.i64(i8* align 8 %v1, i8 0, i64 40, i1 false)
Hal Finkela1271032016-06-23 13:46:39 +0000160 %v2 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 0
161 store i32 (i8*, i8**, i32, i8, i8*)* @fa, i32 (i8*, i8**, i32, i8, i8*)** %v2, align 8
162 %v3 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 1
163 store i32 (i8*, i8**, i32, i8, i8*)* @fa, i32 (i8*, i8**, i32, i8, i8*)** %v3, align 8
164 %v4 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 2
165 store i32 (i8*, i8**, i32, i8, i8*)* @fa, i32 (i8*, i8**, i32, i8, i8*)** %v4, align 8
166 %v5 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 3
167 store i32 (i8*, i8**, i32, i8, i8*)* @fa, i32 (i8*, i8**, i32, i8, i8*)** %v5, align 8
168 %v6 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 4
169 store void (i8*, i32, i32)* null, void (i8*, i32, i32)** %v6, align 8
170 call void @goFunc(%struct.foostruct* %bang)
171 ret void
172
173; CHECK-NOT: memset
174; CHECK: ret void
175}
176
177define signext i8 @test5(i32 *%ptr) {
178entry:
179; CHECK-LABEL: @test5
180
181 store i32 0, i32* %ptr
182
183 %bptr = bitcast i32* %ptr to i8*
184 %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1
185 %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2
186 %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3
187
188 %wptr = bitcast i8* %bptr to i16*
189 %wptr1 = bitcast i8* %bptr1 to i16*
190 %wptr2 = bitcast i8* %bptr2 to i16*
191
192 store i16 65535, i16* %wptr2, align 1
193 store i16 1456, i16* %wptr1, align 1
194 store i16 1346, i16* %wptr, align 1
195
196; CHECK-NOT: store i32 0, i32* %ptr
197
198 ret i8 0
199}
200
Jun Bum Lim596a3bd2016-06-30 15:32:20 +0000201define signext i8 @test6(i32 *%ptr) {
202entry:
203; CHECK-LABEL: @test6
204
205 store i32 0, i32* %ptr
206
207 %bptr = bitcast i32* %ptr to i16*
208 %bptr1 = getelementptr inbounds i16, i16* %bptr, i64 0
209 %bptr2 = getelementptr inbounds i16, i16* %bptr, i64 1
210
211 store i16 1456, i16* %bptr2, align 1
212 store i16 65535, i16* %bptr1, align 1
213
214; CHECK-NOT: store i32 0, i32* %ptr
215
216 ret i8 0
217}
218
219define signext i8 @test7(i64 *%ptr) {
220entry:
221; CHECK-LABEL: @test7
222
223 store i64 0, i64* %ptr
224
225 %bptr = bitcast i64* %ptr to i16*
226 %bptr1 = getelementptr inbounds i16, i16* %bptr, i64 0
227 %bptr2 = getelementptr inbounds i16, i16* %bptr, i64 1
228 %bptr3 = getelementptr inbounds i16, i16* %bptr, i64 2
229 %bptr4 = getelementptr inbounds i16, i16* %bptr, i64 3
230
231 store i16 1346, i16* %bptr1, align 1
232 store i16 1756, i16* %bptr3, align 1
233 store i16 1456, i16* %bptr2, align 1
234 store i16 5656, i16* %bptr4, align 1
235
236; CHECK-NOT: store i64 0, i64* %ptr
237
238 ret i8 0
239}