[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / SystemZ / int-cmp-09.ll
blobcd0ace2a9a941586b48cc2ce3617b639292b826d
1 ; Test 32-bit signed comparison in which the second operand is constant.
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
5 ; Check comparisons with 0.
6 define double @f1(double %a, double %b, i32 %i1) {
7 ; CHECK-LABEL: f1:
8 ; CHECK: cijl %r2, 0
9 ; CHECK: ldr %f0, %f2
10 ; CHECK: br %r14
11   %cond = icmp slt i32 %i1, 0
12   %tmp = select i1 %cond, double %a, double %b
13   %res = fadd double %tmp, 1.0
14   ret double %res
17 ; Check comparisons with 2.
18 define double @f2(double %a, double %b, i32 %i1) {
19 ; CHECK-LABEL: f2:
20 ; CHECK: cijl %r2, 2
21 ; CHECK: ldr %f0, %f2
22 ; CHECK: br %r14
23   %cond = icmp slt i32 %i1, 2
24   %tmp = select i1 %cond, double %a, double %b
25   %res = fadd double %tmp, 1.0
26   ret double %res
29 ; Check the high end of the CIJ range.
30 define double @f3(double %a, double %b, i32 %i1) {
31 ; CHECK-LABEL: f3:
32 ; CHECK: cijl %r2, 127
33 ; CHECK: ldr %f0, %f2
34 ; CHECK: br %r14
35   %cond = icmp slt i32 %i1, 127
36   %tmp = select i1 %cond, double %a, double %b
37   %res = fadd double %tmp, 1.0
38   ret double %res
41 ; Check the next value up, which must use CHI instead.
42 define double @f4(double %a, double %b, i32 %i1) {
43 ; CHECK-LABEL: f4:
44 ; CHECK: chi %r2, 128
45 ; CHECK-NEXT: jl
46 ; CHECK: ldr %f0, %f2
47 ; CHECK: br %r14
48   %cond = icmp slt i32 %i1, 128
49   %tmp = select i1 %cond, double %a, double %b
50   %res = fadd double %tmp, 1.0
51   ret double %res
54 ; Check the high end of the CHI range.
55 define double @f5(double %a, double %b, i32 %i1) {
56 ; CHECK-LABEL: f5:
57 ; CHECK: chi %r2, 32767
58 ; CHECK-NEXT: jl
59 ; CHECK: ldr %f0, %f2
60 ; CHECK: br %r14
61   %cond = icmp slt i32 %i1, 32767
62   %tmp = select i1 %cond, double %a, double %b
63   %res = fadd double %tmp, 1.0
64   ret double %res
67 ; Check the next value up, which must use CFI.
68 define double @f6(double %a, double %b, i32 %i1) {
69 ; CHECK-LABEL: f6:
70 ; CHECK: cfi %r2, 32768
71 ; CHECK-NEXT: jl
72 ; CHECK: ldr %f0, %f2
73 ; CHECK: br %r14
74   %cond = icmp slt i32 %i1, 32768
75   %tmp = select i1 %cond, double %a, double %b
76   %res = fadd double %tmp, 1.0
77   ret double %res
80 ; Check the high end of the signed 32-bit range.
81 define double @f7(double %a, double %b, i32 %i1) {
82 ; CHECK-LABEL: f7:
83 ; CHECK: cfi %r2, 2147483647
84 ; CHECK-NEXT: je
85 ; CHECK: ldr %f0, %f2
86 ; CHECK: br %r14
87   %cond = icmp eq i32 %i1, 2147483647
88   %tmp = select i1 %cond, double %a, double %b
89   %res = fadd double %tmp, 1.0
90   ret double %res
93 ; Check the next value up, which should be treated as a negative value.
94 define double @f8(double %a, double %b, i32 %i1) {
95 ; CHECK-LABEL: f8:
96 ; CHECK: cfi %r2, -2147483648
97 ; CHECK-NEXT: je
98 ; CHECK: ldr %f0, %f2
99 ; CHECK: br %r14
100   %cond = icmp eq i32 %i1, 2147483648
101   %tmp = select i1 %cond, double %a, double %b
102   %res = fadd double %tmp, 1.0
103   ret double %res
106 ; Check the high end of the negative CIJ range.
107 define double @f9(double %a, double %b, i32 %i1) {
108 ; CHECK-LABEL: f9:
109 ; CHECK: cijl %r2, -1
110 ; CHECK: ldr %f0, %f2
111 ; CHECK: br %r14
112   %cond = icmp slt i32 %i1, -1
113   %tmp = select i1 %cond, double %a, double %b
114   %res = fadd double %tmp, 1.0
115   ret double %res
118 ; Check the low end of the CIJ range.
119 define double @f10(double %a, double %b, i32 %i1) {
120 ; CHECK-LABEL: f10:
121 ; CHECK: cijl %r2, -128
122 ; CHECK: ldr %f0, %f2
123 ; CHECK: br %r14
124   %cond = icmp slt i32 %i1, -128
125   %tmp = select i1 %cond, double %a, double %b
126   %res = fadd double %tmp, 1.0
127   ret double %res
130 ; Check the next value down, which must use CHI instead.
131 define double @f11(double %a, double %b, i32 %i1) {
132 ; CHECK-LABEL: f11:
133 ; CHECK: chi %r2, -129
134 ; CHECK-NEXT: jl
135 ; CHECK: ldr %f0, %f2
136 ; CHECK: br %r14
137   %cond = icmp slt i32 %i1, -129
138   %tmp = select i1 %cond, double %a, double %b
139   %res = fadd double %tmp, 1.0
140   ret double %res
143 ; Check the low end of the CHI range.
144 define double @f12(double %a, double %b, i32 %i1) {
145 ; CHECK-LABEL: f12:
146 ; CHECK: chi %r2, -32768
147 ; CHECK-NEXT: jl
148 ; CHECK: ldr %f0, %f2
149 ; CHECK: br %r14
150   %cond = icmp slt i32 %i1, -32768
151   %tmp = select i1 %cond, double %a, double %b
152   %res = fadd double %tmp, 1.0
153   ret double %res
156 ; Check the next value down, which must use CFI instead.
157 define double @f13(double %a, double %b, i32 %i1) {
158 ; CHECK-LABEL: f13:
159 ; CHECK: cfi %r2, -32769
160 ; CHECK-NEXT: jl
161 ; CHECK: ldr %f0, %f2
162 ; CHECK: br %r14
163   %cond = icmp slt i32 %i1, -32769
164   %tmp = select i1 %cond, double %a, double %b
165   %res = fadd double %tmp, 1.0
166   ret double %res
169 ; Check the low end of the signed 32-bit range.
170 define double @f14(double %a, double %b, i32 %i1) {
171 ; CHECK-LABEL: f14:
172 ; CHECK: cfi %r2, -2147483648
173 ; CHECK-NEXT: je
174 ; CHECK: ldr %f0, %f2
175 ; CHECK: br %r14
176   %cond = icmp eq i32 %i1, -2147483648
177   %tmp = select i1 %cond, double %a, double %b
178   %res = fadd double %tmp, 1.0
179   ret double %res
182 ; Check the next value down, which should be treated as a positive value.
183 define double @f15(double %a, double %b, i32 %i1) {
184 ; CHECK-LABEL: f15:
185 ; CHECK: cfi %r2, 2147483647
186 ; CHECK-NEXT: je
187 ; CHECK: ldr %f0, %f2
188 ; CHECK: br %r14
189   %cond = icmp eq i32 %i1, -2147483649
190   %tmp = select i1 %cond, double %a, double %b
191   %res = fadd double %tmp, 1.0
192   ret double %res
195 ; Check that < 1 becomes <= 0.
196 define double @f16(double %a, double %b, i32 %i1) {
197 ; CHECK-LABEL: f16:
198 ; CHECK: cijle %r2, 0
199 ; CHECK: ldr %f0, %f2
200 ; CHECK: br %r14
201   %cond = icmp slt i32 %i1, 1
202   %tmp = select i1 %cond, double %a, double %b
203   %res = fadd double %tmp, 1.0
204   ret double %res
207 ; Check that >= 1 becomes > 0.
208 define double @f17(double %a, double %b, i32 %i1) {
209 ; CHECK-LABEL: f17:
210 ; CHECK: cijh %r2, 0
211 ; CHECK: ldr %f0, %f2
212 ; CHECK: br %r14
213   %cond = icmp sge i32 %i1, 1
214   %tmp = select i1 %cond, double %a, double %b
215   %res = fadd double %tmp, 1.0
216   ret double %res
219 ; Check that > -1 becomes >= 0.
220 define double @f18(double %a, double %b, i32 %i1) {
221 ; CHECK-LABEL: f18:
222 ; CHECK: cijhe %r2, 0
223 ; CHECK: ldr %f0, %f2
224 ; CHECK: br %r14
225   %cond = icmp sgt i32 %i1, -1
226   %tmp = select i1 %cond, double %a, double %b
227   %res = fadd double %tmp, 1.0
228   ret double %res
231 ; Check that <= -1 becomes < 0.
232 define double @f19(double %a, double %b, i32 %i1) {
233 ; CHECK-LABEL: f19:
234 ; CHECK: cijl %r2, 0
235 ; CHECK: ldr %f0, %f2
236 ; CHECK: br %r14
237   %cond = icmp sle i32 %i1, -1
238   %tmp = select i1 %cond, double %a, double %b
239   %res = fadd double %tmp, 1.0
240   ret double %res