xref: /llvm-project/llvm/test/CodeGen/SystemZ/int-cmp-57.ll (revision 6599961c17073204ac868958e632cf4d92353cbe)
1; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 -disable-cgp | FileCheck %s
2;
3; Check that signed comparisons against 0 are eliminated if the defining
4; instruction is an add with immediate.
5;
6; Addition of an immediate does not depend on the "nsw" flag, since the
7; result can be predicted in case of overflow. For example, if adding a
8; positive immediate gives overflow, the result must be negative.
9
10; Addition of a negative immediate gives a positive result in case of
11; overflow (except for the case of the minimum value which may also result in
12; a zero result).
13define i32 @fun0(i32 %arg) {
14; CHECK-LABEL: fun0:
15; CHECK: ahik
16; CHECK-NEXT: locre
17bb:
18  %tmp = add i32 %arg, -1
19  %tmp1 = icmp eq i32 %tmp, 0
20  %res = select i1 %tmp1, i32 %tmp, i32 %arg
21  ret i32 %res
22}
23
24define i32 @fun1(i32 %arg) {
25; CHECK-LABEL: fun1:
26; CHECK: ahik
27; CHECK-NEXT: locrnle
28bb:
29  %tmp = add i32 %arg, -1
30  %tmp1 = icmp sgt i32 %tmp, 0
31  %res = select i1 %tmp1, i32 %tmp, i32 %arg
32  ret i32 %res
33}
34
35define i32 @fun2(i32 %arg) {
36; CHECK-LABEL: fun2:
37; CHECK: ahik
38; CHECK-NEXT: locrl
39bb:
40  %tmp = add i32 %arg, -1
41  %tmp1 = icmp slt i32 %tmp, 0
42  %res = select i1 %tmp1, i32 %tmp, i32 %arg
43  ret i32 %res
44}
45
46; Addition of a positive immediate gives a negative result in case of overflow.
47define i32 @fun3(i32 %arg) {
48; CHECK-LABEL: fun3:
49; CHECK: ahik
50; CHECK-NEXT: locre
51bb:
52  %tmp = add i32 %arg, 1
53  %tmp1 = icmp eq i32 %tmp, 0
54  %res = select i1 %tmp1, i32 %tmp, i32 %arg
55  ret i32 %res
56}
57
58define i32 @fun4(i32 %arg) {
59; CHECK-LABEL: fun4:
60; CHECK: ahik
61; CHECK-NEXT: locrh
62bb:
63  %tmp = add i32 %arg, 1
64  %tmp1 = icmp sgt i32 %tmp, 0
65  %res = select i1 %tmp1, i32 %tmp, i32 %arg
66  ret i32 %res
67}
68
69define i32 @fun5(i32 %arg) {
70; CHECK-LABEL: fun5:
71; CHECK: ahik
72; CHECK-NEXT: locrnhe
73bb:
74  %tmp = add i32 %arg, 1
75  %tmp1 = icmp slt i32 %tmp, 0
76  %res = select i1 %tmp1, i32 %tmp, i32 %arg
77  ret i32 %res
78}
79
80; Addition of the minimum value gives a positive or zero result.
81define i32 @fun6(i32 %arg) {
82; CHECK-LABEL: fun6:
83; CHECK: afi
84; CHECK-NEXT: chi
85; CHECK-NEXT: locre
86bb:
87  %tmp = add i32 %arg, -2147483648
88  %tmp1 = icmp eq i32 %tmp, 0
89  %res = select i1 %tmp1, i32 %tmp, i32 %arg
90  ret i32 %res
91}
92
93define i32 @fun7(i32 %arg) {
94; CHECK-LABEL: fun7:
95; CHECK: afi
96; CHECK-NEXT: chi
97; CHECK-NEXT: locrh
98bb:
99  %tmp = add i32 %arg, -2147483648
100  %tmp1 = icmp sgt i32 %tmp, 0
101  %res = select i1 %tmp1, i32 %tmp, i32 %arg
102  ret i32 %res
103}
104