xref: /aosp_15_r20/external/llvm/test/CodeGen/SystemZ/and-08.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; Test memory-to-memory ANDs.
2*9880d681SAndroid Build Coastguard Worker;
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker@g1src = global i8 1
6*9880d681SAndroid Build Coastguard Worker@g1dst = global i8 1
7*9880d681SAndroid Build Coastguard Worker@g2src = global i16 2
8*9880d681SAndroid Build Coastguard Worker@g2dst = global i16 2
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker; Test the simple i8 case.
11*9880d681SAndroid Build Coastguard Workerdefine void @f1(i8 *%ptr1) {
12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1:
13*9880d681SAndroid Build Coastguard Worker; CHECK: nc 1(1,%r2), 0(%r2)
14*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
15*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i8, i8 *%ptr1, i64 1
16*9880d681SAndroid Build Coastguard Worker  %val = load i8 , i8 *%ptr1
17*9880d681SAndroid Build Coastguard Worker  %old = load i8 , i8 *%ptr2
18*9880d681SAndroid Build Coastguard Worker  %and = and i8 %val, %old
19*9880d681SAndroid Build Coastguard Worker  store i8 %and, i8 *%ptr2
20*9880d681SAndroid Build Coastguard Worker  ret void
21*9880d681SAndroid Build Coastguard Worker}
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker; ...and again in reverse.
24*9880d681SAndroid Build Coastguard Workerdefine void @f2(i8 *%ptr1) {
25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2:
26*9880d681SAndroid Build Coastguard Worker; CHECK: nc 1(1,%r2), 0(%r2)
27*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
28*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i8, i8 *%ptr1, i64 1
29*9880d681SAndroid Build Coastguard Worker  %val = load i8 , i8 *%ptr1
30*9880d681SAndroid Build Coastguard Worker  %old = load i8 , i8 *%ptr2
31*9880d681SAndroid Build Coastguard Worker  %and = and i8 %old, %val
32*9880d681SAndroid Build Coastguard Worker  store i8 %and, i8 *%ptr2
33*9880d681SAndroid Build Coastguard Worker  ret void
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker; Test i8 cases where one value is zero-extended to 32 bits and the other
37*9880d681SAndroid Build Coastguard Worker; sign-extended.
38*9880d681SAndroid Build Coastguard Workerdefine void @f3(i8 *%ptr1) {
39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3:
40*9880d681SAndroid Build Coastguard Worker; CHECK: nc 1(1,%r2), 0(%r2)
41*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
42*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i8, i8 *%ptr1, i64 1
43*9880d681SAndroid Build Coastguard Worker  %val = load i8 , i8 *%ptr1
44*9880d681SAndroid Build Coastguard Worker  %extval = zext i8 %val to i32
45*9880d681SAndroid Build Coastguard Worker  %old = load i8 , i8 *%ptr2
46*9880d681SAndroid Build Coastguard Worker  %extold = sext i8 %old to i32
47*9880d681SAndroid Build Coastguard Worker  %and = and i32 %extval, %extold
48*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i32 %and to i8
49*9880d681SAndroid Build Coastguard Worker  store i8 %trunc, i8 *%ptr2
50*9880d681SAndroid Build Coastguard Worker  ret void
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker; ...and again with the extension types reversed.
54*9880d681SAndroid Build Coastguard Workerdefine void @f4(i8 *%ptr1) {
55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4:
56*9880d681SAndroid Build Coastguard Worker; CHECK: nc 1(1,%r2), 0(%r2)
57*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
58*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i8, i8 *%ptr1, i64 1
59*9880d681SAndroid Build Coastguard Worker  %val = load i8 , i8 *%ptr1
60*9880d681SAndroid Build Coastguard Worker  %extval = sext i8 %val to i32
61*9880d681SAndroid Build Coastguard Worker  %old = load i8 , i8 *%ptr2
62*9880d681SAndroid Build Coastguard Worker  %extold = zext i8 %old to i32
63*9880d681SAndroid Build Coastguard Worker  %and = and i32 %extval, %extold
64*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i32 %and to i8
65*9880d681SAndroid Build Coastguard Worker  store i8 %trunc, i8 *%ptr2
66*9880d681SAndroid Build Coastguard Worker  ret void
67*9880d681SAndroid Build Coastguard Worker}
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker; ...and again with two sign extensions.
70*9880d681SAndroid Build Coastguard Workerdefine void @f5(i8 *%ptr1) {
71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5:
72*9880d681SAndroid Build Coastguard Worker; CHECK: nc 1(1,%r2), 0(%r2)
73*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
74*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i8, i8 *%ptr1, i64 1
75*9880d681SAndroid Build Coastguard Worker  %val = load i8 , i8 *%ptr1
76*9880d681SAndroid Build Coastguard Worker  %extval = sext i8 %val to i32
77*9880d681SAndroid Build Coastguard Worker  %old = load i8 , i8 *%ptr2
78*9880d681SAndroid Build Coastguard Worker  %extold = sext i8 %old to i32
79*9880d681SAndroid Build Coastguard Worker  %and = and i32 %extval, %extold
80*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i32 %and to i8
81*9880d681SAndroid Build Coastguard Worker  store i8 %trunc, i8 *%ptr2
82*9880d681SAndroid Build Coastguard Worker  ret void
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker; ...and again with two zero extensions.
86*9880d681SAndroid Build Coastguard Workerdefine void @f6(i8 *%ptr1) {
87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6:
88*9880d681SAndroid Build Coastguard Worker; CHECK: nc 1(1,%r2), 0(%r2)
89*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
90*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i8, i8 *%ptr1, i64 1
91*9880d681SAndroid Build Coastguard Worker  %val = load i8 , i8 *%ptr1
92*9880d681SAndroid Build Coastguard Worker  %extval = zext i8 %val to i32
93*9880d681SAndroid Build Coastguard Worker  %old = load i8 , i8 *%ptr2
94*9880d681SAndroid Build Coastguard Worker  %extold = zext i8 %old to i32
95*9880d681SAndroid Build Coastguard Worker  %and = and i32 %extval, %extold
96*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i32 %and to i8
97*9880d681SAndroid Build Coastguard Worker  store i8 %trunc, i8 *%ptr2
98*9880d681SAndroid Build Coastguard Worker  ret void
99*9880d681SAndroid Build Coastguard Worker}
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Worker; Test i8 cases where the value is extended to 64 bits (just one case
102*9880d681SAndroid Build Coastguard Worker; this time).
103*9880d681SAndroid Build Coastguard Workerdefine void @f7(i8 *%ptr1) {
104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7:
105*9880d681SAndroid Build Coastguard Worker; CHECK: nc 1(1,%r2), 0(%r2)
106*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
107*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i8, i8 *%ptr1, i64 1
108*9880d681SAndroid Build Coastguard Worker  %val = load i8 , i8 *%ptr1
109*9880d681SAndroid Build Coastguard Worker  %extval = sext i8 %val to i64
110*9880d681SAndroid Build Coastguard Worker  %old = load i8 , i8 *%ptr2
111*9880d681SAndroid Build Coastguard Worker  %extold = zext i8 %old to i64
112*9880d681SAndroid Build Coastguard Worker  %and = and i64 %extval, %extold
113*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i64 %and to i8
114*9880d681SAndroid Build Coastguard Worker  store i8 %trunc, i8 *%ptr2
115*9880d681SAndroid Build Coastguard Worker  ret void
116*9880d681SAndroid Build Coastguard Worker}
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker; Test the simple i16 case.
119*9880d681SAndroid Build Coastguard Workerdefine void @f8(i16 *%ptr1) {
120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8:
121*9880d681SAndroid Build Coastguard Worker; CHECK: nc 2(2,%r2), 0(%r2)
122*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
123*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i16, i16 *%ptr1, i64 1
124*9880d681SAndroid Build Coastguard Worker  %val = load i16 , i16 *%ptr1
125*9880d681SAndroid Build Coastguard Worker  %old = load i16 , i16 *%ptr2
126*9880d681SAndroid Build Coastguard Worker  %and = and i16 %val, %old
127*9880d681SAndroid Build Coastguard Worker  store i16 %and, i16 *%ptr2
128*9880d681SAndroid Build Coastguard Worker  ret void
129*9880d681SAndroid Build Coastguard Worker}
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker; Test i16 cases where the value is extended to 32 bits.
132*9880d681SAndroid Build Coastguard Workerdefine void @f9(i16 *%ptr1) {
133*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9:
134*9880d681SAndroid Build Coastguard Worker; CHECK: nc 2(2,%r2), 0(%r2)
135*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
136*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i16, i16 *%ptr1, i64 1
137*9880d681SAndroid Build Coastguard Worker  %val = load i16 , i16 *%ptr1
138*9880d681SAndroid Build Coastguard Worker  %extval = zext i16 %val to i32
139*9880d681SAndroid Build Coastguard Worker  %old = load i16 , i16 *%ptr2
140*9880d681SAndroid Build Coastguard Worker  %extold = sext i16 %old to i32
141*9880d681SAndroid Build Coastguard Worker  %and = and i32 %extval, %extold
142*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i32 %and to i16
143*9880d681SAndroid Build Coastguard Worker  store i16 %trunc, i16 *%ptr2
144*9880d681SAndroid Build Coastguard Worker  ret void
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker; Test i16 cases where the value is extended to 64 bits.
148*9880d681SAndroid Build Coastguard Workerdefine void @f10(i16 *%ptr1) {
149*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10:
150*9880d681SAndroid Build Coastguard Worker; CHECK: nc 2(2,%r2), 0(%r2)
151*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
152*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i16, i16 *%ptr1, i64 1
153*9880d681SAndroid Build Coastguard Worker  %val = load i16 , i16 *%ptr1
154*9880d681SAndroid Build Coastguard Worker  %extval = sext i16 %val to i64
155*9880d681SAndroid Build Coastguard Worker  %old = load i16 , i16 *%ptr2
156*9880d681SAndroid Build Coastguard Worker  %extold = zext i16 %old to i64
157*9880d681SAndroid Build Coastguard Worker  %and = and i64 %extval, %extold
158*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i64 %and to i16
159*9880d681SAndroid Build Coastguard Worker  store i16 %trunc, i16 *%ptr2
160*9880d681SAndroid Build Coastguard Worker  ret void
161*9880d681SAndroid Build Coastguard Worker}
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Worker; Test the simple i32 case.
164*9880d681SAndroid Build Coastguard Workerdefine void @f11(i32 *%ptr1) {
165*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11:
166*9880d681SAndroid Build Coastguard Worker; CHECK: nc 4(4,%r2), 0(%r2)
167*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
168*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i32, i32 *%ptr1, i64 1
169*9880d681SAndroid Build Coastguard Worker  %val = load i32 , i32 *%ptr1
170*9880d681SAndroid Build Coastguard Worker  %old = load i32 , i32 *%ptr2
171*9880d681SAndroid Build Coastguard Worker  %and = and i32 %old, %val
172*9880d681SAndroid Build Coastguard Worker  store i32 %and, i32 *%ptr2
173*9880d681SAndroid Build Coastguard Worker  ret void
174*9880d681SAndroid Build Coastguard Worker}
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Worker; Test i32 cases where the value is extended to 64 bits.
177*9880d681SAndroid Build Coastguard Workerdefine void @f12(i32 *%ptr1) {
178*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12:
179*9880d681SAndroid Build Coastguard Worker; CHECK: nc 4(4,%r2), 0(%r2)
180*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
181*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i32, i32 *%ptr1, i64 1
182*9880d681SAndroid Build Coastguard Worker  %val = load i32 , i32 *%ptr1
183*9880d681SAndroid Build Coastguard Worker  %extval = sext i32 %val to i64
184*9880d681SAndroid Build Coastguard Worker  %old = load i32 , i32 *%ptr2
185*9880d681SAndroid Build Coastguard Worker  %extold = zext i32 %old to i64
186*9880d681SAndroid Build Coastguard Worker  %and = and i64 %extval, %extold
187*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i64 %and to i32
188*9880d681SAndroid Build Coastguard Worker  store i32 %trunc, i32 *%ptr2
189*9880d681SAndroid Build Coastguard Worker  ret void
190*9880d681SAndroid Build Coastguard Worker}
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Worker; Test the i64 case.
193*9880d681SAndroid Build Coastguard Workerdefine void @f13(i64 *%ptr1) {
194*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13:
195*9880d681SAndroid Build Coastguard Worker; CHECK: nc 8(8,%r2), 0(%r2)
196*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
197*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i64, i64 *%ptr1, i64 1
198*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *%ptr1
199*9880d681SAndroid Build Coastguard Worker  %old = load i64 , i64 *%ptr2
200*9880d681SAndroid Build Coastguard Worker  %and = and i64 %old, %val
201*9880d681SAndroid Build Coastguard Worker  store i64 %and, i64 *%ptr2
202*9880d681SAndroid Build Coastguard Worker  ret void
203*9880d681SAndroid Build Coastguard Worker}
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Worker; Make sure that we don't use NC if the first load is volatile.
206*9880d681SAndroid Build Coastguard Workerdefine void @f14(i64 *%ptr1) {
207*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14:
208*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nc
209*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
210*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i64, i64 *%ptr1, i64 1
211*9880d681SAndroid Build Coastguard Worker  %val = load volatile i64 , i64 *%ptr1
212*9880d681SAndroid Build Coastguard Worker  %old = load i64 , i64 *%ptr2
213*9880d681SAndroid Build Coastguard Worker  %and = and i64 %old, %val
214*9880d681SAndroid Build Coastguard Worker  store i64 %and, i64 *%ptr2
215*9880d681SAndroid Build Coastguard Worker  ret void
216*9880d681SAndroid Build Coastguard Worker}
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Worker; ...likewise the second.
219*9880d681SAndroid Build Coastguard Workerdefine void @f15(i64 *%ptr1) {
220*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f15:
221*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nc
222*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
223*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i64, i64 *%ptr1, i64 1
224*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *%ptr1
225*9880d681SAndroid Build Coastguard Worker  %old = load volatile i64 , i64 *%ptr2
226*9880d681SAndroid Build Coastguard Worker  %and = and i64 %old, %val
227*9880d681SAndroid Build Coastguard Worker  store i64 %and, i64 *%ptr2
228*9880d681SAndroid Build Coastguard Worker  ret void
229*9880d681SAndroid Build Coastguard Worker}
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Worker; ...likewise the store.
232*9880d681SAndroid Build Coastguard Workerdefine void @f16(i64 *%ptr1) {
233*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f16:
234*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nc
235*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
236*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i64, i64 *%ptr1, i64 1
237*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *%ptr1
238*9880d681SAndroid Build Coastguard Worker  %old = load i64 , i64 *%ptr2
239*9880d681SAndroid Build Coastguard Worker  %and = and i64 %old, %val
240*9880d681SAndroid Build Coastguard Worker  store volatile i64 %and, i64 *%ptr2
241*9880d681SAndroid Build Coastguard Worker  ret void
242*9880d681SAndroid Build Coastguard Worker}
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Worker; Test that NC is not used for aligned loads and stores if there is
245*9880d681SAndroid Build Coastguard Worker; no way of telling whether they alias.  We don't want to use NC in
246*9880d681SAndroid Build Coastguard Worker; cases where the addresses could be equal.
247*9880d681SAndroid Build Coastguard Workerdefine void @f17(i64 *%ptr1, i64 *%ptr2) {
248*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f17:
249*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nc
250*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
251*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *%ptr1
252*9880d681SAndroid Build Coastguard Worker  %old = load i64 , i64 *%ptr2
253*9880d681SAndroid Build Coastguard Worker  %and = and i64 %old, %val
254*9880d681SAndroid Build Coastguard Worker  store i64 %and, i64 *%ptr2
255*9880d681SAndroid Build Coastguard Worker  ret void
256*9880d681SAndroid Build Coastguard Worker}
257*9880d681SAndroid Build Coastguard Worker
258*9880d681SAndroid Build Coastguard Worker; ...but if one of the loads isn't aligned, we can't be sure.
259*9880d681SAndroid Build Coastguard Workerdefine void @f18(i64 *%ptr1, i64 *%ptr2) {
260*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f18:
261*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nc
262*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
263*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *%ptr1, align 2
264*9880d681SAndroid Build Coastguard Worker  %old = load i64 , i64 *%ptr2
265*9880d681SAndroid Build Coastguard Worker  %and = and i64 %old, %val
266*9880d681SAndroid Build Coastguard Worker  store i64 %and, i64 *%ptr2
267*9880d681SAndroid Build Coastguard Worker  ret void
268*9880d681SAndroid Build Coastguard Worker}
269*9880d681SAndroid Build Coastguard Worker
270*9880d681SAndroid Build Coastguard Worker; Repeat the previous test with the operands in the opposite order.
271*9880d681SAndroid Build Coastguard Workerdefine void @f19(i64 *%ptr1, i64 *%ptr2) {
272*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f19:
273*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nc
274*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
275*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *%ptr1, align 2
276*9880d681SAndroid Build Coastguard Worker  %old = load i64 , i64 *%ptr2
277*9880d681SAndroid Build Coastguard Worker  %and = and i64 %val, %old
278*9880d681SAndroid Build Coastguard Worker  store i64 %and, i64 *%ptr2
279*9880d681SAndroid Build Coastguard Worker  ret void
280*9880d681SAndroid Build Coastguard Worker}
281*9880d681SAndroid Build Coastguard Worker
282*9880d681SAndroid Build Coastguard Worker; ...and again with the other operand being unaligned.
283*9880d681SAndroid Build Coastguard Workerdefine void @f20(i64 *%ptr1, i64 *%ptr2) {
284*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f20:
285*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nc
286*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
287*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *%ptr1
288*9880d681SAndroid Build Coastguard Worker  %old = load i64 , i64 *%ptr2, align 2
289*9880d681SAndroid Build Coastguard Worker  %and = and i64 %val, %old
290*9880d681SAndroid Build Coastguard Worker  store i64 %and, i64 *%ptr2, align 2
291*9880d681SAndroid Build Coastguard Worker  ret void
292*9880d681SAndroid Build Coastguard Worker}
293*9880d681SAndroid Build Coastguard Worker
294*9880d681SAndroid Build Coastguard Worker; Test a case where there is definite overlap.
295*9880d681SAndroid Build Coastguard Workerdefine void @f21(i64 %base) {
296*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f21:
297*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nc
298*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
299*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, 1
300*9880d681SAndroid Build Coastguard Worker  %ptr1 = inttoptr i64 %base to i64 *
301*9880d681SAndroid Build Coastguard Worker  %ptr2 = inttoptr i64 %add to i64 *
302*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *%ptr1
303*9880d681SAndroid Build Coastguard Worker  %old = load i64 , i64 *%ptr2, align 1
304*9880d681SAndroid Build Coastguard Worker  %and = and i64 %old, %val
305*9880d681SAndroid Build Coastguard Worker  store i64 %and, i64 *%ptr2, align 1
306*9880d681SAndroid Build Coastguard Worker  ret void
307*9880d681SAndroid Build Coastguard Worker}
308*9880d681SAndroid Build Coastguard Worker
309*9880d681SAndroid Build Coastguard Worker; Test that we can use NC for global addresses for i8.
310*9880d681SAndroid Build Coastguard Workerdefine void @f22(i8 *%ptr) {
311*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f22:
312*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: larl [[SRC:%r[0-5]]], g1src
313*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: larl [[DST:%r[0-5]]], g1dst
314*9880d681SAndroid Build Coastguard Worker; CHECK: nc 0(1,[[DST]]), 0([[SRC]])
315*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
316*9880d681SAndroid Build Coastguard Worker  %val = load i8 , i8 *@g1src
317*9880d681SAndroid Build Coastguard Worker  %old = load i8 , i8 *@g1dst
318*9880d681SAndroid Build Coastguard Worker  %and = and i8 %val, %old
319*9880d681SAndroid Build Coastguard Worker  store i8 %and, i8 *@g1dst
320*9880d681SAndroid Build Coastguard Worker  ret void
321*9880d681SAndroid Build Coastguard Worker}
322*9880d681SAndroid Build Coastguard Worker
323*9880d681SAndroid Build Coastguard Worker; Test that we use NC even where LHRL and STHRL are available.
324*9880d681SAndroid Build Coastguard Workerdefine void @f23(i16 *%ptr) {
325*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f23:
326*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: larl [[SRC:%r[0-5]]], g2src
327*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: larl [[DST:%r[0-5]]], g2dst
328*9880d681SAndroid Build Coastguard Worker; CHECK: nc 0(2,[[DST]]), 0([[SRC]])
329*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
330*9880d681SAndroid Build Coastguard Worker  %val = load i16 , i16 *@g2src
331*9880d681SAndroid Build Coastguard Worker  %old = load i16 , i16 *@g2dst
332*9880d681SAndroid Build Coastguard Worker  %and = and i16 %val, %old
333*9880d681SAndroid Build Coastguard Worker  store i16 %and, i16 *@g2dst
334*9880d681SAndroid Build Coastguard Worker  ret void
335*9880d681SAndroid Build Coastguard Worker}
336*9880d681SAndroid Build Coastguard Worker
337*9880d681SAndroid Build Coastguard Worker; Test a case where offset disambiguation is enough.
338*9880d681SAndroid Build Coastguard Workerdefine void @f24(i64 *%ptr1) {
339*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f24:
340*9880d681SAndroid Build Coastguard Worker; CHECK: nc 8(8,%r2), 0(%r2)
341*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
342*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i64, i64 *%ptr1, i64 1
343*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *%ptr1, align 1
344*9880d681SAndroid Build Coastguard Worker  %old = load i64 , i64 *%ptr2, align 1
345*9880d681SAndroid Build Coastguard Worker  %and = and i64 %old, %val
346*9880d681SAndroid Build Coastguard Worker  store i64 %and, i64 *%ptr2, align 1
347*9880d681SAndroid Build Coastguard Worker  ret void
348*9880d681SAndroid Build Coastguard Worker}
349*9880d681SAndroid Build Coastguard Worker
350*9880d681SAndroid Build Coastguard Worker; Test a case where TBAA tells us there is no alias.
351*9880d681SAndroid Build Coastguard Workerdefine void @f25(i64 *%ptr1, i64 *%ptr2) {
352*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f25:
353*9880d681SAndroid Build Coastguard Worker; CHECK: nc 0(8,%r3), 0(%r2)
354*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
355*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *%ptr1, align 2, !tbaa !3
356*9880d681SAndroid Build Coastguard Worker  %old = load i64 , i64 *%ptr2, align 2, !tbaa !4
357*9880d681SAndroid Build Coastguard Worker  %and = and i64 %old, %val
358*9880d681SAndroid Build Coastguard Worker  store i64 %and, i64 *%ptr2, align 2, !tbaa !4
359*9880d681SAndroid Build Coastguard Worker  ret void
360*9880d681SAndroid Build Coastguard Worker}
361*9880d681SAndroid Build Coastguard Worker
362*9880d681SAndroid Build Coastguard Worker; Test a case where TBAA information is present but doesn't help.
363*9880d681SAndroid Build Coastguard Workerdefine void @f26(i64 *%ptr1, i64 *%ptr2) {
364*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f26:
365*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nc
366*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
367*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *%ptr1, align 2, !tbaa !3
368*9880d681SAndroid Build Coastguard Worker  %old = load i64 , i64 *%ptr2, align 2, !tbaa !3
369*9880d681SAndroid Build Coastguard Worker  %and = and i64 %old, %val
370*9880d681SAndroid Build Coastguard Worker  store i64 %and, i64 *%ptr2, align 2, !tbaa !3
371*9880d681SAndroid Build Coastguard Worker  ret void
372*9880d681SAndroid Build Coastguard Worker}
373*9880d681SAndroid Build Coastguard Worker
374*9880d681SAndroid Build Coastguard Worker!0 = !{ !"root" }
375*9880d681SAndroid Build Coastguard Worker!1 = !{ !"set1", !0 }
376*9880d681SAndroid Build Coastguard Worker!2 = !{ !"set2", !0 }
377*9880d681SAndroid Build Coastguard Worker!3 = !{ !1, !1, i64 0}
378*9880d681SAndroid Build Coastguard Worker!4 = !{ !2, !2, i64 0}
379