1 ; RUN: llc -O3 < %s | FileCheck %s
2 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-n32:64"
3 target triple = "arm64-unknown-unknown"
6 ; CHECK: cinc w{{[0-9]+}}, w{{[0-9]+}}, ne
7 define i32 @foo1(i32 %b, i32 %c) nounwind readnone ssp {
9 %not.tobool = icmp ne i32 %c, 0
10 %add = zext i1 %not.tobool to i32
11 %b.add = add i32 %c, %b
12 %add1 = add i32 %b.add, %add
17 ; CHECK: cneg w{{[0-9]+}}, w{{[0-9]+}}, ne
18 define i32 @foo2(i32 %b, i32 %c) nounwind readnone ssp {
21 %tobool = icmp eq i32 %c, 0
22 %b.mul = select i1 %tobool, i32 %b, i32 %mul
23 %add = add nsw i32 %b.mul, %c
28 ; CHECK: cinv w{{[0-9]+}}, w{{[0-9]+}}, ne
29 define i32 @foo3(i32 %b, i32 %c) nounwind readnone ssp {
31 %not.tobool = icmp ne i32 %c, 0
32 %xor = sext i1 %not.tobool to i32
33 %b.xor = xor i32 %xor, %b
34 %add = add nsw i32 %b.xor, %c
39 define i32@foo4(i32 %a) nounwind ssp {
43 %cmp = icmp sgt i32 %a, -1
44 %neg = sub nsw i32 0, %a
45 %cond = select i1 %cmp, i32 %a, i32 %neg
49 define i32@foo5(i32 %a, i32 %b) nounwind ssp {
55 %sub = sub nsw i32 %a, %b
56 %cmp = icmp sgt i32 %sub, -1
57 %sub3 = sub nsw i32 0, %sub
58 %cond = select i1 %cmp, i32 %sub, i32 %sub3
62 ; make sure we can handle branch instruction in optimizeCompare.
63 define i32@foo6(i32 %a, i32 %b) nounwind ssp {
66 %sub = sub nsw i32 %a, %b
67 %cmp = icmp sgt i32 %sub, 0
68 br i1 %cmp, label %l.if, label %l.else
77 ; If CPSR is used multiple times and V flag is used, we don't remove cmp.
78 define i32 @foo7(i32 %a, i32 %b) nounwind {
85 %sub = sub nsw i32 %a, %b
86 %cmp = icmp sgt i32 %sub, -1
87 %sub3 = sub nsw i32 0, %sub
88 %cond = select i1 %cmp, i32 %sub, i32 %sub3
89 br i1 %cmp, label %if.then, label %if.else
92 %cmp2 = icmp slt i32 %sub, -1
93 %sel = select i1 %cmp2, i32 %cond, i32 %a
100 define i32 @foo8(i32 %v, i32 %a, i32 %b) nounwind readnone ssp {
104 ; CHECK: csinv w0, w1, w2, ne
105 %tobool = icmp eq i32 %v, 0
106 %neg = xor i32 -1, %b
107 %cond = select i1 %tobool, i32 %neg, i32 %a
111 define i32 @foo9(i32 %v) nounwind readnone optsize ssp {
115 ; CHECK: orr w[[REG:[0-9]+]], wzr, #0x4
116 ; CHECK: cinv w0, w[[REG]], eq
117 %tobool = icmp ne i32 %v, 0
118 %cond = select i1 %tobool, i32 4, i32 -5
122 define i64 @foo10(i64 %v) nounwind readnone optsize ssp {
124 ; CHECK-LABEL: foo10:
126 ; CHECK: orr w[[REG:[0-9]+]], wzr, #0x4
127 ; CHECK: cinv x0, x[[REG]], eq
128 %tobool = icmp ne i64 %v, 0
129 %cond = select i1 %tobool, i64 4, i64 -5
133 define i32 @foo11(i32 %v) nounwind readnone optsize ssp {
135 ; CHECK-LABEL: foo11:
137 ; CHECK: orr w[[REG:[0-9]+]], wzr, #0x4
138 ; CHECK: cneg w0, w[[REG]], eq
139 %tobool = icmp ne i32 %v, 0
140 %cond = select i1 %tobool, i32 4, i32 -4
144 define i64 @foo12(i64 %v) nounwind readnone optsize ssp {
146 ; CHECK-LABEL: foo12:
148 ; CHECK: orr w[[REG:[0-9]+]], wzr, #0x4
149 ; CHECK: cneg x0, x[[REG]], eq
150 %tobool = icmp ne i64 %v, 0
151 %cond = select i1 %tobool, i64 4, i64 -4
155 define i32 @foo13(i32 %v, i32 %a, i32 %b) nounwind readnone optsize ssp {
157 ; CHECK-LABEL: foo13:
159 ; CHECK: csneg w0, w1, w2, ne
160 %tobool = icmp eq i32 %v, 0
162 %cond = select i1 %tobool, i32 %sub, i32 %a
166 define i64 @foo14(i64 %v, i64 %a, i64 %b) nounwind readnone optsize ssp {
168 ; CHECK-LABEL: foo14:
170 ; CHECK: csneg x0, x1, x2, ne
171 %tobool = icmp eq i64 %v, 0
173 %cond = select i1 %tobool, i64 %sub, i64 %a
177 define i32 @foo15(i32 %a, i32 %b) nounwind readnone optsize ssp {
179 ; CHECK-LABEL: foo15:
181 ; CHECK: orr w[[REG:[0-9]+]], wzr, #0x1
182 ; CHECK: cinc w0, w[[REG]], gt
183 %cmp = icmp sgt i32 %a, %b
184 %. = select i1 %cmp, i32 2, i32 1
188 define i32 @foo16(i32 %a, i32 %b) nounwind readnone optsize ssp {
190 ; CHECK-LABEL: foo16:
192 ; CHECK: orr w[[REG:[0-9]+]], wzr, #0x1
193 ; CHECK: cinc w0, w[[REG]], le
194 %cmp = icmp sgt i32 %a, %b
195 %. = select i1 %cmp, i32 1, i32 2
199 define i64 @foo17(i64 %a, i64 %b) nounwind readnone optsize ssp {
201 ; CHECK-LABEL: foo17:
203 ; CHECK: orr w[[REG:[0-9]+]], wzr, #0x1
204 ; CHECK: cinc x0, x[[REG]], gt
205 %cmp = icmp sgt i64 %a, %b
206 %. = select i1 %cmp, i64 2, i64 1
210 define i64 @foo18(i64 %a, i64 %b) nounwind readnone optsize ssp {
212 ; CHECK-LABEL: foo18:
214 ; CHECK: orr w[[REG:[0-9]+]], wzr, #0x1
215 ; CHECK: cinc x0, x[[REG]], le
216 %cmp = icmp sgt i64 %a, %b
217 %. = select i1 %cmp, i64 1, i64 2
221 define i64 @foo19(i64 %a, i64 %b, i64 %c) {
223 ; CHECK-LABEL: foo19:
226 %cmp = icmp ult i64 %a, %b
227 %inc = zext i1 %cmp to i64
228 %inc.c = add i64 %inc, %c