xref: /llvm-project/llvm/test/Transforms/DeadStoreElimination/OverwriteStoreBegin.ll (revision f497a00da968b0ff90d8c98caa184d14b9a92495)
1176bbcaeSNikita Popov; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*f497a00dSBjorn Pettersson; RUN: opt < %s -passes=dse -S | FileCheck %s
3176bbcaeSNikita Popov
4c603cefbSNikita Popovdefine void @write4to7(ptr nocapture %p) {
5176bbcaeSNikita Popov; CHECK-LABEL: @write4to7(
6176bbcaeSNikita Popov; CHECK-NEXT:  entry:
7c603cefbSNikita Popov; CHECK-NEXT:    [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 1
8c603cefbSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[ARRAYIDX0]], i64 4
9c603cefbSNikita Popov; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 24, i1 false)
10c603cefbSNikita Popov; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 1
11c603cefbSNikita Popov; CHECK-NEXT:    store i32 1, ptr [[ARRAYIDX1]], align 4
12176bbcaeSNikita Popov; CHECK-NEXT:    ret void
13176bbcaeSNikita Popov;
14176bbcaeSNikita Popoventry:
15c603cefbSNikita Popov  %arrayidx0 = getelementptr inbounds i32, ptr %p, i64 1
16c603cefbSNikita Popov  call void @llvm.memset.p0.i64(ptr align 4 %arrayidx0, i8 0, i64 28, i1 false)
17c603cefbSNikita Popov  %arrayidx1 = getelementptr inbounds i32, ptr %p, i64 1
18c603cefbSNikita Popov  store i32 1, ptr %arrayidx1, align 4
19176bbcaeSNikita Popov  ret void
20176bbcaeSNikita Popov}
21176bbcaeSNikita Popov
22c603cefbSNikita Popovdefine void @write4to7_weird_element_type(ptr nocapture %p) {
23f00941e0SNikita Popov; CHECK-LABEL: @write4to7_weird_element_type(
24f00941e0SNikita Popov; CHECK-NEXT:  entry:
25c603cefbSNikita Popov; CHECK-NEXT:    [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 1
26c603cefbSNikita Popov; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[ARRAYIDX0]], i64 4
27c603cefbSNikita Popov; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 4 [[TMP1]], i8 0, i64 24, i1 false)
28c603cefbSNikita Popov; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 1
29c603cefbSNikita Popov; CHECK-NEXT:    store i32 1, ptr [[ARRAYIDX1]], align 4
30f00941e0SNikita Popov; CHECK-NEXT:    ret void
31f00941e0SNikita Popov;
32f00941e0SNikita Popoventry:
33c603cefbSNikita Popov  %arrayidx0 = getelementptr inbounds i32, ptr %p, i64 1
34c603cefbSNikita Popov  call void @llvm.memset.p0.i64(ptr align 4 %arrayidx0, i8 0, i64 28, i1 false)
35c603cefbSNikita Popov  %arrayidx1 = getelementptr inbounds i32, ptr %p, i64 1
36c603cefbSNikita Popov  store i32 1, ptr %arrayidx1, align 4
37f00941e0SNikita Popov  ret void
38f00941e0SNikita Popov}
39f00941e0SNikita Popov
40c603cefbSNikita Popovdefine void @write4to7_addrspace(ptr addrspace(1) nocapture %p) {
41e8170291SNikita Popov; CHECK-LABEL: @write4to7_addrspace(
42e8170291SNikita Popov; CHECK-NEXT:  entry:
43c603cefbSNikita Popov; CHECK-NEXT:    [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, ptr addrspace(1) [[P:%.*]], i64 1
44c603cefbSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[ARRAYIDX0]], i64 4
45c603cefbSNikita Popov; CHECK-NEXT:    call void @llvm.memset.p1.i64(ptr addrspace(1) align 4 [[TMP0]], i8 0, i64 24, i1 false)
46c603cefbSNikita Popov; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr addrspace(1) [[P]], i64 1
47c603cefbSNikita Popov; CHECK-NEXT:    store i32 1, ptr addrspace(1) [[ARRAYIDX1]], align 4
48e8170291SNikita Popov; CHECK-NEXT:    ret void
49e8170291SNikita Popov;
50e8170291SNikita Popoventry:
51c603cefbSNikita Popov  %arrayidx0 = getelementptr inbounds i32, ptr addrspace(1) %p, i64 1
52c603cefbSNikita Popov  call void @llvm.memset.p1.i64(ptr addrspace(1) align 4 %arrayidx0, i8 0, i64 28, i1 false)
53c603cefbSNikita Popov  %arrayidx1 = getelementptr inbounds i32, ptr addrspace(1) %p, i64 1
54c603cefbSNikita Popov  store i32 1, ptr addrspace(1) %arrayidx1, align 4
55e8170291SNikita Popov  ret void
56e8170291SNikita Popov}
57e8170291SNikita Popov
58c603cefbSNikita Popovdefine void @write4to7_atomic(ptr nocapture %p) {
59176bbcaeSNikita Popov; CHECK-LABEL: @write4to7_atomic(
60176bbcaeSNikita Popov; CHECK-NEXT:  entry:
61c603cefbSNikita Popov; CHECK-NEXT:    [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 1
62c603cefbSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[ARRAYIDX0]], i64 4
63c603cefbSNikita Popov; CHECK-NEXT:    call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 24, i32 4)
64c603cefbSNikita Popov; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 1
65c603cefbSNikita Popov; CHECK-NEXT:    store atomic i32 1, ptr [[ARRAYIDX1]] unordered, align 4
66176bbcaeSNikita Popov; CHECK-NEXT:    ret void
67176bbcaeSNikita Popov;
68176bbcaeSNikita Popoventry:
69c603cefbSNikita Popov  %arrayidx0 = getelementptr inbounds i32, ptr %p, i64 1
70c603cefbSNikita Popov  call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 %arrayidx0, i8 0, i64 28, i32 4)
71c603cefbSNikita Popov  %arrayidx1 = getelementptr inbounds i32, ptr %p, i64 1
72c603cefbSNikita Popov  store atomic i32 1, ptr %arrayidx1 unordered, align 4
73176bbcaeSNikita Popov  ret void
74176bbcaeSNikita Popov}
75176bbcaeSNikita Popov
76c603cefbSNikita Popovdefine void @write0to3(ptr nocapture %p) {
77176bbcaeSNikita Popov; CHECK-LABEL: @write0to3(
78176bbcaeSNikita Popov; CHECK-NEXT:  entry:
79c603cefbSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 4
80c603cefbSNikita Popov; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 24, i1 false)
81c603cefbSNikita Popov; CHECK-NEXT:    store i32 1, ptr [[P]], align 4
82176bbcaeSNikita Popov; CHECK-NEXT:    ret void
83176bbcaeSNikita Popov;
84176bbcaeSNikita Popoventry:
85c603cefbSNikita Popov  call void @llvm.memset.p0.i64(ptr align 4 %p, i8 0, i64 28, i1 false)
86c603cefbSNikita Popov  store i32 1, ptr %p, align 4
87176bbcaeSNikita Popov  ret void
88176bbcaeSNikita Popov}
89176bbcaeSNikita Popov
90c603cefbSNikita Popovdefine void @write0to3_atomic(ptr nocapture %p) {
91176bbcaeSNikita Popov; CHECK-LABEL: @write0to3_atomic(
92176bbcaeSNikita Popov; CHECK-NEXT:  entry:
93c603cefbSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 4
94c603cefbSNikita Popov; CHECK-NEXT:    call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 24, i32 4)
95c603cefbSNikita Popov; CHECK-NEXT:    store atomic i32 1, ptr [[P]] unordered, align 4
96176bbcaeSNikita Popov; CHECK-NEXT:    ret void
97176bbcaeSNikita Popov;
98176bbcaeSNikita Popoventry:
99c603cefbSNikita Popov  call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 %p, i8 0, i64 28, i32 4)
100c603cefbSNikita Popov  store atomic i32 1, ptr %p unordered, align 4
101176bbcaeSNikita Popov  ret void
102176bbcaeSNikita Popov}
103176bbcaeSNikita Popov
104176bbcaeSNikita Popov; Atomicity of the store is weaker from the memset
105c603cefbSNikita Popovdefine void @write0to3_atomic_weaker(ptr nocapture %p) {
106176bbcaeSNikita Popov; CHECK-LABEL: @write0to3_atomic_weaker(
107176bbcaeSNikita Popov; CHECK-NEXT:  entry:
108c603cefbSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 4
109c603cefbSNikita Popov; CHECK-NEXT:    call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 24, i32 4)
110c603cefbSNikita Popov; CHECK-NEXT:    store i32 1, ptr [[P]], align 4
111176bbcaeSNikita Popov; CHECK-NEXT:    ret void
112176bbcaeSNikita Popov;
113176bbcaeSNikita Popoventry:
114c603cefbSNikita Popov  call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 %p, i8 0, i64 28, i32 4)
115c603cefbSNikita Popov  store i32 1, ptr %p, align 4
116176bbcaeSNikita Popov  ret void
117176bbcaeSNikita Popov}
118176bbcaeSNikita Popov
119c603cefbSNikita Popovdefine void @write0to7(ptr nocapture %p) {
120176bbcaeSNikita Popov; CHECK-LABEL: @write0to7(
121176bbcaeSNikita Popov; CHECK-NEXT:  entry:
122c603cefbSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 8
123c603cefbSNikita Popov; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 24, i1 false)
124c603cefbSNikita Popov; CHECK-NEXT:    store i64 1, ptr [[P]], align 8
125176bbcaeSNikita Popov; CHECK-NEXT:    ret void
126176bbcaeSNikita Popov;
127176bbcaeSNikita Popoventry:
128c603cefbSNikita Popov  call void @llvm.memset.p0.i64(ptr align 4 %p, i8 0, i64 32, i1 false)
129c603cefbSNikita Popov  store i64 1, ptr %p, align 8
130176bbcaeSNikita Popov  ret void
131176bbcaeSNikita Popov}
132176bbcaeSNikita Popov
133176bbcaeSNikita Popov; Changing the memset start and length is okay here because the
134176bbcaeSNikita Popov; store is a multiple of the memset element size
135c603cefbSNikita Popovdefine void @write0to7_atomic(ptr nocapture %p) {
136176bbcaeSNikita Popov; CHECK-LABEL: @write0to7_atomic(
137176bbcaeSNikita Popov; CHECK-NEXT:  entry:
138c603cefbSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 8
139c603cefbSNikita Popov; CHECK-NEXT:    call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 24, i32 4)
140c603cefbSNikita Popov; CHECK-NEXT:    store atomic i64 1, ptr [[P]] unordered, align 8
141176bbcaeSNikita Popov; CHECK-NEXT:    ret void
142176bbcaeSNikita Popov;
143176bbcaeSNikita Popoventry:
144c603cefbSNikita Popov  call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 %p, i8 0, i64 32, i32 4)
145c603cefbSNikita Popov  store atomic i64 1, ptr %p unordered, align 8
146176bbcaeSNikita Popov  ret void
147176bbcaeSNikita Popov}
148176bbcaeSNikita Popov
149c603cefbSNikita Popovdefine void @write0to7_2(ptr nocapture %p) {
150176bbcaeSNikita Popov; CHECK-LABEL: @write0to7_2(
151176bbcaeSNikita Popov; CHECK-NEXT:  entry:
152c603cefbSNikita Popov; CHECK-NEXT:    [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 1
153c603cefbSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[ARRAYIDX0]], i64 4
154c603cefbSNikita Popov; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 24, i1 false)
155c603cefbSNikita Popov; CHECK-NEXT:    store i64 1, ptr [[P]], align 8
156176bbcaeSNikita Popov; CHECK-NEXT:    ret void
157176bbcaeSNikita Popov;
158176bbcaeSNikita Popoventry:
159c603cefbSNikita Popov  %arrayidx0 = getelementptr inbounds i32, ptr %p, i64 1
160c603cefbSNikita Popov  call void @llvm.memset.p0.i64(ptr align 4 %arrayidx0, i8 0, i64 28, i1 false)
161c603cefbSNikita Popov  store i64 1, ptr %p, align 8
162176bbcaeSNikita Popov  ret void
163176bbcaeSNikita Popov}
164176bbcaeSNikita Popov
165c603cefbSNikita Popovdefine void @write0to7_2_atomic(ptr nocapture %p) {
166176bbcaeSNikita Popov; CHECK-LABEL: @write0to7_2_atomic(
167176bbcaeSNikita Popov; CHECK-NEXT:  entry:
168c603cefbSNikita Popov; CHECK-NEXT:    [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 1
169c603cefbSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[ARRAYIDX0]], i64 4
170c603cefbSNikita Popov; CHECK-NEXT:    call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 24, i32 4)
171c603cefbSNikita Popov; CHECK-NEXT:    store atomic i64 1, ptr [[P]] unordered, align 8
172176bbcaeSNikita Popov; CHECK-NEXT:    ret void
173176bbcaeSNikita Popov;
174176bbcaeSNikita Popoventry:
175c603cefbSNikita Popov  %arrayidx0 = getelementptr inbounds i32, ptr %p, i64 1
176c603cefbSNikita Popov  call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 %arrayidx0, i8 0, i64 28, i32 4)
177c603cefbSNikita Popov  store atomic i64 1, ptr %p unordered, align 8
178176bbcaeSNikita Popov  ret void
179176bbcaeSNikita Popov}
180176bbcaeSNikita Popov
181176bbcaeSNikita Popov; We do not trim the beginning of the eariler write if the alignment of the
182176bbcaeSNikita Popov; start pointer is changed.
183c603cefbSNikita Popovdefine void @dontwrite0to3_align8(ptr nocapture %p) {
184176bbcaeSNikita Popov; CHECK-LABEL: @dontwrite0to3_align8(
185176bbcaeSNikita Popov; CHECK-NEXT:  entry:
186c603cefbSNikita Popov; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 8 [[P:%.*]], i8 0, i64 32, i1 false)
187c603cefbSNikita Popov; CHECK-NEXT:    store i32 1, ptr [[P]], align 4
188176bbcaeSNikita Popov; CHECK-NEXT:    ret void
189176bbcaeSNikita Popov;
190176bbcaeSNikita Popoventry:
191c603cefbSNikita Popov  call void @llvm.memset.p0.i64(ptr align 8 %p, i8 0, i64 32, i1 false)
192c603cefbSNikita Popov  store i32 1, ptr %p, align 4
193176bbcaeSNikita Popov  ret void
194176bbcaeSNikita Popov}
195176bbcaeSNikita Popov
196c603cefbSNikita Popovdefine void @dontwrite0to3_align8_atomic(ptr nocapture %p) {
197176bbcaeSNikita Popov; CHECK-LABEL: @dontwrite0to3_align8_atomic(
198176bbcaeSNikita Popov; CHECK-NEXT:  entry:
199c603cefbSNikita Popov; CHECK-NEXT:    call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 [[P:%.*]], i8 0, i64 32, i32 4)
200c603cefbSNikita Popov; CHECK-NEXT:    store atomic i32 1, ptr [[P]] unordered, align 4
201176bbcaeSNikita Popov; CHECK-NEXT:    ret void
202176bbcaeSNikita Popov;
203176bbcaeSNikita Popoventry:
204c603cefbSNikita Popov  call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 %p, i8 0, i64 32, i32 4)
205c603cefbSNikita Popov  store atomic i32 1, ptr %p unordered, align 4
206176bbcaeSNikita Popov  ret void
207176bbcaeSNikita Popov}
208176bbcaeSNikita Popov
209c603cefbSNikita Popovdefine void @dontwrite0to1(ptr nocapture %p) {
210176bbcaeSNikita Popov; CHECK-LABEL: @dontwrite0to1(
211176bbcaeSNikita Popov; CHECK-NEXT:  entry:
212c603cefbSNikita Popov; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 4 [[P:%.*]], i8 0, i64 32, i1 false)
213c603cefbSNikita Popov; CHECK-NEXT:    store i16 1, ptr [[P]], align 4
214176bbcaeSNikita Popov; CHECK-NEXT:    ret void
215176bbcaeSNikita Popov;
216176bbcaeSNikita Popoventry:
217c603cefbSNikita Popov  call void @llvm.memset.p0.i64(ptr align 4 %p, i8 0, i64 32, i1 false)
218c603cefbSNikita Popov  store i16 1, ptr %p, align 4
219176bbcaeSNikita Popov  ret void
220176bbcaeSNikita Popov}
221176bbcaeSNikita Popov
222c603cefbSNikita Popovdefine void @dontwrite0to1_atomic(ptr nocapture %p) {
223176bbcaeSNikita Popov; CHECK-LABEL: @dontwrite0to1_atomic(
224176bbcaeSNikita Popov; CHECK-NEXT:  entry:
225c603cefbSNikita Popov; CHECK-NEXT:    call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 [[P:%.*]], i8 0, i64 32, i32 4)
226c603cefbSNikita Popov; CHECK-NEXT:    store atomic i16 1, ptr [[P]] unordered, align 4
227176bbcaeSNikita Popov; CHECK-NEXT:    ret void
228176bbcaeSNikita Popov;
229176bbcaeSNikita Popoventry:
230c603cefbSNikita Popov  call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 %p, i8 0, i64 32, i32 4)
231c603cefbSNikita Popov  store atomic i16 1, ptr %p unordered, align 4
232176bbcaeSNikita Popov  ret void
233176bbcaeSNikita Popov}
234176bbcaeSNikita Popov
235c603cefbSNikita Popovdefine void @write2to10(ptr nocapture %p) {
236176bbcaeSNikita Popov; CHECK-LABEL: @write2to10(
237176bbcaeSNikita Popov; CHECK-NEXT:  entry:
238c603cefbSNikita Popov; CHECK-NEXT:    [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 1
239c603cefbSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[ARRAYIDX0]], i64 4
240c603cefbSNikita Popov; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 28, i1 false)
241c603cefbSNikita Popov; CHECK-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 1
242c603cefbSNikita Popov; CHECK-NEXT:    store i64 1, ptr [[ARRAYIDX2]], align 8
243176bbcaeSNikita Popov; CHECK-NEXT:    ret void
244176bbcaeSNikita Popov;
245176bbcaeSNikita Popoventry:
246c603cefbSNikita Popov  %arrayidx0 = getelementptr inbounds i32, ptr %p, i64 1
247c603cefbSNikita Popov  call void @llvm.memset.p0.i64(ptr align 4 %arrayidx0, i8 0, i64 32, i1 false)
248c603cefbSNikita Popov  %arrayidx2 = getelementptr inbounds i16, ptr %p, i64 1
249c603cefbSNikita Popov  store i64 1, ptr %arrayidx2, align 8
250176bbcaeSNikita Popov  ret void
251176bbcaeSNikita Popov}
252176bbcaeSNikita Popov
253c603cefbSNikita Popovdefine void @write2to10_atomic(ptr nocapture %p) {
254176bbcaeSNikita Popov; CHECK-LABEL: @write2to10_atomic(
255176bbcaeSNikita Popov; CHECK-NEXT:  entry:
256c603cefbSNikita Popov; CHECK-NEXT:    [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 1
257c603cefbSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[ARRAYIDX0]], i64 4
258c603cefbSNikita Popov; CHECK-NEXT:    call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 28, i32 4)
259c603cefbSNikita Popov; CHECK-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 1
260c603cefbSNikita Popov; CHECK-NEXT:    store atomic i64 1, ptr [[ARRAYIDX2]] unordered, align 8
261176bbcaeSNikita Popov; CHECK-NEXT:    ret void
262176bbcaeSNikita Popov;
263176bbcaeSNikita Popoventry:
264c603cefbSNikita Popov  %arrayidx0 = getelementptr inbounds i32, ptr %p, i64 1
265c603cefbSNikita Popov  call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 %arrayidx0, i8 0, i64 32, i32 4)
266c603cefbSNikita Popov  %arrayidx2 = getelementptr inbounds i16, ptr %p, i64 1
267c603cefbSNikita Popov  store atomic i64 1, ptr %arrayidx2 unordered, align 8
268176bbcaeSNikita Popov  ret void
269176bbcaeSNikita Popov}
270176bbcaeSNikita Popov
271c603cefbSNikita Popovdefine void @write8To15AndThen0To7(ptr nocapture %P) {
272176bbcaeSNikita Popov; CHECK-LABEL: @write8To15AndThen0To7(
273176bbcaeSNikita Popov; CHECK-NEXT:  entry:
274c603cefbSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 16
275c603cefbSNikita Popov; CHECK-NEXT:    tail call void @llvm.memset.p0.i64(ptr align 8 [[TMP0]], i8 0, i64 16, i1 false)
276c603cefbSNikita Popov; CHECK-NEXT:    [[BASE64_1:%.*]] = getelementptr inbounds i64, ptr [[P]], i64 1
277c603cefbSNikita Popov; CHECK-NEXT:    store i64 1, ptr [[BASE64_1]], align 4
278c603cefbSNikita Popov; CHECK-NEXT:    store i64 2, ptr [[P]], align 4
279176bbcaeSNikita Popov; CHECK-NEXT:    ret void
280176bbcaeSNikita Popov;
281176bbcaeSNikita Popoventry:
282176bbcaeSNikita Popov
283c603cefbSNikita Popov  tail call void @llvm.memset.p0.i64(ptr align 8 %P, i8 0, i64 32, i1 false)
284176bbcaeSNikita Popov
285c603cefbSNikita Popov  %base64_1 = getelementptr inbounds i64, ptr %P, i64 1
286176bbcaeSNikita Popov
287c603cefbSNikita Popov  store i64 1, ptr %base64_1
288c603cefbSNikita Popov  store i64 2, ptr %P
289176bbcaeSNikita Popov  ret void
290176bbcaeSNikita Popov}
291176bbcaeSNikita Popov
292c603cefbSNikita Popovdefine void @write8To15AndThen0To7_atomic(ptr nocapture %P) {
293176bbcaeSNikita Popov; CHECK-LABEL: @write8To15AndThen0To7_atomic(
294176bbcaeSNikita Popov; CHECK-NEXT:  entry:
295c603cefbSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 16
296c603cefbSNikita Popov; CHECK-NEXT:    tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 [[TMP0]], i8 0, i64 16, i32 8)
297c603cefbSNikita Popov; CHECK-NEXT:    [[BASE64_1:%.*]] = getelementptr inbounds i64, ptr [[P]], i64 1
298c603cefbSNikita Popov; CHECK-NEXT:    store atomic i64 1, ptr [[BASE64_1]] unordered, align 8
299c603cefbSNikita Popov; CHECK-NEXT:    store atomic i64 2, ptr [[P]] unordered, align 8
300176bbcaeSNikita Popov; CHECK-NEXT:    ret void
301176bbcaeSNikita Popov;
302176bbcaeSNikita Popoventry:
303176bbcaeSNikita Popov
304c603cefbSNikita Popov  tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 %P, i8 0, i64 32, i32 8)
305176bbcaeSNikita Popov
306c603cefbSNikita Popov  %base64_1 = getelementptr inbounds i64, ptr %P, i64 1
307176bbcaeSNikita Popov
308c603cefbSNikita Popov  store atomic i64 1, ptr %base64_1 unordered, align 8
309c603cefbSNikita Popov  store atomic i64 2, ptr %P unordered, align 8
310176bbcaeSNikita Popov  ret void
311176bbcaeSNikita Popov}
312176bbcaeSNikita Popov
313c603cefbSNikita Popovdefine void @write8To15AndThen0To7_atomic_weaker(ptr nocapture %P) {
314176bbcaeSNikita Popov; CHECK-LABEL: @write8To15AndThen0To7_atomic_weaker(
315176bbcaeSNikita Popov; CHECK-NEXT:  entry:
316c603cefbSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 16
317c603cefbSNikita Popov; CHECK-NEXT:    tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 [[TMP0]], i8 0, i64 16, i32 8)
318c603cefbSNikita Popov; CHECK-NEXT:    [[BASE64_1:%.*]] = getelementptr inbounds i64, ptr [[P]], i64 1
319c603cefbSNikita Popov; CHECK-NEXT:    store atomic i64 1, ptr [[BASE64_1]] unordered, align 8
320c603cefbSNikita Popov; CHECK-NEXT:    store i64 2, ptr [[P]], align 8
321176bbcaeSNikita Popov; CHECK-NEXT:    ret void
322176bbcaeSNikita Popov;
323176bbcaeSNikita Popoventry:
324176bbcaeSNikita Popov
325c603cefbSNikita Popov  tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 %P, i8 0, i64 32, i32 8)
326176bbcaeSNikita Popov
327c603cefbSNikita Popov  %base64_1 = getelementptr inbounds i64, ptr %P, i64 1
328176bbcaeSNikita Popov
329c603cefbSNikita Popov  store atomic i64 1, ptr %base64_1 unordered, align 8
330c603cefbSNikita Popov  store i64 2, ptr %P, align 8
331176bbcaeSNikita Popov  ret void
332176bbcaeSNikita Popov}
333176bbcaeSNikita Popov
334c603cefbSNikita Popovdefine void @write8To15AndThen0To7_atomic_weaker_2(ptr nocapture %P) {
335176bbcaeSNikita Popov; CHECK-LABEL: @write8To15AndThen0To7_atomic_weaker_2(
336176bbcaeSNikita Popov; CHECK-NEXT:  entry:
337c603cefbSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 16
338c603cefbSNikita Popov; CHECK-NEXT:    tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 [[TMP0]], i8 0, i64 16, i32 8)
339c603cefbSNikita Popov; CHECK-NEXT:    [[BASE64_1:%.*]] = getelementptr inbounds i64, ptr [[P]], i64 1
340c603cefbSNikita Popov; CHECK-NEXT:    store i64 1, ptr [[BASE64_1]], align 8
341c603cefbSNikita Popov; CHECK-NEXT:    store atomic i64 2, ptr [[P]] unordered, align 8
342176bbcaeSNikita Popov; CHECK-NEXT:    ret void
343176bbcaeSNikita Popov;
344176bbcaeSNikita Popoventry:
345176bbcaeSNikita Popov
346c603cefbSNikita Popov  tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 %P, i8 0, i64 32, i32 8)
347176bbcaeSNikita Popov
348c603cefbSNikita Popov  %base64_1 = getelementptr inbounds i64, ptr %P, i64 1
349176bbcaeSNikita Popov
350c603cefbSNikita Popov  store i64 1, ptr %base64_1, align 8
351c603cefbSNikita Popov  store atomic i64 2, ptr %P unordered, align 8
352176bbcaeSNikita Popov  ret void
353176bbcaeSNikita Popov}
354176bbcaeSNikita Popov
355c603cefbSNikita Popovdeclare void @llvm.memset.p0.i64(ptr nocapture, i8, i64, i1) nounwind
356c603cefbSNikita Popovdeclare void @llvm.memset.p1.i64(ptr addrspace(1) nocapture, i8, i64, i1) nounwind
357c603cefbSNikita Popovdeclare void @llvm.memset.element.unordered.atomic.p0.i64(ptr nocapture, i8, i64, i32) nounwind
358176bbcaeSNikita Popov
359c603cefbSNikita Popovdefine void @ow_begin_align1(ptr nocapture %p) {
360176bbcaeSNikita Popov; CHECK-LABEL: @ow_begin_align1(
361176bbcaeSNikita Popov; CHECK-NEXT:  entry:
362c603cefbSNikita Popov; CHECK-NEXT:    [[P1:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 1
363c603cefbSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 7
364c603cefbSNikita Popov; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[TMP0]], i8 0, i64 25, i1 false)
365c603cefbSNikita Popov; CHECK-NEXT:    store i64 1, ptr [[P]], align 1
366176bbcaeSNikita Popov; CHECK-NEXT:    ret void
367176bbcaeSNikita Popov;
368176bbcaeSNikita Popoventry:
369c603cefbSNikita Popov  %p1 = getelementptr inbounds i8, ptr %p, i64 1
370c603cefbSNikita Popov  call void @llvm.memset.p0.i64(ptr align 1 %p1, i8 0, i64 32, i1 false)
371c603cefbSNikita Popov  store i64 1, ptr %p, align 1
372176bbcaeSNikita Popov  ret void
373176bbcaeSNikita Popov}
374176bbcaeSNikita Popov
375c603cefbSNikita Popovdefine void @ow_end_align4(ptr nocapture %p) {
376176bbcaeSNikita Popov; CHECK-LABEL: @ow_end_align4(
377176bbcaeSNikita Popov; CHECK-NEXT:  entry:
378c603cefbSNikita Popov; CHECK-NEXT:    [[P1:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 1
379c603cefbSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 4
380c603cefbSNikita Popov; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 28, i1 false)
381c603cefbSNikita Popov; CHECK-NEXT:    store i64 1, ptr [[P]], align 1
382176bbcaeSNikita Popov; CHECK-NEXT:    ret void
383176bbcaeSNikita Popov;
384176bbcaeSNikita Popoventry:
385c603cefbSNikita Popov  %p1 = getelementptr inbounds i8, ptr %p, i64 1
386c603cefbSNikita Popov  call void @llvm.memset.p0.i64(ptr align 4 %p1, i8 0, i64 32, i1 false)
387c603cefbSNikita Popov  store i64 1, ptr %p, align 1
388176bbcaeSNikita Popov  ret void
389176bbcaeSNikita Popov}
390176bbcaeSNikita Popov
391c603cefbSNikita Popovdefine void @ow_end_align8(ptr nocapture %p) {
392176bbcaeSNikita Popov; CHECK-LABEL: @ow_end_align8(
393176bbcaeSNikita Popov; CHECK-NEXT:  entry:
394c603cefbSNikita Popov; CHECK-NEXT:    [[P1:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 1
395c603cefbSNikita Popov; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 8 [[P1]], i8 0, i64 32, i1 false)
396c603cefbSNikita Popov; CHECK-NEXT:    store i64 1, ptr [[P]], align 1
397176bbcaeSNikita Popov; CHECK-NEXT:    ret void
398176bbcaeSNikita Popov;
399176bbcaeSNikita Popoventry:
400c603cefbSNikita Popov  %p1 = getelementptr inbounds i8, ptr %p, i64 1
401c603cefbSNikita Popov  call void @llvm.memset.p0.i64(ptr align 8 %p1, i8 0, i64 32, i1 false)
402c603cefbSNikita Popov  store i64 1, ptr %p, align 1
403176bbcaeSNikita Popov  ret void
404176bbcaeSNikita Popov}
405