1; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s
2;
3; Check that signed comparisons against 0 are only eliminated if the "nsw"
4; flag is present on the defining add (with register) instruction. For an
5; equality comparison, add logical can be used.
6
7define i32 @fun0(i32 %arg, i32 %arg2, i32 %arg3) {
8; CHECK-LABEL: fun0:
9; CHECK: jle .LBB0_2{{$}}
10; CHECK: je .LBB0_4{{$}}
11
12bb:
13  %tmp2 = add nsw i32 %arg, %arg2
14  %tmp3 = icmp sgt i32 %tmp2, 0
15  br i1 %tmp3, label %bb3, label %bb1
16
17bb1:
18  %tmp4 = add nsw i32 %arg, %arg3
19  %tmp5 = icmp eq i32 %tmp4, 0
20  br i1 %tmp5, label %bb4, label %bb2
21
22bb2:
23  ret i32 0
24
25bb3:
26  ret i32 1
27
28bb4:
29  ret i32 2
30}
31
32; No "nsw" flag
33define i32 @fun1(i32 %arg, i32 %arg2, i32 %arg3) {
34; CHECK-LABEL: fun1:
35; CHECK: cijle
36; CHECK: alr
37; CHECK: jhe
38
39bb:
40  %tmp2 = add i32 %arg, %arg2
41  %tmp3 = icmp sgt i32 %tmp2, 0
42  br i1 %tmp3, label %bb3, label %bb1
43
44bb1:
45  %tmp4 = add i32 %arg, %arg3
46  %tmp5 = icmp eq i32 %tmp4, 0
47  br i1 %tmp5, label %bb4, label %bb2
48
49bb2:
50  ret i32 0
51
52bb3:
53  ret i32 1
54
55bb4:
56  ret i32 2
57}
58
59; "nuw" flag
60define i32 @fun2(i32 %arg, i32 %arg2, i32 %arg3) {
61; CHECK-LABEL: fun2:
62; CHECK: cijle
63; CHECK: alr
64; CHECK: jhe
65
66bb:
67  %tmp2 = add nuw i32 %arg, %arg2
68  %tmp3 = icmp sgt i32 %tmp2, 0
69  br i1 %tmp3, label %bb3, label %bb1
70
71bb1:
72  %tmp4 = add nuw i32 %arg, %arg3
73  %tmp5 = icmp eq i32 %tmp4, 0
74  br i1 %tmp5, label %bb4, label %bb2
75
76bb2:
77  ret i32 0
78
79bb3:
80  ret i32 1
81
82bb4:
83  ret i32 2
84}
85
86; Subtraction does not produce the value of zero in case of overflow, so
87; "nsw" is not needed for the equality check against zero.
88define i32 @fun3(i32 %arg, i32 %arg2, i32 %arg3) {
89; CHECK-LABEL: fun3:
90; CHECK: jle .LBB3_2{{$}}
91; CHECK: je .LBB3_4{{$}}
92
93bb:
94  %tmp2 = sub nsw i32 %arg, %arg2
95  %tmp3 = icmp sgt i32 %tmp2, 0
96  br i1 %tmp3, label %bb3, label %bb1
97
98bb1:
99  %tmp4 = sub nsw i32 %arg, %arg3
100  %tmp5 = icmp eq i32 %tmp4, 0
101  br i1 %tmp5, label %bb4, label %bb2
102
103bb2:
104  ret i32 0
105
106bb3:
107  ret i32 1
108
109bb4:
110  ret i32 2
111}
112
113; No "nsw" flag
114define i32 @fun4(i32 %arg, i32 %arg2, i32 %arg3) {
115; CHECK-LABEL: fun4:
116; CHECK: cijle
117; CHECK: je .LBB4_4{{$}}
118
119bb:
120  %tmp2 = sub i32 %arg, %arg2
121  %tmp3 = icmp sgt i32 %tmp2, 0
122  br i1 %tmp3, label %bb3, label %bb1
123
124bb1:
125  %tmp4 = sub i32 %arg, %arg3
126  %tmp5 = icmp eq i32 %tmp4, 0
127  br i1 %tmp5, label %bb4, label %bb2
128
129bb2:
130  ret i32 0
131
132bb3:
133  ret i32 1
134
135bb4:
136  ret i32 2
137}
138
139; "nuw" flag
140define i32 @fun5(i32 %arg, i32 %arg2, i32 %arg3) {
141; CHECK-LABEL: fun5:
142; CHECK: cijle
143; CHECK: je .LBB5_4{{$}}
144
145bb:
146  %tmp2 = sub nuw i32 %arg, %arg2
147  %tmp3 = icmp sgt i32 %tmp2, 0
148  br i1 %tmp3, label %bb3, label %bb1
149
150bb1:
151  %tmp4 = sub nuw i32 %arg, %arg3
152  %tmp5 = icmp eq i32 %tmp4, 0
153  br i1 %tmp5, label %bb4, label %bb2
154
155bb2:
156  ret i32 0
157
158bb3:
159  ret i32 1
160
161bb4:
162  ret i32 2
163}
164