xref: /aosp_15_r20/external/llvm/test/CodeGen/SystemZ/int-cmp-48.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; Test the use of TM and TMY.
2*9880d681SAndroid Build Coastguard Worker;
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 | FileCheck %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker@g = global i32 0
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker; Check a simple branching use of TM.
8*9880d681SAndroid Build Coastguard Workerdefine void @f1(i8 *%src) {
9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1:
10*9880d681SAndroid Build Coastguard Worker; CHECK: tm 0(%r2), 1
11*9880d681SAndroid Build Coastguard Worker; CHECK: ber %r14
12*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
13*9880d681SAndroid Build Coastguard Workerentry:
14*9880d681SAndroid Build Coastguard Worker  %byte = load i8 , i8 *%src
15*9880d681SAndroid Build Coastguard Worker  %and = and i8 %byte, 1
16*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 %and, 0
17*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerstore:
20*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
21*9880d681SAndroid Build Coastguard Worker  br label %exit
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerexit:
24*9880d681SAndroid Build Coastguard Worker  ret void
25*9880d681SAndroid Build Coastguard Worker}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker; Check that we do not fold across an aliasing store.
29*9880d681SAndroid Build Coastguard Workerdefine void @f2(i8 *%src) {
30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2:
31*9880d681SAndroid Build Coastguard Worker; CHECK: llc [[REG:%r[0-5]]], 0(%r2)
32*9880d681SAndroid Build Coastguard Worker; CHECK: mvi 0(%r2), 0
33*9880d681SAndroid Build Coastguard Worker; CHECK: tmll [[REG]], 1
34*9880d681SAndroid Build Coastguard Worker; CHECK: ber %r14
35*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
36*9880d681SAndroid Build Coastguard Workerentry:
37*9880d681SAndroid Build Coastguard Worker  %byte = load i8 , i8 *%src
38*9880d681SAndroid Build Coastguard Worker  store i8 0, i8 *%src
39*9880d681SAndroid Build Coastguard Worker  %and = and i8 %byte, 1
40*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 %and, 0
41*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Workerstore:
44*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
45*9880d681SAndroid Build Coastguard Worker  br label %exit
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerexit:
48*9880d681SAndroid Build Coastguard Worker  ret void
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker; Check a simple select-based use of TM.
52*9880d681SAndroid Build Coastguard Workerdefine double @f3(i8 *%src, double %a, double %b) {
53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3:
54*9880d681SAndroid Build Coastguard Worker; CHECK: tm 0(%r2), 1
55*9880d681SAndroid Build Coastguard Worker; CHECK: je {{\.L.*}}
56*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
57*9880d681SAndroid Build Coastguard Worker  %byte = load i8 , i8 *%src
58*9880d681SAndroid Build Coastguard Worker  %and = and i8 %byte, 1
59*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 %and, 0
60*9880d681SAndroid Build Coastguard Worker  %res = select i1 %cmp, double %b, double %a
61*9880d681SAndroid Build Coastguard Worker  ret double %res
62*9880d681SAndroid Build Coastguard Worker}
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker; Check that we do not fold across an aliasing store.
65*9880d681SAndroid Build Coastguard Workerdefine double @f4(i8 *%src, double %a, double %b) {
66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4:
67*9880d681SAndroid Build Coastguard Worker; CHECK: tm 0(%r2), 1
68*9880d681SAndroid Build Coastguard Worker; CHECK: je {{\.L.*}}
69*9880d681SAndroid Build Coastguard Worker; CHECK: mvi 0(%r2), 0
70*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
71*9880d681SAndroid Build Coastguard Worker  %byte = load i8 , i8 *%src
72*9880d681SAndroid Build Coastguard Worker  %and = and i8 %byte, 1
73*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 %and, 0
74*9880d681SAndroid Build Coastguard Worker  %res = select i1 %cmp, double %b, double %a
75*9880d681SAndroid Build Coastguard Worker  store i8 0, i8 *%src
76*9880d681SAndroid Build Coastguard Worker  ret double %res
77*9880d681SAndroid Build Coastguard Worker}
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker; Check an inequality check.
80*9880d681SAndroid Build Coastguard Workerdefine double @f5(i8 *%src, double %a, double %b) {
81*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5:
82*9880d681SAndroid Build Coastguard Worker; CHECK: tm 0(%r2), 1
83*9880d681SAndroid Build Coastguard Worker; CHECK: jne {{\.L.*}}
84*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
85*9880d681SAndroid Build Coastguard Worker  %byte = load i8 , i8 *%src
86*9880d681SAndroid Build Coastguard Worker  %and = and i8 %byte, 1
87*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i8 %and, 0
88*9880d681SAndroid Build Coastguard Worker  %res = select i1 %cmp, double %b, double %a
89*9880d681SAndroid Build Coastguard Worker  ret double %res
90*9880d681SAndroid Build Coastguard Worker}
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker; Check that we can also use TM for equality comparisons with the mask.
93*9880d681SAndroid Build Coastguard Workerdefine double @f6(i8 *%src, double %a, double %b) {
94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6:
95*9880d681SAndroid Build Coastguard Worker; CHECK: tm 0(%r2), 254
96*9880d681SAndroid Build Coastguard Worker; CHECK: jo {{\.L.*}}
97*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
98*9880d681SAndroid Build Coastguard Worker  %byte = load i8 , i8 *%src
99*9880d681SAndroid Build Coastguard Worker  %and = and i8 %byte, 254
100*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 %and, 254
101*9880d681SAndroid Build Coastguard Worker  %res = select i1 %cmp, double %b, double %a
102*9880d681SAndroid Build Coastguard Worker  ret double %res
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker; Check inequality comparisons with the mask.
106*9880d681SAndroid Build Coastguard Workerdefine double @f7(i8 *%src, double %a, double %b) {
107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7:
108*9880d681SAndroid Build Coastguard Worker; CHECK: tm 0(%r2), 254
109*9880d681SAndroid Build Coastguard Worker; CHECK: jno {{\.L.*}}
110*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
111*9880d681SAndroid Build Coastguard Worker  %byte = load i8 , i8 *%src
112*9880d681SAndroid Build Coastguard Worker  %and = and i8 %byte, 254
113*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i8 %and, 254
114*9880d681SAndroid Build Coastguard Worker  %res = select i1 %cmp, double %b, double %a
115*9880d681SAndroid Build Coastguard Worker  ret double %res
116*9880d681SAndroid Build Coastguard Worker}
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker; Check that we do not use the memory TM instruction when CC is being tested
119*9880d681SAndroid Build Coastguard Worker; for 2.
120*9880d681SAndroid Build Coastguard Workerdefine double @f8(i8 *%src, double %a, double %b) {
121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8:
122*9880d681SAndroid Build Coastguard Worker; CHECK: llc [[REG:%r[0-5]]], 0(%r2)
123*9880d681SAndroid Build Coastguard Worker; CHECK: tmll [[REG]], 3
124*9880d681SAndroid Build Coastguard Worker; CHECK: jh {{\.L.*}}
125*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
126*9880d681SAndroid Build Coastguard Worker  %byte = load i8 , i8 *%src
127*9880d681SAndroid Build Coastguard Worker  %and = and i8 %byte, 3
128*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 %and, 2
129*9880d681SAndroid Build Coastguard Worker  %res = select i1 %cmp, double %b, double %a
130*9880d681SAndroid Build Coastguard Worker  ret double %res
131*9880d681SAndroid Build Coastguard Worker}
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Worker; ...likewise 1.
134*9880d681SAndroid Build Coastguard Workerdefine double @f9(i8 *%src, double %a, double %b) {
135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9:
136*9880d681SAndroid Build Coastguard Worker; CHECK: llc [[REG:%r[0-5]]], 0(%r2)
137*9880d681SAndroid Build Coastguard Worker; CHECK: tmll [[REG]], 3
138*9880d681SAndroid Build Coastguard Worker; CHECK: jl {{\.L.*}}
139*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
140*9880d681SAndroid Build Coastguard Worker  %byte = load i8 , i8 *%src
141*9880d681SAndroid Build Coastguard Worker  %and = and i8 %byte, 3
142*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 %and, 1
143*9880d681SAndroid Build Coastguard Worker  %res = select i1 %cmp, double %b, double %a
144*9880d681SAndroid Build Coastguard Worker  ret double %res
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker; Check the high end of the TM range.
148*9880d681SAndroid Build Coastguard Workerdefine double @f10(i8 *%src, double %a, double %b) {
149*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10:
150*9880d681SAndroid Build Coastguard Worker; CHECK: tm 4095(%r2), 1
151*9880d681SAndroid Build Coastguard Worker; CHECK: je {{\.L.*}}
152*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
153*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i8, i8 *%src, i64 4095
154*9880d681SAndroid Build Coastguard Worker  %byte = load i8 , i8 *%ptr
155*9880d681SAndroid Build Coastguard Worker  %and = and i8 %byte, 1
156*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 %and, 0
157*9880d681SAndroid Build Coastguard Worker  %res = select i1 %cmp, double %b, double %a
158*9880d681SAndroid Build Coastguard Worker  ret double %res
159*9880d681SAndroid Build Coastguard Worker}
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Worker; Check the low end of the positive TMY range.
162*9880d681SAndroid Build Coastguard Workerdefine double @f11(i8 *%src, double %a, double %b) {
163*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11:
164*9880d681SAndroid Build Coastguard Worker; CHECK: tmy 4096(%r2), 1
165*9880d681SAndroid Build Coastguard Worker; CHECK: je {{\.L.*}}
166*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
167*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i8, i8 *%src, i64 4096
168*9880d681SAndroid Build Coastguard Worker  %byte = load i8 , i8 *%ptr
169*9880d681SAndroid Build Coastguard Worker  %and = and i8 %byte, 1
170*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 %and, 0
171*9880d681SAndroid Build Coastguard Worker  %res = select i1 %cmp, double %b, double %a
172*9880d681SAndroid Build Coastguard Worker  ret double %res
173*9880d681SAndroid Build Coastguard Worker}
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Worker; Check the high end of the TMY range.
176*9880d681SAndroid Build Coastguard Workerdefine double @f12(i8 *%src, double %a, double %b) {
177*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12:
178*9880d681SAndroid Build Coastguard Worker; CHECK: tmy 524287(%r2), 1
179*9880d681SAndroid Build Coastguard Worker; CHECK: je {{\.L.*}}
180*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
181*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i8, i8 *%src, i64 524287
182*9880d681SAndroid Build Coastguard Worker  %byte = load i8 , i8 *%ptr
183*9880d681SAndroid Build Coastguard Worker  %and = and i8 %byte, 1
184*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 %and, 0
185*9880d681SAndroid Build Coastguard Worker  %res = select i1 %cmp, double %b, double %a
186*9880d681SAndroid Build Coastguard Worker  ret double %res
187*9880d681SAndroid Build Coastguard Worker}
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Worker; Check the next byte up, which needs separate address logic.
190*9880d681SAndroid Build Coastguard Workerdefine double @f13(i8 *%src, double %a, double %b) {
191*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13:
192*9880d681SAndroid Build Coastguard Worker; CHECK: agfi %r2, 524288
193*9880d681SAndroid Build Coastguard Worker; CHECK: tm 0(%r2), 1
194*9880d681SAndroid Build Coastguard Worker; CHECK: je {{\.L.*}}
195*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
196*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i8, i8 *%src, i64 524288
197*9880d681SAndroid Build Coastguard Worker  %byte = load i8 , i8 *%ptr
198*9880d681SAndroid Build Coastguard Worker  %and = and i8 %byte, 1
199*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 %and, 0
200*9880d681SAndroid Build Coastguard Worker  %res = select i1 %cmp, double %b, double %a
201*9880d681SAndroid Build Coastguard Worker  ret double %res
202*9880d681SAndroid Build Coastguard Worker}
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Worker; Check the low end of the TMY range.
205*9880d681SAndroid Build Coastguard Workerdefine double @f14(i8 *%src, double %a, double %b) {
206*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14:
207*9880d681SAndroid Build Coastguard Worker; CHECK: tmy -524288(%r2), 1
208*9880d681SAndroid Build Coastguard Worker; CHECK: je {{\.L.*}}
209*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
210*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i8, i8 *%src, i64 -524288
211*9880d681SAndroid Build Coastguard Worker  %byte = load i8 , i8 *%ptr
212*9880d681SAndroid Build Coastguard Worker  %and = and i8 %byte, 1
213*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 %and, 0
214*9880d681SAndroid Build Coastguard Worker  %res = select i1 %cmp, double %b, double %a
215*9880d681SAndroid Build Coastguard Worker  ret double %res
216*9880d681SAndroid Build Coastguard Worker}
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Worker; Check the next byte down, which needs separate address logic.
219*9880d681SAndroid Build Coastguard Workerdefine double @f15(i8 *%src, double %a, double %b) {
220*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f15:
221*9880d681SAndroid Build Coastguard Worker; CHECK: agfi %r2, -524289
222*9880d681SAndroid Build Coastguard Worker; CHECK: tm 0(%r2), 1
223*9880d681SAndroid Build Coastguard Worker; CHECK: je {{\.L.*}}
224*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
225*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i8, i8 *%src, i64 -524289
226*9880d681SAndroid Build Coastguard Worker  %byte = load i8 , i8 *%ptr
227*9880d681SAndroid Build Coastguard Worker  %and = and i8 %byte, 1
228*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 %and, 0
229*9880d681SAndroid Build Coastguard Worker  %res = select i1 %cmp, double %b, double %a
230*9880d681SAndroid Build Coastguard Worker  ret double %res
231*9880d681SAndroid Build Coastguard Worker}
232*9880d681SAndroid Build Coastguard Worker
233*9880d681SAndroid Build Coastguard Worker; Check that TM(Y) does not allow an index
234*9880d681SAndroid Build Coastguard Workerdefine double @f16(i8 *%src, i64 %index, double %a, double %b) {
235*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f16:
236*9880d681SAndroid Build Coastguard Worker; CHECK: tm 0({{%r[1-5]}}), 1
237*9880d681SAndroid Build Coastguard Worker; CHECK: je {{\.L.*}}
238*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
239*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i8, i8 *%src, i64 %index
240*9880d681SAndroid Build Coastguard Worker  %byte = load i8 , i8 *%ptr
241*9880d681SAndroid Build Coastguard Worker  %and = and i8 %byte, 1
242*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 %and, 0
243*9880d681SAndroid Build Coastguard Worker  %res = select i1 %cmp, double %b, double %a
244*9880d681SAndroid Build Coastguard Worker  ret double %res
245*9880d681SAndroid Build Coastguard Worker}
246