xref: /llvm-project/llvm/test/CodeGen/RISCV/cmov-branch-opt.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1faa326deSCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2faa326deSCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+c -verify-machineinstrs < %s \
3faa326deSCraig Topper; RUN:   | FileCheck -check-prefix=NOCMOV %s
4faa326deSCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+conditional-cmv-fusion,+c -verify-machineinstrs < %s \
5faa326deSCraig Topper; RUN:   | FileCheck -check-prefixes=CMOV,CMOV-NOZICOND %s
6d833b9d6SAlex Bradbury; RUN: llc -mtriple=riscv64 -mattr=+conditional-cmv-fusion,+c,+zicond -verify-machineinstrs < %s \
7faa326deSCraig Topper; RUN:   | FileCheck -check-prefixes=CMOV,CMOV-ZICOND %s
8faa326deSCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+short-forward-branch-opt -verify-machineinstrs < %s \
9faa326deSCraig Topper; RUN:   | FileCheck -check-prefixes=SHORT_FORWARD,SFB-NOZICOND %s
10faa326deSCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+short-forward-branch-opt,+c -verify-machineinstrs < %s \
11faa326deSCraig Topper; RUN:   | FileCheck -check-prefixes=SHORT_FORWARD,SFB-NOZICOND %s
12d833b9d6SAlex Bradbury; RUN: llc -mtriple=riscv64 -mattr=+short-forward-branch-opt,+zicond -verify-machineinstrs < %s \
13faa326deSCraig Topper; RUN:   | FileCheck -check-prefixes=SHORT_FORWARD,SFB-ZICOND %s
14faa326deSCraig Topper
15faa326deSCraig Topper; The conditional move optimization in sifive-p450 requires that only a
16faa326deSCraig Topper; single c.mv instruction appears in the branch shadow.
17faa326deSCraig Topper
18faa326deSCraig Topper; The sifive-7-series can predicate an xor.
19faa326deSCraig Topper
20faa326deSCraig Topperdefine signext i32 @test1(i32 signext %x, i32 signext %y, i32 signext %z) {
21faa326deSCraig Topper; NOCMOV-LABEL: test1:
22faa326deSCraig Topper; NOCMOV:       # %bb.0:
23faa326deSCraig Topper; NOCMOV-NEXT:    snez a2, a2
24faa326deSCraig Topper; NOCMOV-NEXT:    addi a2, a2, -1
25faa326deSCraig Topper; NOCMOV-NEXT:    and a1, a1, a2
26faa326deSCraig Topper; NOCMOV-NEXT:    xor a0, a0, a1
27faa326deSCraig Topper; NOCMOV-NEXT:    ret
28faa326deSCraig Topper;
29faa326deSCraig Topper; CMOV-LABEL: test1:
30faa326deSCraig Topper; CMOV:       # %bb.0:
31faa326deSCraig Topper; CMOV-NEXT:    xor a1, a1, a0
32faa326deSCraig Topper; CMOV-NEXT:    bnez a2, .LBB0_2
33faa326deSCraig Topper; CMOV-NEXT:  # %bb.1:
34faa326deSCraig Topper; CMOV-NEXT:    mv a0, a1
35faa326deSCraig Topper; CMOV-NEXT:  .LBB0_2:
36faa326deSCraig Topper; CMOV-NEXT:    ret
37faa326deSCraig Topper;
38faa326deSCraig Topper; SHORT_FORWARD-LABEL: test1:
39faa326deSCraig Topper; SHORT_FORWARD:       # %bb.0:
40faa326deSCraig Topper; SHORT_FORWARD-NEXT:    bnez a2, .LBB0_2
41faa326deSCraig Topper; SHORT_FORWARD-NEXT:  # %bb.1:
42faa326deSCraig Topper; SHORT_FORWARD-NEXT:    xor a0, a0, a1
43faa326deSCraig Topper; SHORT_FORWARD-NEXT:  .LBB0_2:
44faa326deSCraig Topper; SHORT_FORWARD-NEXT:    ret
45faa326deSCraig Topper  %c = icmp eq i32 %z, 0
46faa326deSCraig Topper  %a = xor i32 %x, %y
47faa326deSCraig Topper  %b = select i1 %c, i32 %a, i32 %x
48faa326deSCraig Topper  ret i32 %b
49faa326deSCraig Topper}
50faa326deSCraig Topper
51faa326deSCraig Topperdefine signext i32 @test2(i32 signext %x, i32 signext %y, i32 signext %z) {
52faa326deSCraig Topper; NOCMOV-LABEL: test2:
53faa326deSCraig Topper; NOCMOV:       # %bb.0:
54faa326deSCraig Topper; NOCMOV-NEXT:    seqz a2, a2
55faa326deSCraig Topper; NOCMOV-NEXT:    addi a2, a2, -1
56faa326deSCraig Topper; NOCMOV-NEXT:    and a1, a1, a2
57faa326deSCraig Topper; NOCMOV-NEXT:    xor a0, a0, a1
58faa326deSCraig Topper; NOCMOV-NEXT:    ret
59faa326deSCraig Topper;
60faa326deSCraig Topper; CMOV-LABEL: test2:
61faa326deSCraig Topper; CMOV:       # %bb.0:
62faa326deSCraig Topper; CMOV-NEXT:    xor a1, a1, a0
63faa326deSCraig Topper; CMOV-NEXT:    beqz a2, .LBB1_2
64faa326deSCraig Topper; CMOV-NEXT:  # %bb.1:
65faa326deSCraig Topper; CMOV-NEXT:    mv a0, a1
66faa326deSCraig Topper; CMOV-NEXT:  .LBB1_2:
67faa326deSCraig Topper; CMOV-NEXT:    ret
68faa326deSCraig Topper;
69faa326deSCraig Topper; SHORT_FORWARD-LABEL: test2:
70faa326deSCraig Topper; SHORT_FORWARD:       # %bb.0:
71faa326deSCraig Topper; SHORT_FORWARD-NEXT:    beqz a2, .LBB1_2
72faa326deSCraig Topper; SHORT_FORWARD-NEXT:  # %bb.1:
73faa326deSCraig Topper; SHORT_FORWARD-NEXT:    xor a0, a0, a1
74faa326deSCraig Topper; SHORT_FORWARD-NEXT:  .LBB1_2:
75faa326deSCraig Topper; SHORT_FORWARD-NEXT:    ret
76faa326deSCraig Topper  %c = icmp eq i32 %z, 0
77faa326deSCraig Topper  %a = xor i32 %x, %y
78faa326deSCraig Topper  %b = select i1 %c, i32 %x, i32 %a
79faa326deSCraig Topper  ret i32 %b
80faa326deSCraig Topper}
81faa326deSCraig Topper
82faa326deSCraig Topper; Make sure we don't share the same basic block for two selects with the same
83faa326deSCraig Topper; condition.
84faa326deSCraig Topperdefine signext i32 @test3(i32 signext %v, i32 signext %w, i32 signext %x, i32 signext %y, i32 signext %z) {
85faa326deSCraig Topper; NOCMOV-LABEL: test3:
86faa326deSCraig Topper; NOCMOV:       # %bb.0:
87faa326deSCraig Topper; NOCMOV-NEXT:    seqz a4, a4
88faa326deSCraig Topper; NOCMOV-NEXT:    addi a4, a4, -1
89faa326deSCraig Topper; NOCMOV-NEXT:    and a1, a1, a4
90faa326deSCraig Topper; NOCMOV-NEXT:    and a3, a3, a4
91*9122c523SPengcheng Wang; NOCMOV-NEXT:    xor a0, a0, a1
92faa326deSCraig Topper; NOCMOV-NEXT:    xor a2, a2, a3
93faa326deSCraig Topper; NOCMOV-NEXT:    addw a0, a0, a2
94faa326deSCraig Topper; NOCMOV-NEXT:    ret
95faa326deSCraig Topper;
96faa326deSCraig Topper; CMOV-LABEL: test3:
97faa326deSCraig Topper; CMOV:       # %bb.0:
98faa326deSCraig Topper; CMOV-NEXT:    xor a1, a1, a0
99*9122c523SPengcheng Wang; CMOV-NEXT:    xor a3, a3, a2
100faa326deSCraig Topper; CMOV-NEXT:    bnez a4, .LBB2_2
101faa326deSCraig Topper; CMOV-NEXT:  # %bb.1:
102faa326deSCraig Topper; CMOV-NEXT:    mv a1, a0
103faa326deSCraig Topper; CMOV-NEXT:  .LBB2_2:
104faa326deSCraig Topper; CMOV-NEXT:    bnez a4, .LBB2_4
105faa326deSCraig Topper; CMOV-NEXT:  # %bb.3:
106*9122c523SPengcheng Wang; CMOV-NEXT:    mv a3, a2
107faa326deSCraig Topper; CMOV-NEXT:  .LBB2_4:
108*9122c523SPengcheng Wang; CMOV-NEXT:    addw a0, a1, a3
109faa326deSCraig Topper; CMOV-NEXT:    ret
110faa326deSCraig Topper;
111faa326deSCraig Topper; SHORT_FORWARD-LABEL: test3:
112faa326deSCraig Topper; SHORT_FORWARD:       # %bb.0:
113faa326deSCraig Topper; SHORT_FORWARD-NEXT:    beqz a4, .LBB2_2
114faa326deSCraig Topper; SHORT_FORWARD-NEXT:  # %bb.1:
115faa326deSCraig Topper; SHORT_FORWARD-NEXT:    xor a0, a0, a1
116faa326deSCraig Topper; SHORT_FORWARD-NEXT:  .LBB2_2:
117faa326deSCraig Topper; SHORT_FORWARD-NEXT:    beqz a4, .LBB2_4
118faa326deSCraig Topper; SHORT_FORWARD-NEXT:  # %bb.3:
119faa326deSCraig Topper; SHORT_FORWARD-NEXT:    xor a2, a2, a3
120faa326deSCraig Topper; SHORT_FORWARD-NEXT:  .LBB2_4:
121faa326deSCraig Topper; SHORT_FORWARD-NEXT:    addw a0, a0, a2
122faa326deSCraig Topper; SHORT_FORWARD-NEXT:    ret
123faa326deSCraig Topper  %c = icmp eq i32 %z, 0
124faa326deSCraig Topper  %a = xor i32 %v, %w
125faa326deSCraig Topper  %b = select i1 %c, i32 %v, i32 %a
126faa326deSCraig Topper  %d = xor i32 %x, %y
127faa326deSCraig Topper  %e = select i1 %c, i32 %x, i32 %d
128faa326deSCraig Topper  %f = add i32 %b, %e
129faa326deSCraig Topper  ret i32 %f
130faa326deSCraig Topper}
131faa326deSCraig Topper
132faa326deSCraig Topperdefine signext i32 @test4(i32 signext %x, i32 signext %y, i32 signext %z) {
133faa326deSCraig Topper; NOCMOV-LABEL: test4:
134faa326deSCraig Topper; NOCMOV:       # %bb.0:
135faa326deSCraig Topper; NOCMOV-NEXT:    snez a0, a2
136faa326deSCraig Topper; NOCMOV-NEXT:    addi a0, a0, -1
137faa326deSCraig Topper; NOCMOV-NEXT:    andi a0, a0, 3
138faa326deSCraig Topper; NOCMOV-NEXT:    ret
139faa326deSCraig Topper;
140faa326deSCraig Topper; CMOV-NOZICOND-LABEL: test4:
141faa326deSCraig Topper; CMOV-NOZICOND:       # %bb.0:
142faa326deSCraig Topper; CMOV-NOZICOND-NEXT:    li a1, 0
143faa326deSCraig Topper; CMOV-NOZICOND-NEXT:    li a0, 3
144faa326deSCraig Topper; CMOV-NOZICOND-NEXT:    beqz a2, .LBB3_2
145faa326deSCraig Topper; CMOV-NOZICOND-NEXT:  # %bb.1:
146faa326deSCraig Topper; CMOV-NOZICOND-NEXT:    mv a0, a1
147faa326deSCraig Topper; CMOV-NOZICOND-NEXT:  .LBB3_2:
148faa326deSCraig Topper; CMOV-NOZICOND-NEXT:    ret
149faa326deSCraig Topper;
150faa326deSCraig Topper; CMOV-ZICOND-LABEL: test4:
151faa326deSCraig Topper; CMOV-ZICOND:       # %bb.0:
152faa326deSCraig Topper; CMOV-ZICOND-NEXT:    li a0, 3
153faa326deSCraig Topper; CMOV-ZICOND-NEXT:    czero.nez a0, a0, a2
154faa326deSCraig Topper; CMOV-ZICOND-NEXT:    ret
155faa326deSCraig Topper;
156faa326deSCraig Topper; SFB-NOZICOND-LABEL: test4:
157faa326deSCraig Topper; SFB-NOZICOND:       # %bb.0:
158faa326deSCraig Topper; SFB-NOZICOND-NEXT:    li a0, 3
159faa326deSCraig Topper; SFB-NOZICOND-NEXT:    beqz a2, .LBB3_2
160faa326deSCraig Topper; SFB-NOZICOND-NEXT:  # %bb.1:
161faa326deSCraig Topper; SFB-NOZICOND-NEXT:    li a0, 0
162faa326deSCraig Topper; SFB-NOZICOND-NEXT:  .LBB3_2:
163faa326deSCraig Topper; SFB-NOZICOND-NEXT:    ret
164faa326deSCraig Topper;
165faa326deSCraig Topper; SFB-ZICOND-LABEL: test4:
166faa326deSCraig Topper; SFB-ZICOND:       # %bb.0:
167faa326deSCraig Topper; SFB-ZICOND-NEXT:    li a0, 3
168faa326deSCraig Topper; SFB-ZICOND-NEXT:    czero.nez a0, a0, a2
169faa326deSCraig Topper; SFB-ZICOND-NEXT:    ret
170faa326deSCraig Topper  %c = icmp eq i32 %z, 0
171faa326deSCraig Topper  %a = select i1 %c, i32 3, i32 0
172faa326deSCraig Topper  ret i32 %a
173faa326deSCraig Topper}
174faa326deSCraig Topper
175faa326deSCraig Topperdefine i16 @select_xor_1(i16 %A, i8 %cond) {
176faa326deSCraig Topper; NOCMOV-LABEL: select_xor_1:
177faa326deSCraig Topper; NOCMOV:       # %bb.0: # %entry
178faa326deSCraig Topper; NOCMOV-NEXT:    slli a1, a1, 63
179faa326deSCraig Topper; NOCMOV-NEXT:    srai a1, a1, 63
180faa326deSCraig Topper; NOCMOV-NEXT:    andi a1, a1, 43
181faa326deSCraig Topper; NOCMOV-NEXT:    xor a0, a0, a1
182faa326deSCraig Topper; NOCMOV-NEXT:    ret
183faa326deSCraig Topper;
184faa326deSCraig Topper; CMOV-LABEL: select_xor_1:
185faa326deSCraig Topper; CMOV:       # %bb.0: # %entry
186faa326deSCraig Topper; CMOV-NEXT:    andi a1, a1, 1
187faa326deSCraig Topper; CMOV-NEXT:    xori a2, a0, 43
188faa326deSCraig Topper; CMOV-NEXT:    beqz a1, .LBB4_2
189faa326deSCraig Topper; CMOV-NEXT:  # %bb.1: # %entry
190faa326deSCraig Topper; CMOV-NEXT:    mv a0, a2
191faa326deSCraig Topper; CMOV-NEXT:  .LBB4_2: # %entry
192faa326deSCraig Topper; CMOV-NEXT:    ret
193faa326deSCraig Topper;
194faa326deSCraig Topper; SHORT_FORWARD-LABEL: select_xor_1:
195faa326deSCraig Topper; SHORT_FORWARD:       # %bb.0: # %entry
196faa326deSCraig Topper; SHORT_FORWARD-NEXT:    andi a1, a1, 1
197faa326deSCraig Topper; SHORT_FORWARD-NEXT:    beqz a1, .LBB4_2
198faa326deSCraig Topper; SHORT_FORWARD-NEXT:  # %bb.1: # %entry
199faa326deSCraig Topper; SHORT_FORWARD-NEXT:    xori a0, a0, 43
200faa326deSCraig Topper; SHORT_FORWARD-NEXT:  .LBB4_2: # %entry
201faa326deSCraig Topper; SHORT_FORWARD-NEXT:    ret
202faa326deSCraig Topperentry:
203faa326deSCraig Topper %and = and i8 %cond, 1
204faa326deSCraig Topper %cmp10 = icmp eq i8 %and, 0
205faa326deSCraig Topper %0 = xor i16 %A, 43
206faa326deSCraig Topper %1 = select i1 %cmp10, i16 %A, i16 %0
207faa326deSCraig Topper ret i16 %1
208faa326deSCraig Topper}
209faa326deSCraig Topper
210faa326deSCraig Topper; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of
211faa326deSCraig Topper; icmp eq (and %cond, 1), 0
212faa326deSCraig Topperdefine i16 @select_xor_1b(i16 %A, i8 %cond) {
213faa326deSCraig Topper; NOCMOV-LABEL: select_xor_1b:
214faa326deSCraig Topper; NOCMOV:       # %bb.0: # %entry
215faa326deSCraig Topper; NOCMOV-NEXT:    slli a1, a1, 63
216faa326deSCraig Topper; NOCMOV-NEXT:    srai a1, a1, 63
217faa326deSCraig Topper; NOCMOV-NEXT:    andi a1, a1, 43
218faa326deSCraig Topper; NOCMOV-NEXT:    xor a0, a0, a1
219faa326deSCraig Topper; NOCMOV-NEXT:    ret
220faa326deSCraig Topper;
221faa326deSCraig Topper; CMOV-LABEL: select_xor_1b:
222faa326deSCraig Topper; CMOV:       # %bb.0: # %entry
223faa326deSCraig Topper; CMOV-NEXT:    andi a1, a1, 1
224faa326deSCraig Topper; CMOV-NEXT:    xori a2, a0, 43
225faa326deSCraig Topper; CMOV-NEXT:    beqz a1, .LBB5_2
226faa326deSCraig Topper; CMOV-NEXT:  # %bb.1: # %entry
227faa326deSCraig Topper; CMOV-NEXT:    mv a0, a2
228faa326deSCraig Topper; CMOV-NEXT:  .LBB5_2: # %entry
229faa326deSCraig Topper; CMOV-NEXT:    ret
230faa326deSCraig Topper;
231faa326deSCraig Topper; SHORT_FORWARD-LABEL: select_xor_1b:
232faa326deSCraig Topper; SHORT_FORWARD:       # %bb.0: # %entry
233faa326deSCraig Topper; SHORT_FORWARD-NEXT:    andi a1, a1, 1
234faa326deSCraig Topper; SHORT_FORWARD-NEXT:    beqz a1, .LBB5_2
235faa326deSCraig Topper; SHORT_FORWARD-NEXT:  # %bb.1: # %entry
236faa326deSCraig Topper; SHORT_FORWARD-NEXT:    xori a0, a0, 43
237faa326deSCraig Topper; SHORT_FORWARD-NEXT:  .LBB5_2: # %entry
238faa326deSCraig Topper; SHORT_FORWARD-NEXT:    ret
239faa326deSCraig Topperentry:
240faa326deSCraig Topper %and = and i8 %cond, 1
241faa326deSCraig Topper %cmp10 = icmp ne i8 %and, 1
242faa326deSCraig Topper %0 = xor i16 %A, 43
243faa326deSCraig Topper %1 = select i1 %cmp10, i16 %A, i16 %0
244faa326deSCraig Topper ret i16 %1
245faa326deSCraig Topper}
246faa326deSCraig Topper
247faa326deSCraig Topperdefine i32 @select_xor_2(i32 %A, i32 %B, i8 %cond) {
248faa326deSCraig Topper; NOCMOV-LABEL: select_xor_2:
249faa326deSCraig Topper; NOCMOV:       # %bb.0: # %entry
250faa326deSCraig Topper; NOCMOV-NEXT:    slli a2, a2, 63
251faa326deSCraig Topper; NOCMOV-NEXT:    srai a2, a2, 63
252faa326deSCraig Topper; NOCMOV-NEXT:    and a1, a1, a2
253faa326deSCraig Topper; NOCMOV-NEXT:    xor a0, a0, a1
254faa326deSCraig Topper; NOCMOV-NEXT:    ret
255faa326deSCraig Topper;
256faa326deSCraig Topper; CMOV-LABEL: select_xor_2:
257faa326deSCraig Topper; CMOV:       # %bb.0: # %entry
258faa326deSCraig Topper; CMOV-NEXT:    andi a2, a2, 1
259faa326deSCraig Topper; CMOV-NEXT:    xor a1, a1, a0
260faa326deSCraig Topper; CMOV-NEXT:    beqz a2, .LBB6_2
261faa326deSCraig Topper; CMOV-NEXT:  # %bb.1: # %entry
262faa326deSCraig Topper; CMOV-NEXT:    mv a0, a1
263faa326deSCraig Topper; CMOV-NEXT:  .LBB6_2: # %entry
264faa326deSCraig Topper; CMOV-NEXT:    ret
265faa326deSCraig Topper;
266faa326deSCraig Topper; SFB-ZICOND-LABEL: select_xor_2:
267faa326deSCraig Topper; SFB-ZICOND:       # %bb.0: # %entry
268faa326deSCraig Topper; SFB-ZICOND-NEXT:    andi a2, a2, 1
269faa326deSCraig Topper; SFB-ZICOND-NEXT:    beqz a2, .LBB6_2
270faa326deSCraig Topper; SFB-ZICOND-NEXT:  # %bb.1: # %entry
271faa326deSCraig Topper; SFB-ZICOND-NEXT:    xor a0, a1, a0
272faa326deSCraig Topper; SFB-ZICOND-NEXT:  .LBB6_2: # %entry
273faa326deSCraig Topper; SFB-ZICOND-NEXT:    ret
274faa326deSCraig Topperentry:
275faa326deSCraig Topper %and = and i8 %cond, 1
276faa326deSCraig Topper %cmp10 = icmp eq i8 %and, 0
277faa326deSCraig Topper %0 = xor i32 %B, %A
278faa326deSCraig Topper %1 = select i1 %cmp10, i32 %A, i32 %0
279faa326deSCraig Topper ret i32 %1
280faa326deSCraig Topper}
281faa326deSCraig Topper
282faa326deSCraig Topper; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of
283faa326deSCraig Topper; icmp eq (and %cond, 1), 0
284faa326deSCraig Topperdefine i32 @select_xor_2b(i32 %A, i32 %B, i8 %cond) {
285faa326deSCraig Topper; NOCMOV-LABEL: select_xor_2b:
286faa326deSCraig Topper; NOCMOV:       # %bb.0: # %entry
287faa326deSCraig Topper; NOCMOV-NEXT:    slli a2, a2, 63
288faa326deSCraig Topper; NOCMOV-NEXT:    srai a2, a2, 63
289faa326deSCraig Topper; NOCMOV-NEXT:    and a1, a1, a2
290faa326deSCraig Topper; NOCMOV-NEXT:    xor a0, a0, a1
291faa326deSCraig Topper; NOCMOV-NEXT:    ret
292faa326deSCraig Topper;
293faa326deSCraig Topper; CMOV-LABEL: select_xor_2b:
294faa326deSCraig Topper; CMOV:       # %bb.0: # %entry
295faa326deSCraig Topper; CMOV-NEXT:    andi a2, a2, 1
296faa326deSCraig Topper; CMOV-NEXT:    xor a1, a1, a0
297faa326deSCraig Topper; CMOV-NEXT:    beqz a2, .LBB7_2
298faa326deSCraig Topper; CMOV-NEXT:  # %bb.1: # %entry
299faa326deSCraig Topper; CMOV-NEXT:    mv a0, a1
300faa326deSCraig Topper; CMOV-NEXT:  .LBB7_2: # %entry
301faa326deSCraig Topper; CMOV-NEXT:    ret
302faa326deSCraig Topper;
303faa326deSCraig Topper; SFB-ZICOND-LABEL: select_xor_2b:
304faa326deSCraig Topper; SFB-ZICOND:       # %bb.0: # %entry
305faa326deSCraig Topper; SFB-ZICOND-NEXT:    andi a2, a2, 1
306faa326deSCraig Topper; SFB-ZICOND-NEXT:    beqz a2, .LBB7_2
307faa326deSCraig Topper; SFB-ZICOND-NEXT:  # %bb.1: # %entry
308faa326deSCraig Topper; SFB-ZICOND-NEXT:    xor a0, a1, a0
309faa326deSCraig Topper; SFB-ZICOND-NEXT:  .LBB7_2: # %entry
310faa326deSCraig Topper; SFB-ZICOND-NEXT:    ret
311faa326deSCraig Topperentry:
312faa326deSCraig Topper %and = and i8 %cond, 1
313faa326deSCraig Topper %cmp10 = icmp ne i8 %and, 1
314faa326deSCraig Topper %0 = xor i32 %B, %A
315faa326deSCraig Topper %1 = select i1 %cmp10, i32 %A, i32 %0
316faa326deSCraig Topper ret i32 %1
317faa326deSCraig Topper}
318faa326deSCraig Topper
319faa326deSCraig Topperdefine i32 @select_or(i32 %A, i32 %B, i8 %cond) {
320faa326deSCraig Topper; NOCMOV-LABEL: select_or:
321faa326deSCraig Topper; NOCMOV:       # %bb.0: # %entry
322faa326deSCraig Topper; NOCMOV-NEXT:    slli a2, a2, 63
323faa326deSCraig Topper; NOCMOV-NEXT:    srai a2, a2, 63
324faa326deSCraig Topper; NOCMOV-NEXT:    and a1, a1, a2
325faa326deSCraig Topper; NOCMOV-NEXT:    or a0, a0, a1
326faa326deSCraig Topper; NOCMOV-NEXT:    ret
327faa326deSCraig Topper;
328faa326deSCraig Topper; CMOV-LABEL: select_or:
329faa326deSCraig Topper; CMOV:       # %bb.0: # %entry
330faa326deSCraig Topper; CMOV-NEXT:    andi a2, a2, 1
331faa326deSCraig Topper; CMOV-NEXT:    or a1, a1, a0
332faa326deSCraig Topper; CMOV-NEXT:    beqz a2, .LBB8_2
333faa326deSCraig Topper; CMOV-NEXT:  # %bb.1: # %entry
334faa326deSCraig Topper; CMOV-NEXT:    mv a0, a1
335faa326deSCraig Topper; CMOV-NEXT:  .LBB8_2: # %entry
336faa326deSCraig Topper; CMOV-NEXT:    ret
337faa326deSCraig Topper;
338faa326deSCraig Topper; SFB-ZICOND-LABEL: select_or:
339faa326deSCraig Topper; SFB-ZICOND:       # %bb.0: # %entry
340faa326deSCraig Topper; SFB-ZICOND-NEXT:    andi a2, a2, 1
341faa326deSCraig Topper; SFB-ZICOND-NEXT:    beqz a2, .LBB8_2
342faa326deSCraig Topper; SFB-ZICOND-NEXT:  # %bb.1: # %entry
343faa326deSCraig Topper; SFB-ZICOND-NEXT:    or a0, a1, a0
344faa326deSCraig Topper; SFB-ZICOND-NEXT:  .LBB8_2: # %entry
345faa326deSCraig Topper; SFB-ZICOND-NEXT:    ret
346faa326deSCraig Topperentry:
347faa326deSCraig Topper %and = and i8 %cond, 1
348faa326deSCraig Topper %cmp10 = icmp eq i8 %and, 0
349faa326deSCraig Topper %0 = or i32 %B, %A
350faa326deSCraig Topper %1 = select i1 %cmp10, i32 %A, i32 %0
351faa326deSCraig Topper ret i32 %1
352faa326deSCraig Topper}
353faa326deSCraig Topper
354faa326deSCraig Topper; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of
355faa326deSCraig Topper; icmp eq (and %cond, 1), 0
356faa326deSCraig Topperdefine i32 @select_or_b(i32 %A, i32 %B, i8 %cond) {
357faa326deSCraig Topper; NOCMOV-LABEL: select_or_b:
358faa326deSCraig Topper; NOCMOV:       # %bb.0: # %entry
359faa326deSCraig Topper; NOCMOV-NEXT:    slli a2, a2, 63
360faa326deSCraig Topper; NOCMOV-NEXT:    srai a2, a2, 63
361faa326deSCraig Topper; NOCMOV-NEXT:    and a1, a1, a2
362faa326deSCraig Topper; NOCMOV-NEXT:    or a0, a0, a1
363faa326deSCraig Topper; NOCMOV-NEXT:    ret
364faa326deSCraig Topper;
365faa326deSCraig Topper; CMOV-LABEL: select_or_b:
366faa326deSCraig Topper; CMOV:       # %bb.0: # %entry
367faa326deSCraig Topper; CMOV-NEXT:    andi a2, a2, 1
368faa326deSCraig Topper; CMOV-NEXT:    or a1, a1, a0
369faa326deSCraig Topper; CMOV-NEXT:    beqz a2, .LBB9_2
370faa326deSCraig Topper; CMOV-NEXT:  # %bb.1: # %entry
371faa326deSCraig Topper; CMOV-NEXT:    mv a0, a1
372faa326deSCraig Topper; CMOV-NEXT:  .LBB9_2: # %entry
373faa326deSCraig Topper; CMOV-NEXT:    ret
374faa326deSCraig Topper;
375faa326deSCraig Topper; SFB-ZICOND-LABEL: select_or_b:
376faa326deSCraig Topper; SFB-ZICOND:       # %bb.0: # %entry
377faa326deSCraig Topper; SFB-ZICOND-NEXT:    andi a2, a2, 1
378faa326deSCraig Topper; SFB-ZICOND-NEXT:    beqz a2, .LBB9_2
379faa326deSCraig Topper; SFB-ZICOND-NEXT:  # %bb.1: # %entry
380faa326deSCraig Topper; SFB-ZICOND-NEXT:    or a0, a1, a0
381faa326deSCraig Topper; SFB-ZICOND-NEXT:  .LBB9_2: # %entry
382faa326deSCraig Topper; SFB-ZICOND-NEXT:    ret
383faa326deSCraig Topperentry:
384faa326deSCraig Topper %and = and i8 %cond, 1
385faa326deSCraig Topper %cmp10 = icmp ne i8 %and, 1
386faa326deSCraig Topper %0 = or i32 %B, %A
387faa326deSCraig Topper %1 = select i1 %cmp10, i32 %A, i32 %0
388faa326deSCraig Topper ret i32 %1
389faa326deSCraig Topper}
390faa326deSCraig Topper
391faa326deSCraig Topperdefine i32 @select_or_1(i32 %A, i32 %B, i32 %cond) {
392faa326deSCraig Topper; NOCMOV-LABEL: select_or_1:
393faa326deSCraig Topper; NOCMOV:       # %bb.0: # %entry
394faa326deSCraig Topper; NOCMOV-NEXT:    slli a2, a2, 63
395faa326deSCraig Topper; NOCMOV-NEXT:    srai a2, a2, 63
396faa326deSCraig Topper; NOCMOV-NEXT:    and a1, a1, a2
397faa326deSCraig Topper; NOCMOV-NEXT:    or a0, a0, a1
398faa326deSCraig Topper; NOCMOV-NEXT:    ret
399faa326deSCraig Topper;
400faa326deSCraig Topper; CMOV-LABEL: select_or_1:
401faa326deSCraig Topper; CMOV:       # %bb.0: # %entry
402faa326deSCraig Topper; CMOV-NEXT:    andi a2, a2, 1
403faa326deSCraig Topper; CMOV-NEXT:    or a1, a1, a0
404faa326deSCraig Topper; CMOV-NEXT:    beqz a2, .LBB10_2
405faa326deSCraig Topper; CMOV-NEXT:  # %bb.1: # %entry
406faa326deSCraig Topper; CMOV-NEXT:    mv a0, a1
407faa326deSCraig Topper; CMOV-NEXT:  .LBB10_2: # %entry
408faa326deSCraig Topper; CMOV-NEXT:    ret
409faa326deSCraig Topper;
410faa326deSCraig Topper; SFB-ZICOND-LABEL: select_or_1:
411faa326deSCraig Topper; SFB-ZICOND:       # %bb.0: # %entry
412faa326deSCraig Topper; SFB-ZICOND-NEXT:    andi a2, a2, 1
413faa326deSCraig Topper; SFB-ZICOND-NEXT:    beqz a2, .LBB10_2
414faa326deSCraig Topper; SFB-ZICOND-NEXT:  # %bb.1: # %entry
415faa326deSCraig Topper; SFB-ZICOND-NEXT:    or a0, a1, a0
416faa326deSCraig Topper; SFB-ZICOND-NEXT:  .LBB10_2: # %entry
417faa326deSCraig Topper; SFB-ZICOND-NEXT:    ret
418faa326deSCraig Topperentry:
419faa326deSCraig Topper %and = and i32 %cond, 1
420faa326deSCraig Topper %cmp10 = icmp eq i32 %and, 0
421faa326deSCraig Topper %0 = or i32 %B, %A
422faa326deSCraig Topper %1 = select i1 %cmp10, i32 %A, i32 %0
423faa326deSCraig Topper ret i32 %1
424faa326deSCraig Topper}
425faa326deSCraig Topper
426faa326deSCraig Topper; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of
427faa326deSCraig Topper; icmp eq (and %cond, 1), 0
428faa326deSCraig Topperdefine i32 @select_or_1b(i32 %A, i32 %B, i32 %cond) {
429faa326deSCraig Topper; NOCMOV-LABEL: select_or_1b:
430faa326deSCraig Topper; NOCMOV:       # %bb.0: # %entry
431faa326deSCraig Topper; NOCMOV-NEXT:    slli a2, a2, 63
432faa326deSCraig Topper; NOCMOV-NEXT:    srai a2, a2, 63
433faa326deSCraig Topper; NOCMOV-NEXT:    and a1, a1, a2
434faa326deSCraig Topper; NOCMOV-NEXT:    or a0, a0, a1
435faa326deSCraig Topper; NOCMOV-NEXT:    ret
436faa326deSCraig Topper;
437faa326deSCraig Topper; CMOV-LABEL: select_or_1b:
438faa326deSCraig Topper; CMOV:       # %bb.0: # %entry
439faa326deSCraig Topper; CMOV-NEXT:    andi a2, a2, 1
440faa326deSCraig Topper; CMOV-NEXT:    or a1, a1, a0
441faa326deSCraig Topper; CMOV-NEXT:    beqz a2, .LBB11_2
442faa326deSCraig Topper; CMOV-NEXT:  # %bb.1: # %entry
443faa326deSCraig Topper; CMOV-NEXT:    mv a0, a1
444faa326deSCraig Topper; CMOV-NEXT:  .LBB11_2: # %entry
445faa326deSCraig Topper; CMOV-NEXT:    ret
446faa326deSCraig Topper;
447faa326deSCraig Topper; SFB-ZICOND-LABEL: select_or_1b:
448faa326deSCraig Topper; SFB-ZICOND:       # %bb.0: # %entry
449faa326deSCraig Topper; SFB-ZICOND-NEXT:    andi a2, a2, 1
450faa326deSCraig Topper; SFB-ZICOND-NEXT:    beqz a2, .LBB11_2
451faa326deSCraig Topper; SFB-ZICOND-NEXT:  # %bb.1: # %entry
452faa326deSCraig Topper; SFB-ZICOND-NEXT:    or a0, a1, a0
453faa326deSCraig Topper; SFB-ZICOND-NEXT:  .LBB11_2: # %entry
454faa326deSCraig Topper; SFB-ZICOND-NEXT:    ret
455faa326deSCraig Topperentry:
456faa326deSCraig Topper %and = and i32 %cond, 1
457faa326deSCraig Topper %cmp10 = icmp ne i32 %and, 1
458faa326deSCraig Topper %0 = or i32 %B, %A
459faa326deSCraig Topper %1 = select i1 %cmp10, i32 %A, i32 %0
460faa326deSCraig Topper ret i32 %1
461faa326deSCraig Topper}
462