xref: /llvm-project/llvm/test/CodeGen/RISCV/overflow-intrinsics.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1d624b921SLiaoChunyu; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2d624b921SLiaoChunyu; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3d624b921SLiaoChunyu; RUN:   | FileCheck %s -check-prefixes=RV32
4d624b921SLiaoChunyu; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
5d624b921SLiaoChunyu; RUN:   | FileCheck %s -check-prefixes=RV64
6d624b921SLiaoChunyu
7d624b921SLiaoChunyu;Copy tests from llvm/tests/Transforms/CodeGenPrepare/X86/overflow-intrinsics.ll
8d624b921SLiaoChunyu;to test shouldFormOverflowOp on RISCV
9d624b921SLiaoChunyu
10d624b921SLiaoChunyudefine i64 @uaddo1_overflow_used(i64 %a, i64 %b) nounwind ssp {
11d624b921SLiaoChunyu; RV32-LABEL: uaddo1_overflow_used:
12d624b921SLiaoChunyu; RV32:       # %bb.0:
13d624b921SLiaoChunyu; RV32-NEXT:    add a5, a3, a1
14d624b921SLiaoChunyu; RV32-NEXT:    add a4, a2, a0
15d624b921SLiaoChunyu; RV32-NEXT:    sltu a6, a4, a2
16d624b921SLiaoChunyu; RV32-NEXT:    add a5, a5, a6
17d624b921SLiaoChunyu; RV32-NEXT:    beq a5, a1, .LBB0_2
18d624b921SLiaoChunyu; RV32-NEXT:  # %bb.1:
19d624b921SLiaoChunyu; RV32-NEXT:    sltu a0, a5, a1
20d624b921SLiaoChunyu; RV32-NEXT:    beqz a0, .LBB0_3
21d624b921SLiaoChunyu; RV32-NEXT:    j .LBB0_4
22d624b921SLiaoChunyu; RV32-NEXT:  .LBB0_2:
23d624b921SLiaoChunyu; RV32-NEXT:    sltu a0, a4, a0
24d624b921SLiaoChunyu; RV32-NEXT:    bnez a0, .LBB0_4
25d624b921SLiaoChunyu; RV32-NEXT:  .LBB0_3:
26d624b921SLiaoChunyu; RV32-NEXT:    li a2, 42
27d624b921SLiaoChunyu; RV32-NEXT:  .LBB0_4:
28d624b921SLiaoChunyu; RV32-NEXT:    neg a1, a0
29d624b921SLiaoChunyu; RV32-NEXT:    and a1, a1, a3
30d624b921SLiaoChunyu; RV32-NEXT:    mv a0, a2
31d624b921SLiaoChunyu; RV32-NEXT:    ret
32d624b921SLiaoChunyu;
33d624b921SLiaoChunyu; RV64-LABEL: uaddo1_overflow_used:
34d624b921SLiaoChunyu; RV64:       # %bb.0:
35d624b921SLiaoChunyu; RV64-NEXT:    add a2, a1, a0
36d624b921SLiaoChunyu; RV64-NEXT:    bltu a2, a0, .LBB0_2
37d624b921SLiaoChunyu; RV64-NEXT:  # %bb.1:
38d624b921SLiaoChunyu; RV64-NEXT:    li a1, 42
39d624b921SLiaoChunyu; RV64-NEXT:  .LBB0_2:
40d624b921SLiaoChunyu; RV64-NEXT:    mv a0, a1
41d624b921SLiaoChunyu; RV64-NEXT:    ret
42d624b921SLiaoChunyu  %add = add i64 %b, %a
43d624b921SLiaoChunyu  %cmp = icmp ult i64 %add, %a
44d624b921SLiaoChunyu  %Q = select i1 %cmp, i64 %b, i64 42
45d624b921SLiaoChunyu  ret i64 %Q
46d624b921SLiaoChunyu}
47d624b921SLiaoChunyu
48d624b921SLiaoChunyudefine i64 @uaddo1_math_overflow_used(i64 %a, i64 %b, ptr %res) nounwind ssp {
49d624b921SLiaoChunyu; RV32-LABEL: uaddo1_math_overflow_used:
50d624b921SLiaoChunyu; RV32:       # %bb.0:
51d624b921SLiaoChunyu; RV32-NEXT:    add a5, a3, a1
52d624b921SLiaoChunyu; RV32-NEXT:    add a0, a2, a0
53d624b921SLiaoChunyu; RV32-NEXT:    sltu a1, a0, a2
54d624b921SLiaoChunyu; RV32-NEXT:    add a5, a5, a1
55d624b921SLiaoChunyu; RV32-NEXT:    beq a5, a3, .LBB1_2
56d624b921SLiaoChunyu; RV32-NEXT:  # %bb.1:
57d624b921SLiaoChunyu; RV32-NEXT:    sltu a1, a5, a3
58d624b921SLiaoChunyu; RV32-NEXT:  .LBB1_2:
59d624b921SLiaoChunyu; RV32-NEXT:    bnez a1, .LBB1_4
60d624b921SLiaoChunyu; RV32-NEXT:  # %bb.3:
61d624b921SLiaoChunyu; RV32-NEXT:    li a2, 42
62d624b921SLiaoChunyu; RV32-NEXT:  .LBB1_4:
63d624b921SLiaoChunyu; RV32-NEXT:    neg a1, a1
64d624b921SLiaoChunyu; RV32-NEXT:    and a1, a1, a3
65d624b921SLiaoChunyu; RV32-NEXT:    sw a0, 0(a4)
66d624b921SLiaoChunyu; RV32-NEXT:    sw a5, 4(a4)
67d624b921SLiaoChunyu; RV32-NEXT:    mv a0, a2
68d624b921SLiaoChunyu; RV32-NEXT:    ret
69d624b921SLiaoChunyu;
70d624b921SLiaoChunyu; RV64-LABEL: uaddo1_math_overflow_used:
71d624b921SLiaoChunyu; RV64:       # %bb.0:
72d624b921SLiaoChunyu; RV64-NEXT:    add a0, a1, a0
73d624b921SLiaoChunyu; RV64-NEXT:    bltu a0, a1, .LBB1_2
74d624b921SLiaoChunyu; RV64-NEXT:  # %bb.1:
75d624b921SLiaoChunyu; RV64-NEXT:    li a1, 42
76d624b921SLiaoChunyu; RV64-NEXT:  .LBB1_2:
77d624b921SLiaoChunyu; RV64-NEXT:    sd a0, 0(a2)
78d624b921SLiaoChunyu; RV64-NEXT:    mv a0, a1
79d624b921SLiaoChunyu; RV64-NEXT:    ret
80d624b921SLiaoChunyu  %add = add i64 %b, %a
81d624b921SLiaoChunyu  %cmp = icmp ult i64 %add, %a
82d624b921SLiaoChunyu  %Q = select i1 %cmp, i64 %b, i64 42
83d624b921SLiaoChunyu  store i64 %add, ptr %res
84d624b921SLiaoChunyu  ret i64 %Q
85d624b921SLiaoChunyu}
86d624b921SLiaoChunyu
87d624b921SLiaoChunyudefine i64 @uaddo2_overflow_used(i64 %a, i64 %b) nounwind ssp {
88d624b921SLiaoChunyu; RV32-LABEL: uaddo2_overflow_used:
89d624b921SLiaoChunyu; RV32:       # %bb.0:
90d624b921SLiaoChunyu; RV32-NEXT:    add a1, a3, a1
91d624b921SLiaoChunyu; RV32-NEXT:    add a0, a2, a0
92d624b921SLiaoChunyu; RV32-NEXT:    sltu a0, a0, a2
93d624b921SLiaoChunyu; RV32-NEXT:    add a1, a1, a0
94d624b921SLiaoChunyu; RV32-NEXT:    beq a1, a3, .LBB2_2
95d624b921SLiaoChunyu; RV32-NEXT:  # %bb.1:
96d624b921SLiaoChunyu; RV32-NEXT:    sltu a0, a1, a3
97d624b921SLiaoChunyu; RV32-NEXT:  .LBB2_2:
98d624b921SLiaoChunyu; RV32-NEXT:    bnez a0, .LBB2_4
99d624b921SLiaoChunyu; RV32-NEXT:  # %bb.3:
100d624b921SLiaoChunyu; RV32-NEXT:    li a2, 42
101d624b921SLiaoChunyu; RV32-NEXT:  .LBB2_4:
102d624b921SLiaoChunyu; RV32-NEXT:    neg a1, a0
103d624b921SLiaoChunyu; RV32-NEXT:    and a1, a1, a3
104d624b921SLiaoChunyu; RV32-NEXT:    mv a0, a2
105d624b921SLiaoChunyu; RV32-NEXT:    ret
106d624b921SLiaoChunyu;
107d624b921SLiaoChunyu; RV64-LABEL: uaddo2_overflow_used:
108d624b921SLiaoChunyu; RV64:       # %bb.0:
109d624b921SLiaoChunyu; RV64-NEXT:    add a0, a1, a0
110d624b921SLiaoChunyu; RV64-NEXT:    bltu a0, a1, .LBB2_2
111d624b921SLiaoChunyu; RV64-NEXT:  # %bb.1:
112d624b921SLiaoChunyu; RV64-NEXT:    li a1, 42
113d624b921SLiaoChunyu; RV64-NEXT:  .LBB2_2:
114d624b921SLiaoChunyu; RV64-NEXT:    mv a0, a1
115d624b921SLiaoChunyu; RV64-NEXT:    ret
116d624b921SLiaoChunyu  %add = add i64 %b, %a
117d624b921SLiaoChunyu  %cmp = icmp ult i64 %add, %b
118d624b921SLiaoChunyu  %Q = select i1 %cmp, i64 %b, i64 42
119d624b921SLiaoChunyu  ret i64 %Q
120d624b921SLiaoChunyu}
121d624b921SLiaoChunyu
122d624b921SLiaoChunyudefine i64 @uaddo2_math_overflow_used(i64 %a, i64 %b, ptr %res) nounwind ssp {
123d624b921SLiaoChunyu; RV32-LABEL: uaddo2_math_overflow_used:
124d624b921SLiaoChunyu; RV32:       # %bb.0:
125d624b921SLiaoChunyu; RV32-NEXT:    add a5, a3, a1
126d624b921SLiaoChunyu; RV32-NEXT:    add a0, a2, a0
127d624b921SLiaoChunyu; RV32-NEXT:    sltu a1, a0, a2
128d624b921SLiaoChunyu; RV32-NEXT:    add a5, a5, a1
129d624b921SLiaoChunyu; RV32-NEXT:    beq a5, a3, .LBB3_2
130d624b921SLiaoChunyu; RV32-NEXT:  # %bb.1:
131d624b921SLiaoChunyu; RV32-NEXT:    sltu a1, a5, a3
132d624b921SLiaoChunyu; RV32-NEXT:  .LBB3_2:
133d624b921SLiaoChunyu; RV32-NEXT:    bnez a1, .LBB3_4
134d624b921SLiaoChunyu; RV32-NEXT:  # %bb.3:
135d624b921SLiaoChunyu; RV32-NEXT:    li a2, 42
136d624b921SLiaoChunyu; RV32-NEXT:  .LBB3_4:
137d624b921SLiaoChunyu; RV32-NEXT:    neg a1, a1
138d624b921SLiaoChunyu; RV32-NEXT:    and a1, a1, a3
139d624b921SLiaoChunyu; RV32-NEXT:    sw a0, 0(a4)
140d624b921SLiaoChunyu; RV32-NEXT:    sw a5, 4(a4)
141d624b921SLiaoChunyu; RV32-NEXT:    mv a0, a2
142d624b921SLiaoChunyu; RV32-NEXT:    ret
143d624b921SLiaoChunyu;
144d624b921SLiaoChunyu; RV64-LABEL: uaddo2_math_overflow_used:
145d624b921SLiaoChunyu; RV64:       # %bb.0:
146d624b921SLiaoChunyu; RV64-NEXT:    add a0, a1, a0
147d624b921SLiaoChunyu; RV64-NEXT:    bltu a0, a1, .LBB3_2
148d624b921SLiaoChunyu; RV64-NEXT:  # %bb.1:
149d624b921SLiaoChunyu; RV64-NEXT:    li a1, 42
150d624b921SLiaoChunyu; RV64-NEXT:  .LBB3_2:
151d624b921SLiaoChunyu; RV64-NEXT:    sd a0, 0(a2)
152d624b921SLiaoChunyu; RV64-NEXT:    mv a0, a1
153d624b921SLiaoChunyu; RV64-NEXT:    ret
154d624b921SLiaoChunyu  %add = add i64 %b, %a
155d624b921SLiaoChunyu  %cmp = icmp ult i64 %add, %b
156d624b921SLiaoChunyu  %Q = select i1 %cmp, i64 %b, i64 42
157d624b921SLiaoChunyu  store i64 %add, ptr %res
158d624b921SLiaoChunyu  ret i64 %Q
159d624b921SLiaoChunyu}
160d624b921SLiaoChunyu
161d624b921SLiaoChunyudefine i64 @uaddo3_overflow_used(i64 %a, i64 %b) nounwind ssp {
162d624b921SLiaoChunyu; RV32-LABEL: uaddo3_overflow_used:
163d624b921SLiaoChunyu; RV32:       # %bb.0:
164d624b921SLiaoChunyu; RV32-NEXT:    add a1, a3, a1
165d624b921SLiaoChunyu; RV32-NEXT:    add a0, a2, a0
166d624b921SLiaoChunyu; RV32-NEXT:    sltu a0, a0, a2
167d624b921SLiaoChunyu; RV32-NEXT:    add a1, a1, a0
168d624b921SLiaoChunyu; RV32-NEXT:    beq a3, a1, .LBB4_2
169d624b921SLiaoChunyu; RV32-NEXT:  # %bb.1:
170d624b921SLiaoChunyu; RV32-NEXT:    sltu a0, a1, a3
171d624b921SLiaoChunyu; RV32-NEXT:  .LBB4_2:
172d624b921SLiaoChunyu; RV32-NEXT:    bnez a0, .LBB4_4
173d624b921SLiaoChunyu; RV32-NEXT:  # %bb.3:
174d624b921SLiaoChunyu; RV32-NEXT:    li a2, 42
175d624b921SLiaoChunyu; RV32-NEXT:  .LBB4_4:
176d624b921SLiaoChunyu; RV32-NEXT:    neg a1, a0
177d624b921SLiaoChunyu; RV32-NEXT:    and a1, a1, a3
178d624b921SLiaoChunyu; RV32-NEXT:    mv a0, a2
179d624b921SLiaoChunyu; RV32-NEXT:    ret
180d624b921SLiaoChunyu;
181d624b921SLiaoChunyu; RV64-LABEL: uaddo3_overflow_used:
182d624b921SLiaoChunyu; RV64:       # %bb.0:
183d624b921SLiaoChunyu; RV64-NEXT:    add a0, a1, a0
184d624b921SLiaoChunyu; RV64-NEXT:    bltu a0, a1, .LBB4_2
185d624b921SLiaoChunyu; RV64-NEXT:  # %bb.1:
186d624b921SLiaoChunyu; RV64-NEXT:    li a1, 42
187d624b921SLiaoChunyu; RV64-NEXT:  .LBB4_2:
188d624b921SLiaoChunyu; RV64-NEXT:    mv a0, a1
189d624b921SLiaoChunyu; RV64-NEXT:    ret
190d624b921SLiaoChunyu  %add = add i64 %b, %a
191d624b921SLiaoChunyu  %cmp = icmp ugt i64 %b, %add
192d624b921SLiaoChunyu  %Q = select i1 %cmp, i64 %b, i64 42
193d624b921SLiaoChunyu  ret i64 %Q
194d624b921SLiaoChunyu}
195d624b921SLiaoChunyu
196d624b921SLiaoChunyudefine i64 @uaddo3_math_overflow_used(i64 %a, i64 %b, ptr %res) nounwind ssp {
197d624b921SLiaoChunyu; RV32-LABEL: uaddo3_math_overflow_used:
198d624b921SLiaoChunyu; RV32:       # %bb.0:
199d624b921SLiaoChunyu; RV32-NEXT:    add a5, a3, a1
200d624b921SLiaoChunyu; RV32-NEXT:    add a0, a2, a0
201d624b921SLiaoChunyu; RV32-NEXT:    sltu a1, a0, a2
202d624b921SLiaoChunyu; RV32-NEXT:    add a5, a5, a1
203d624b921SLiaoChunyu; RV32-NEXT:    beq a5, a3, .LBB5_2
204d624b921SLiaoChunyu; RV32-NEXT:  # %bb.1:
205d624b921SLiaoChunyu; RV32-NEXT:    sltu a1, a5, a3
206d624b921SLiaoChunyu; RV32-NEXT:  .LBB5_2:
207d624b921SLiaoChunyu; RV32-NEXT:    bnez a1, .LBB5_4
208d624b921SLiaoChunyu; RV32-NEXT:  # %bb.3:
209d624b921SLiaoChunyu; RV32-NEXT:    li a2, 42
210d624b921SLiaoChunyu; RV32-NEXT:  .LBB5_4:
211d624b921SLiaoChunyu; RV32-NEXT:    neg a1, a1
212d624b921SLiaoChunyu; RV32-NEXT:    and a1, a1, a3
213d624b921SLiaoChunyu; RV32-NEXT:    sw a0, 0(a4)
214d624b921SLiaoChunyu; RV32-NEXT:    sw a5, 4(a4)
215d624b921SLiaoChunyu; RV32-NEXT:    mv a0, a2
216d624b921SLiaoChunyu; RV32-NEXT:    ret
217d624b921SLiaoChunyu;
218d624b921SLiaoChunyu; RV64-LABEL: uaddo3_math_overflow_used:
219d624b921SLiaoChunyu; RV64:       # %bb.0:
220d624b921SLiaoChunyu; RV64-NEXT:    add a0, a1, a0
221d624b921SLiaoChunyu; RV64-NEXT:    bltu a0, a1, .LBB5_2
222d624b921SLiaoChunyu; RV64-NEXT:  # %bb.1:
223d624b921SLiaoChunyu; RV64-NEXT:    li a1, 42
224d624b921SLiaoChunyu; RV64-NEXT:  .LBB5_2:
225d624b921SLiaoChunyu; RV64-NEXT:    sd a0, 0(a2)
226d624b921SLiaoChunyu; RV64-NEXT:    mv a0, a1
227d624b921SLiaoChunyu; RV64-NEXT:    ret
228d624b921SLiaoChunyu  %add = add i64 %b, %a
229d624b921SLiaoChunyu  %cmp = icmp ugt i64 %b, %add
230d624b921SLiaoChunyu  %Q = select i1 %cmp, i64 %b, i64 42
231d624b921SLiaoChunyu  store i64 %add, ptr %res
232d624b921SLiaoChunyu  ret i64 %Q
233d624b921SLiaoChunyu}
234d624b921SLiaoChunyu
235d624b921SLiaoChunyu; TODO? CGP sinks the compare before we have a chance to form the overflow intrinsic.
236d624b921SLiaoChunyu
237d624b921SLiaoChunyudefine i64 @uaddo4(i64 %a, i64 %b, i1 %c) nounwind ssp {
238d624b921SLiaoChunyu; RV32-LABEL: uaddo4:
239d624b921SLiaoChunyu; RV32:       # %bb.0: # %entry
240d624b921SLiaoChunyu; RV32-NEXT:    andi a4, a4, 1
241d624b921SLiaoChunyu; RV32-NEXT:    beqz a4, .LBB6_6
242d624b921SLiaoChunyu; RV32-NEXT:  # %bb.1: # %next
243d624b921SLiaoChunyu; RV32-NEXT:    add a1, a3, a1
244d624b921SLiaoChunyu; RV32-NEXT:    add a0, a2, a0
245d624b921SLiaoChunyu; RV32-NEXT:    sltu a0, a0, a2
246d624b921SLiaoChunyu; RV32-NEXT:    add a1, a1, a0
247d624b921SLiaoChunyu; RV32-NEXT:    beq a3, a1, .LBB6_3
248d624b921SLiaoChunyu; RV32-NEXT:  # %bb.2: # %next
249d624b921SLiaoChunyu; RV32-NEXT:    sltu a0, a1, a3
250d624b921SLiaoChunyu; RV32-NEXT:  .LBB6_3: # %next
251d624b921SLiaoChunyu; RV32-NEXT:    bnez a0, .LBB6_5
252d624b921SLiaoChunyu; RV32-NEXT:  # %bb.4: # %next
253d624b921SLiaoChunyu; RV32-NEXT:    li a2, 42
254d624b921SLiaoChunyu; RV32-NEXT:  .LBB6_5: # %next
255d624b921SLiaoChunyu; RV32-NEXT:    neg a1, a0
256d624b921SLiaoChunyu; RV32-NEXT:    and a1, a1, a3
257d624b921SLiaoChunyu; RV32-NEXT:    mv a0, a2
258d624b921SLiaoChunyu; RV32-NEXT:    ret
259d624b921SLiaoChunyu; RV32-NEXT:  .LBB6_6: # %exit
260d624b921SLiaoChunyu; RV32-NEXT:    li a0, 0
261d624b921SLiaoChunyu; RV32-NEXT:    li a1, 0
262d624b921SLiaoChunyu; RV32-NEXT:    ret
263d624b921SLiaoChunyu;
264d624b921SLiaoChunyu; RV64-LABEL: uaddo4:
265d624b921SLiaoChunyu; RV64:       # %bb.0: # %entry
266d624b921SLiaoChunyu; RV64-NEXT:    andi a2, a2, 1
267d624b921SLiaoChunyu; RV64-NEXT:    beqz a2, .LBB6_4
268d624b921SLiaoChunyu; RV64-NEXT:  # %bb.1: # %next
269d624b921SLiaoChunyu; RV64-NEXT:    add a0, a1, a0
270d624b921SLiaoChunyu; RV64-NEXT:    bltu a0, a1, .LBB6_3
271d624b921SLiaoChunyu; RV64-NEXT:  # %bb.2: # %next
272d624b921SLiaoChunyu; RV64-NEXT:    li a1, 42
273d624b921SLiaoChunyu; RV64-NEXT:  .LBB6_3: # %next
274d624b921SLiaoChunyu; RV64-NEXT:    mv a0, a1
275d624b921SLiaoChunyu; RV64-NEXT:    ret
276d624b921SLiaoChunyu; RV64-NEXT:  .LBB6_4: # %exit
277d624b921SLiaoChunyu; RV64-NEXT:    li a0, 0
278d624b921SLiaoChunyu; RV64-NEXT:    ret
279d624b921SLiaoChunyuentry:
280d624b921SLiaoChunyu  %add = add i64 %b, %a
281d624b921SLiaoChunyu  %cmp = icmp ugt i64 %b, %add
282d624b921SLiaoChunyu  br i1 %c, label %next, label %exit
283d624b921SLiaoChunyu
284d624b921SLiaoChunyunext:
285d624b921SLiaoChunyu  %Q = select i1 %cmp, i64 %b, i64 42
286d624b921SLiaoChunyu  ret i64 %Q
287d624b921SLiaoChunyu
288d624b921SLiaoChunyuexit:
289d624b921SLiaoChunyu  ret i64 0
290d624b921SLiaoChunyu}
291d624b921SLiaoChunyu
292d624b921SLiaoChunyudefine i64 @uaddo5(i64 %a, i64 %b, ptr %ptr, i1 %c) nounwind ssp {
293d624b921SLiaoChunyu; RV32-LABEL: uaddo5:
294d624b921SLiaoChunyu; RV32:       # %bb.0: # %entry
295d624b921SLiaoChunyu; RV32-NEXT:    andi a5, a5, 1
296d624b921SLiaoChunyu; RV32-NEXT:    add a1, a3, a1
297d624b921SLiaoChunyu; RV32-NEXT:    add a6, a2, a0
298d624b921SLiaoChunyu; RV32-NEXT:    sltu a0, a6, a2
299d624b921SLiaoChunyu; RV32-NEXT:    add a1, a1, a0
300d624b921SLiaoChunyu; RV32-NEXT:    sw a6, 0(a4)
301d624b921SLiaoChunyu; RV32-NEXT:    sw a1, 4(a4)
302d624b921SLiaoChunyu; RV32-NEXT:    beqz a5, .LBB7_6
303d624b921SLiaoChunyu; RV32-NEXT:  # %bb.1: # %next
304d624b921SLiaoChunyu; RV32-NEXT:    beq a3, a1, .LBB7_3
305d624b921SLiaoChunyu; RV32-NEXT:  # %bb.2: # %next
306d624b921SLiaoChunyu; RV32-NEXT:    sltu a0, a1, a3
307d624b921SLiaoChunyu; RV32-NEXT:  .LBB7_3: # %next
308d624b921SLiaoChunyu; RV32-NEXT:    bnez a0, .LBB7_5
309d624b921SLiaoChunyu; RV32-NEXT:  # %bb.4: # %next
310d624b921SLiaoChunyu; RV32-NEXT:    li a2, 42
311d624b921SLiaoChunyu; RV32-NEXT:  .LBB7_5: # %next
312d624b921SLiaoChunyu; RV32-NEXT:    neg a1, a0
313d624b921SLiaoChunyu; RV32-NEXT:    and a1, a1, a3
314d624b921SLiaoChunyu; RV32-NEXT:    mv a0, a2
315d624b921SLiaoChunyu; RV32-NEXT:    ret
316d624b921SLiaoChunyu; RV32-NEXT:  .LBB7_6: # %exit
317d624b921SLiaoChunyu; RV32-NEXT:    li a0, 0
318d624b921SLiaoChunyu; RV32-NEXT:    li a1, 0
319d624b921SLiaoChunyu; RV32-NEXT:    ret
320d624b921SLiaoChunyu;
321d624b921SLiaoChunyu; RV64-LABEL: uaddo5:
322d624b921SLiaoChunyu; RV64:       # %bb.0: # %entry
323d624b921SLiaoChunyu; RV64-NEXT:    andi a3, a3, 1
324d624b921SLiaoChunyu; RV64-NEXT:    add a0, a1, a0
325d624b921SLiaoChunyu; RV64-NEXT:    sd a0, 0(a2)
326d624b921SLiaoChunyu; RV64-NEXT:    beqz a3, .LBB7_4
327d624b921SLiaoChunyu; RV64-NEXT:  # %bb.1: # %next
328d624b921SLiaoChunyu; RV64-NEXT:    bltu a0, a1, .LBB7_3
329d624b921SLiaoChunyu; RV64-NEXT:  # %bb.2: # %next
330d624b921SLiaoChunyu; RV64-NEXT:    li a1, 42
331d624b921SLiaoChunyu; RV64-NEXT:  .LBB7_3: # %next
332d624b921SLiaoChunyu; RV64-NEXT:    mv a0, a1
333d624b921SLiaoChunyu; RV64-NEXT:    ret
334d624b921SLiaoChunyu; RV64-NEXT:  .LBB7_4: # %exit
335d624b921SLiaoChunyu; RV64-NEXT:    li a0, 0
336d624b921SLiaoChunyu; RV64-NEXT:    ret
337d624b921SLiaoChunyuentry:
338d624b921SLiaoChunyu  %add = add i64 %b, %a
339d624b921SLiaoChunyu  store i64 %add, ptr %ptr
340d624b921SLiaoChunyu  %cmp = icmp ugt i64 %b, %add
341d624b921SLiaoChunyu  br i1 %c, label %next, label %exit
342d624b921SLiaoChunyu
343d624b921SLiaoChunyunext:
344d624b921SLiaoChunyu  %Q = select i1 %cmp, i64 %b, i64 42
345d624b921SLiaoChunyu  ret i64 %Q
346d624b921SLiaoChunyu
347d624b921SLiaoChunyuexit:
348d624b921SLiaoChunyu  ret i64 0
349d624b921SLiaoChunyu}
350d624b921SLiaoChunyu
351d624b921SLiaoChunyu; Instcombine folds (a + b <u a)  to (a ^ -1 <u b). Make sure we match this
352d624b921SLiaoChunyu; pattern as well.
353d624b921SLiaoChunyudefine i64 @uaddo6_xor(i64 %a, i64 %b) {
354d624b921SLiaoChunyu; RV32-LABEL: uaddo6_xor:
355d624b921SLiaoChunyu; RV32:       # %bb.0:
356d624b921SLiaoChunyu; RV32-NEXT:    not a1, a1
357d624b921SLiaoChunyu; RV32-NEXT:    beq a1, a3, .LBB8_2
358d624b921SLiaoChunyu; RV32-NEXT:  # %bb.1:
359d624b921SLiaoChunyu; RV32-NEXT:    sltu a0, a1, a3
360d624b921SLiaoChunyu; RV32-NEXT:    beqz a0, .LBB8_3
361d624b921SLiaoChunyu; RV32-NEXT:    j .LBB8_4
362d624b921SLiaoChunyu; RV32-NEXT:  .LBB8_2:
363d624b921SLiaoChunyu; RV32-NEXT:    not a0, a0
364d624b921SLiaoChunyu; RV32-NEXT:    sltu a0, a0, a2
365d624b921SLiaoChunyu; RV32-NEXT:    bnez a0, .LBB8_4
366d624b921SLiaoChunyu; RV32-NEXT:  .LBB8_3:
367d624b921SLiaoChunyu; RV32-NEXT:    li a2, 42
368d624b921SLiaoChunyu; RV32-NEXT:  .LBB8_4:
369d624b921SLiaoChunyu; RV32-NEXT:    neg a1, a0
370d624b921SLiaoChunyu; RV32-NEXT:    and a1, a1, a3
371d624b921SLiaoChunyu; RV32-NEXT:    mv a0, a2
372d624b921SLiaoChunyu; RV32-NEXT:    ret
373d624b921SLiaoChunyu;
374d624b921SLiaoChunyu; RV64-LABEL: uaddo6_xor:
375d624b921SLiaoChunyu; RV64:       # %bb.0:
376d624b921SLiaoChunyu; RV64-NEXT:    not a2, a0
377d624b921SLiaoChunyu; RV64-NEXT:    mv a0, a1
378d624b921SLiaoChunyu; RV64-NEXT:    bltu a2, a1, .LBB8_2
379d624b921SLiaoChunyu; RV64-NEXT:  # %bb.1:
380d624b921SLiaoChunyu; RV64-NEXT:    li a0, 42
381d624b921SLiaoChunyu; RV64-NEXT:  .LBB8_2:
382d624b921SLiaoChunyu; RV64-NEXT:    ret
383d624b921SLiaoChunyu  %x = xor i64 %a, -1
384d624b921SLiaoChunyu  %cmp = icmp ult i64 %x, %b
385d624b921SLiaoChunyu  %Q = select i1 %cmp, i64 %b, i64 42
386d624b921SLiaoChunyu  ret i64 %Q
387d624b921SLiaoChunyu}
388d624b921SLiaoChunyu
389d624b921SLiaoChunyudefine i64 @uaddo6_xor_commuted(i64 %a, i64 %b) {
390d624b921SLiaoChunyu; RV32-LABEL: uaddo6_xor_commuted:
391d624b921SLiaoChunyu; RV32:       # %bb.0:
392d624b921SLiaoChunyu; RV32-NEXT:    not a1, a1
393d624b921SLiaoChunyu; RV32-NEXT:    beq a1, a3, .LBB9_2
394d624b921SLiaoChunyu; RV32-NEXT:  # %bb.1:
395d624b921SLiaoChunyu; RV32-NEXT:    sltu a0, a1, a3
396d624b921SLiaoChunyu; RV32-NEXT:    beqz a0, .LBB9_3
397d624b921SLiaoChunyu; RV32-NEXT:    j .LBB9_4
398d624b921SLiaoChunyu; RV32-NEXT:  .LBB9_2:
399d624b921SLiaoChunyu; RV32-NEXT:    not a0, a0
400d624b921SLiaoChunyu; RV32-NEXT:    sltu a0, a0, a2
401d624b921SLiaoChunyu; RV32-NEXT:    bnez a0, .LBB9_4
402d624b921SLiaoChunyu; RV32-NEXT:  .LBB9_3:
403d624b921SLiaoChunyu; RV32-NEXT:    li a2, 42
404d624b921SLiaoChunyu; RV32-NEXT:  .LBB9_4:
405d624b921SLiaoChunyu; RV32-NEXT:    neg a1, a0
406d624b921SLiaoChunyu; RV32-NEXT:    and a1, a1, a3
407d624b921SLiaoChunyu; RV32-NEXT:    mv a0, a2
408d624b921SLiaoChunyu; RV32-NEXT:    ret
409d624b921SLiaoChunyu;
410d624b921SLiaoChunyu; RV64-LABEL: uaddo6_xor_commuted:
411d624b921SLiaoChunyu; RV64:       # %bb.0:
412d624b921SLiaoChunyu; RV64-NEXT:    not a2, a0
413d624b921SLiaoChunyu; RV64-NEXT:    mv a0, a1
414d624b921SLiaoChunyu; RV64-NEXT:    bltu a2, a1, .LBB9_2
415d624b921SLiaoChunyu; RV64-NEXT:  # %bb.1:
416d624b921SLiaoChunyu; RV64-NEXT:    li a0, 42
417d624b921SLiaoChunyu; RV64-NEXT:  .LBB9_2:
418d624b921SLiaoChunyu; RV64-NEXT:    ret
419d624b921SLiaoChunyu  %x = xor i64 %a, -1
420d624b921SLiaoChunyu  %cmp = icmp ult i64 %x, %b
421d624b921SLiaoChunyu  %Q = select i1 %cmp, i64 %b, i64 42
422d624b921SLiaoChunyu  ret i64 %Q
423d624b921SLiaoChunyu}
424d624b921SLiaoChunyu
425d624b921SLiaoChunyudeclare void @use(i64)
426d624b921SLiaoChunyu
427d624b921SLiaoChunyudefine i64 @uaddo6_xor_multi_use(i64 %a, i64 %b) {
428d624b921SLiaoChunyu; RV32-LABEL: uaddo6_xor_multi_use:
429d624b921SLiaoChunyu; RV32:       # %bb.0:
430d624b921SLiaoChunyu; RV32-NEXT:    addi sp, sp, -16
431d624b921SLiaoChunyu; RV32-NEXT:    .cfi_def_cfa_offset 16
432d624b921SLiaoChunyu; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
433d624b921SLiaoChunyu; RV32-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
434d624b921SLiaoChunyu; RV32-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
435d624b921SLiaoChunyu; RV32-NEXT:    .cfi_offset ra, -4
436d624b921SLiaoChunyu; RV32-NEXT:    .cfi_offset s0, -8
437d624b921SLiaoChunyu; RV32-NEXT:    .cfi_offset s1, -12
438d624b921SLiaoChunyu; RV32-NEXT:    mv s0, a2
439d624b921SLiaoChunyu; RV32-NEXT:    not a1, a1
440d624b921SLiaoChunyu; RV32-NEXT:    not a0, a0
441d624b921SLiaoChunyu; RV32-NEXT:    beq a1, a3, .LBB10_2
442d624b921SLiaoChunyu; RV32-NEXT:  # %bb.1:
443d624b921SLiaoChunyu; RV32-NEXT:    sltu a2, a1, a3
444d624b921SLiaoChunyu; RV32-NEXT:    beqz a2, .LBB10_3
445d624b921SLiaoChunyu; RV32-NEXT:    j .LBB10_4
446d624b921SLiaoChunyu; RV32-NEXT:  .LBB10_2:
447d624b921SLiaoChunyu; RV32-NEXT:    sltu a2, a0, s0
448d624b921SLiaoChunyu; RV32-NEXT:    bnez a2, .LBB10_4
449d624b921SLiaoChunyu; RV32-NEXT:  .LBB10_3:
450d624b921SLiaoChunyu; RV32-NEXT:    li s0, 42
451d624b921SLiaoChunyu; RV32-NEXT:  .LBB10_4:
452d624b921SLiaoChunyu; RV32-NEXT:    neg s1, a2
453d624b921SLiaoChunyu; RV32-NEXT:    and s1, s1, a3
454eabaee0cSFangrui Song; RV32-NEXT:    call use
455d624b921SLiaoChunyu; RV32-NEXT:    mv a0, s0
456d624b921SLiaoChunyu; RV32-NEXT:    mv a1, s1
457d624b921SLiaoChunyu; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
458d624b921SLiaoChunyu; RV32-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
459d624b921SLiaoChunyu; RV32-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
46097982a8cSdlav-sc; RV32-NEXT:    .cfi_restore ra
46197982a8cSdlav-sc; RV32-NEXT:    .cfi_restore s0
46297982a8cSdlav-sc; RV32-NEXT:    .cfi_restore s1
463d624b921SLiaoChunyu; RV32-NEXT:    addi sp, sp, 16
46497982a8cSdlav-sc; RV32-NEXT:    .cfi_def_cfa_offset 0
465d624b921SLiaoChunyu; RV32-NEXT:    ret
466d624b921SLiaoChunyu;
467d624b921SLiaoChunyu; RV64-LABEL: uaddo6_xor_multi_use:
468d624b921SLiaoChunyu; RV64:       # %bb.0:
469d624b921SLiaoChunyu; RV64-NEXT:    addi sp, sp, -16
470d624b921SLiaoChunyu; RV64-NEXT:    .cfi_def_cfa_offset 16
471d624b921SLiaoChunyu; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
472d624b921SLiaoChunyu; RV64-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
473d624b921SLiaoChunyu; RV64-NEXT:    .cfi_offset ra, -8
474d624b921SLiaoChunyu; RV64-NEXT:    .cfi_offset s0, -16
475d624b921SLiaoChunyu; RV64-NEXT:    not a0, a0
476d624b921SLiaoChunyu; RV64-NEXT:    mv s0, a1
477d624b921SLiaoChunyu; RV64-NEXT:    bltu a0, a1, .LBB10_2
478d624b921SLiaoChunyu; RV64-NEXT:  # %bb.1:
479d624b921SLiaoChunyu; RV64-NEXT:    li s0, 42
480d624b921SLiaoChunyu; RV64-NEXT:  .LBB10_2:
481eabaee0cSFangrui Song; RV64-NEXT:    call use
482d624b921SLiaoChunyu; RV64-NEXT:    mv a0, s0
483d624b921SLiaoChunyu; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
484d624b921SLiaoChunyu; RV64-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
48597982a8cSdlav-sc; RV64-NEXT:    .cfi_restore ra
48697982a8cSdlav-sc; RV64-NEXT:    .cfi_restore s0
487d624b921SLiaoChunyu; RV64-NEXT:    addi sp, sp, 16
48897982a8cSdlav-sc; RV64-NEXT:    .cfi_def_cfa_offset 0
489d624b921SLiaoChunyu; RV64-NEXT:    ret
490d624b921SLiaoChunyu  %x = xor i64 -1, %a
491d624b921SLiaoChunyu  %cmp = icmp ult i64 %x, %b
492d624b921SLiaoChunyu  %Q = select i1 %cmp, i64 %b, i64 42
493d624b921SLiaoChunyu  call void @use(i64 %x)
494d624b921SLiaoChunyu  ret i64 %Q
495d624b921SLiaoChunyu}
496d624b921SLiaoChunyu
497d624b921SLiaoChunyu; Make sure we do not use the XOR binary operator as insert point, as it may
498d624b921SLiaoChunyu; come before the second operand of the overflow intrinsic.
499d624b921SLiaoChunyudefine i1 @uaddo6_xor_op_after_XOR(i32 %a, ptr %b.ptr) {
500d624b921SLiaoChunyu; RV32-LABEL: uaddo6_xor_op_after_XOR:
501d624b921SLiaoChunyu; RV32:       # %bb.0:
502d624b921SLiaoChunyu; RV32-NEXT:    lw a1, 0(a1)
503d624b921SLiaoChunyu; RV32-NEXT:    not a0, a0
504d624b921SLiaoChunyu; RV32-NEXT:    sltu a0, a0, a1
505d624b921SLiaoChunyu; RV32-NEXT:    xori a0, a0, 1
506d624b921SLiaoChunyu; RV32-NEXT:    ret
507d624b921SLiaoChunyu;
508d624b921SLiaoChunyu; RV64-LABEL: uaddo6_xor_op_after_XOR:
509d624b921SLiaoChunyu; RV64:       # %bb.0:
510d624b921SLiaoChunyu; RV64-NEXT:    lw a1, 0(a1)
511d624b921SLiaoChunyu; RV64-NEXT:    not a0, a0
512d624b921SLiaoChunyu; RV64-NEXT:    sext.w a0, a0
513d624b921SLiaoChunyu; RV64-NEXT:    sltu a0, a0, a1
514d624b921SLiaoChunyu; RV64-NEXT:    xori a0, a0, 1
515d624b921SLiaoChunyu; RV64-NEXT:    ret
516d624b921SLiaoChunyu  %x = xor i32 %a, -1
517d624b921SLiaoChunyu  %b = load i32, ptr %b.ptr, align 8
518d624b921SLiaoChunyu  %cmp14 = icmp ugt i32 %b, %x
519d624b921SLiaoChunyu  %ov = xor i1 %cmp14, true
520d624b921SLiaoChunyu  ret i1 %ov
521d624b921SLiaoChunyu}
522d624b921SLiaoChunyu
523d624b921SLiaoChunyu; When adding 1, the general pattern for add-overflow may be different due to icmp canonicalization.
524d624b921SLiaoChunyu; PR31754: https://bugs.llvm.org/show_bug.cgi?id=31754
525d624b921SLiaoChunyu
526d624b921SLiaoChunyudefine i1 @uaddo_i64_increment(i64 %x, ptr %p) {
527d624b921SLiaoChunyu; RV32-LABEL: uaddo_i64_increment:
528d624b921SLiaoChunyu; RV32:       # %bb.0:
5292fc5a511SCraig Topper; RV32-NEXT:    addi a3, a0, 1
530230e6165SCraig Topper; RV32-NEXT:    seqz a0, a3
5312fc5a511SCraig Topper; RV32-NEXT:    add a1, a1, a0
5322fc5a511SCraig Topper; RV32-NEXT:    or a0, a3, a1
5332fc5a511SCraig Topper; RV32-NEXT:    seqz a0, a0
5342fc5a511SCraig Topper; RV32-NEXT:    sw a3, 0(a2)
5352fc5a511SCraig Topper; RV32-NEXT:    sw a1, 4(a2)
536d624b921SLiaoChunyu; RV32-NEXT:    ret
537d624b921SLiaoChunyu;
538d624b921SLiaoChunyu; RV64-LABEL: uaddo_i64_increment:
539d624b921SLiaoChunyu; RV64:       # %bb.0:
540d624b921SLiaoChunyu; RV64-NEXT:    addi a2, a0, 1
541d624b921SLiaoChunyu; RV64-NEXT:    seqz a0, a2
542d624b921SLiaoChunyu; RV64-NEXT:    sd a2, 0(a1)
543d624b921SLiaoChunyu; RV64-NEXT:    ret
544d624b921SLiaoChunyu  %a = add i64 %x, 1
545d624b921SLiaoChunyu  %ov = icmp eq i64 %a, 0
546d624b921SLiaoChunyu  store i64 %a, ptr %p
547d624b921SLiaoChunyu  ret i1 %ov
548d624b921SLiaoChunyu}
549d624b921SLiaoChunyu
550d624b921SLiaoChunyudefine i1 @uaddo_i8_increment_noncanonical_1(i8 %x, ptr %p) {
551d624b921SLiaoChunyu; RV32-LABEL: uaddo_i8_increment_noncanonical_1:
552d624b921SLiaoChunyu; RV32:       # %bb.0:
553d624b921SLiaoChunyu; RV32-NEXT:    addi a2, a0, 1
554d624b921SLiaoChunyu; RV32-NEXT:    andi a0, a2, 255
555eb54254bSLiaoChunyu; RV32-NEXT:    seqz a0, a0
556d624b921SLiaoChunyu; RV32-NEXT:    sb a2, 0(a1)
557d624b921SLiaoChunyu; RV32-NEXT:    ret
558d624b921SLiaoChunyu;
559d624b921SLiaoChunyu; RV64-LABEL: uaddo_i8_increment_noncanonical_1:
560d624b921SLiaoChunyu; RV64:       # %bb.0:
56186240751SPhilip Reames; RV64-NEXT:    addi a2, a0, 1
562d624b921SLiaoChunyu; RV64-NEXT:    andi a0, a2, 255
563eb54254bSLiaoChunyu; RV64-NEXT:    seqz a0, a0
564d624b921SLiaoChunyu; RV64-NEXT:    sb a2, 0(a1)
565d624b921SLiaoChunyu; RV64-NEXT:    ret
566d624b921SLiaoChunyu  %a = add i8 1, %x        ; commute
567d624b921SLiaoChunyu  %ov = icmp eq i8 %a, 0
568d624b921SLiaoChunyu  store i8 %a, ptr %p
569d624b921SLiaoChunyu  ret i1 %ov
570d624b921SLiaoChunyu}
571d624b921SLiaoChunyu
572d624b921SLiaoChunyudefine i1 @uaddo_i32_increment_noncanonical_2(i32 %x, ptr %p) {
573d624b921SLiaoChunyu; RV32-LABEL: uaddo_i32_increment_noncanonical_2:
574d624b921SLiaoChunyu; RV32:       # %bb.0:
575d624b921SLiaoChunyu; RV32-NEXT:    addi a2, a0, 1
576d624b921SLiaoChunyu; RV32-NEXT:    seqz a0, a2
577d624b921SLiaoChunyu; RV32-NEXT:    sw a2, 0(a1)
578d624b921SLiaoChunyu; RV32-NEXT:    ret
579d624b921SLiaoChunyu;
580d624b921SLiaoChunyu; RV64-LABEL: uaddo_i32_increment_noncanonical_2:
581d624b921SLiaoChunyu; RV64:       # %bb.0:
582d624b921SLiaoChunyu; RV64-NEXT:    addiw a2, a0, 1
583d624b921SLiaoChunyu; RV64-NEXT:    seqz a0, a2
584d624b921SLiaoChunyu; RV64-NEXT:    sw a2, 0(a1)
585d624b921SLiaoChunyu; RV64-NEXT:    ret
586d624b921SLiaoChunyu  %a = add i32 %x, 1
587d624b921SLiaoChunyu  %ov = icmp eq i32 0, %a   ; commute
588d624b921SLiaoChunyu  store i32 %a, ptr %p
589d624b921SLiaoChunyu  ret i1 %ov
590d624b921SLiaoChunyu}
591d624b921SLiaoChunyu
592d624b921SLiaoChunyudefine i1 @uaddo_i16_increment_noncanonical_3(i16 %x, ptr %p) {
593d624b921SLiaoChunyu; RV32-LABEL: uaddo_i16_increment_noncanonical_3:
594d624b921SLiaoChunyu; RV32:       # %bb.0:
595eb54254bSLiaoChunyu; RV32-NEXT:    addi a2, a0, 1
596eb54254bSLiaoChunyu; RV32-NEXT:    slli a0, a2, 16
597eb54254bSLiaoChunyu; RV32-NEXT:    srli a0, a0, 16
598eb54254bSLiaoChunyu; RV32-NEXT:    seqz a0, a0
599eb54254bSLiaoChunyu; RV32-NEXT:    sh a2, 0(a1)
600d624b921SLiaoChunyu; RV32-NEXT:    ret
601d624b921SLiaoChunyu;
602d624b921SLiaoChunyu; RV64-LABEL: uaddo_i16_increment_noncanonical_3:
603d624b921SLiaoChunyu; RV64:       # %bb.0:
60486240751SPhilip Reames; RV64-NEXT:    addi a2, a0, 1
605eb54254bSLiaoChunyu; RV64-NEXT:    slli a0, a2, 48
606eb54254bSLiaoChunyu; RV64-NEXT:    srli a0, a0, 48
607eb54254bSLiaoChunyu; RV64-NEXT:    seqz a0, a0
608eb54254bSLiaoChunyu; RV64-NEXT:    sh a2, 0(a1)
609d624b921SLiaoChunyu; RV64-NEXT:    ret
610d624b921SLiaoChunyu  %a = add i16 1, %x        ; commute
611d624b921SLiaoChunyu  %ov = icmp eq i16 0, %a   ; commute
612d624b921SLiaoChunyu  store i16 %a, ptr %p
613d624b921SLiaoChunyu  ret i1 %ov
614d624b921SLiaoChunyu}
615d624b921SLiaoChunyu
616d624b921SLiaoChunyu; The overflow check may be against the input rather than the sum.
617d624b921SLiaoChunyu
618d624b921SLiaoChunyudefine i1 @uaddo_i64_increment_alt(i64 %x, ptr %p) {
619d624b921SLiaoChunyu; RV32-LABEL: uaddo_i64_increment_alt:
620d624b921SLiaoChunyu; RV32:       # %bb.0:
621d624b921SLiaoChunyu; RV32-NEXT:    addi a3, a0, 1
622697a28b3SCraig Topper; RV32-NEXT:    seqz a0, a3
623697a28b3SCraig Topper; RV32-NEXT:    add a1, a1, a0
624697a28b3SCraig Topper; RV32-NEXT:    or a0, a3, a1
625d624b921SLiaoChunyu; RV32-NEXT:    seqz a0, a0
626697a28b3SCraig Topper; RV32-NEXT:    sw a3, 0(a2)
627697a28b3SCraig Topper; RV32-NEXT:    sw a1, 4(a2)
628d624b921SLiaoChunyu; RV32-NEXT:    ret
629d624b921SLiaoChunyu;
630d624b921SLiaoChunyu; RV64-LABEL: uaddo_i64_increment_alt:
631d624b921SLiaoChunyu; RV64:       # %bb.0:
632d624b921SLiaoChunyu; RV64-NEXT:    addi a2, a0, 1
633d624b921SLiaoChunyu; RV64-NEXT:    seqz a0, a2
634d624b921SLiaoChunyu; RV64-NEXT:    sd a2, 0(a1)
635d624b921SLiaoChunyu; RV64-NEXT:    ret
636d624b921SLiaoChunyu  %a = add i64 %x, 1
637d624b921SLiaoChunyu  store i64 %a, ptr %p
638d624b921SLiaoChunyu  %ov = icmp eq i64 %x, -1
639d624b921SLiaoChunyu  ret i1 %ov
640d624b921SLiaoChunyu}
641d624b921SLiaoChunyu
642d624b921SLiaoChunyu; Make sure insertion is done correctly based on dominance.
643d624b921SLiaoChunyu
644d624b921SLiaoChunyudefine i1 @uaddo_i64_increment_alt_dom(i64 %x, ptr %p) {
645d624b921SLiaoChunyu; RV32-LABEL: uaddo_i64_increment_alt_dom:
646d624b921SLiaoChunyu; RV32:       # %bb.0:
647697a28b3SCraig Topper; RV32-NEXT:    addi a3, a0, 1
648697a28b3SCraig Topper; RV32-NEXT:    seqz a0, a3
649697a28b3SCraig Topper; RV32-NEXT:    add a1, a1, a0
650697a28b3SCraig Topper; RV32-NEXT:    or a0, a3, a1
651697a28b3SCraig Topper; RV32-NEXT:    seqz a0, a0
652697a28b3SCraig Topper; RV32-NEXT:    sw a3, 0(a2)
653230e6165SCraig Topper; RV32-NEXT:    sw a1, 4(a2)
654d624b921SLiaoChunyu; RV32-NEXT:    ret
655d624b921SLiaoChunyu;
656d624b921SLiaoChunyu; RV64-LABEL: uaddo_i64_increment_alt_dom:
657d624b921SLiaoChunyu; RV64:       # %bb.0:
658d624b921SLiaoChunyu; RV64-NEXT:    addi a2, a0, 1
659d624b921SLiaoChunyu; RV64-NEXT:    seqz a0, a2
660d624b921SLiaoChunyu; RV64-NEXT:    sd a2, 0(a1)
661d624b921SLiaoChunyu; RV64-NEXT:    ret
662d624b921SLiaoChunyu  %ov = icmp eq i64 %x, -1
663d624b921SLiaoChunyu  %a = add i64 %x, 1
664d624b921SLiaoChunyu  store i64 %a, ptr %p
665d624b921SLiaoChunyu  ret i1 %ov
666d624b921SLiaoChunyu}
667d624b921SLiaoChunyu
668d624b921SLiaoChunyu; The overflow check may be against the input rather than the sum.
669d624b921SLiaoChunyu
670e15dbda9SCraig Topperdefine i1 @uaddo_i32_decrement_alt(i32 signext %x, ptr %p) {
671e15dbda9SCraig Topper; RV32-LABEL: uaddo_i32_decrement_alt:
672e15dbda9SCraig Topper; RV32:       # %bb.0:
673e15dbda9SCraig Topper; RV32-NEXT:    snez a2, a0
674e15dbda9SCraig Topper; RV32-NEXT:    addi a0, a0, -1
675e15dbda9SCraig Topper; RV32-NEXT:    sw a0, 0(a1)
676e15dbda9SCraig Topper; RV32-NEXT:    mv a0, a2
677e15dbda9SCraig Topper; RV32-NEXT:    ret
678e15dbda9SCraig Topper;
679e15dbda9SCraig Topper; RV64-LABEL: uaddo_i32_decrement_alt:
680e15dbda9SCraig Topper; RV64:       # %bb.0:
681241ad16eSCraig Topper; RV64-NEXT:    snez a2, a0
68286240751SPhilip Reames; RV64-NEXT:    addi a0, a0, -1
683241ad16eSCraig Topper; RV64-NEXT:    sw a0, 0(a1)
684241ad16eSCraig Topper; RV64-NEXT:    mv a0, a2
685e15dbda9SCraig Topper; RV64-NEXT:    ret
686e15dbda9SCraig Topper  %a = add i32 %x, -1
687e15dbda9SCraig Topper  store i32 %a, ptr %p
688e15dbda9SCraig Topper  %ov = icmp ne i32 %x, 0
689e15dbda9SCraig Topper  ret i1 %ov
690e15dbda9SCraig Topper}
691e15dbda9SCraig Topper
692d624b921SLiaoChunyudefine i1 @uaddo_i64_decrement_alt(i64 %x, ptr %p) {
693d624b921SLiaoChunyu; RV32-LABEL: uaddo_i64_decrement_alt:
694d624b921SLiaoChunyu; RV32:       # %bb.0:
695c9e4d9a8SCraig Topper; RV32-NEXT:    or a3, a0, a1
696697a28b3SCraig Topper; RV32-NEXT:    seqz a4, a0
697*9122c523SPengcheng Wang; RV32-NEXT:    addi a5, a0, -1
698*9122c523SPengcheng Wang; RV32-NEXT:    snez a0, a3
699c9e4d9a8SCraig Topper; RV32-NEXT:    sub a1, a1, a4
700*9122c523SPengcheng Wang; RV32-NEXT:    sw a5, 0(a2)
701c9e4d9a8SCraig Topper; RV32-NEXT:    sw a1, 4(a2)
702d624b921SLiaoChunyu; RV32-NEXT:    ret
703d624b921SLiaoChunyu;
704d624b921SLiaoChunyu; RV64-LABEL: uaddo_i64_decrement_alt:
705d624b921SLiaoChunyu; RV64:       # %bb.0:
706c9e4d9a8SCraig Topper; RV64-NEXT:    snez a2, a0
707c9e4d9a8SCraig Topper; RV64-NEXT:    addi a0, a0, -1
708c9e4d9a8SCraig Topper; RV64-NEXT:    sd a0, 0(a1)
709c9e4d9a8SCraig Topper; RV64-NEXT:    mv a0, a2
710d624b921SLiaoChunyu; RV64-NEXT:    ret
711d624b921SLiaoChunyu  %a = add i64 %x, -1
712d624b921SLiaoChunyu  store i64 %a, ptr %p
713d624b921SLiaoChunyu  %ov = icmp ne i64 %x, 0
714d624b921SLiaoChunyu  ret i1 %ov
715d624b921SLiaoChunyu}
716d624b921SLiaoChunyu
717d624b921SLiaoChunyu; Make sure insertion is done correctly based on dominance.
718d624b921SLiaoChunyu
719d624b921SLiaoChunyudefine i1 @uaddo_i64_decrement_alt_dom(i64 %x, ptr %p) {
720d624b921SLiaoChunyu; RV32-LABEL: uaddo_i64_decrement_alt_dom:
721d624b921SLiaoChunyu; RV32:       # %bb.0:
722c9e4d9a8SCraig Topper; RV32-NEXT:    or a3, a0, a1
72324847a90SLiaoChunyu; RV32-NEXT:    seqz a4, a0
724*9122c523SPengcheng Wang; RV32-NEXT:    addi a5, a0, -1
725*9122c523SPengcheng Wang; RV32-NEXT:    snez a0, a3
726c9e4d9a8SCraig Topper; RV32-NEXT:    sub a1, a1, a4
727*9122c523SPengcheng Wang; RV32-NEXT:    sw a5, 0(a2)
728c9e4d9a8SCraig Topper; RV32-NEXT:    sw a1, 4(a2)
729d624b921SLiaoChunyu; RV32-NEXT:    ret
730d624b921SLiaoChunyu;
731d624b921SLiaoChunyu; RV64-LABEL: uaddo_i64_decrement_alt_dom:
732d624b921SLiaoChunyu; RV64:       # %bb.0:
733c9e4d9a8SCraig Topper; RV64-NEXT:    snez a2, a0
734c9e4d9a8SCraig Topper; RV64-NEXT:    addi a0, a0, -1
735c9e4d9a8SCraig Topper; RV64-NEXT:    sd a0, 0(a1)
736c9e4d9a8SCraig Topper; RV64-NEXT:    mv a0, a2
737d624b921SLiaoChunyu; RV64-NEXT:    ret
738d624b921SLiaoChunyu  %ov = icmp ne i64 %x, 0
739d624b921SLiaoChunyu  %a = add i64 %x, -1
740d624b921SLiaoChunyu  store i64 %a, ptr %p
741d624b921SLiaoChunyu  ret i1 %ov
742d624b921SLiaoChunyu}
743d624b921SLiaoChunyu
744d624b921SLiaoChunyu; No transform for illegal types.
745d624b921SLiaoChunyu
746d624b921SLiaoChunyudefine i1 @uaddo_i42_increment_illegal_type(i42 %x, ptr %p) {
747d624b921SLiaoChunyu; RV32-LABEL: uaddo_i42_increment_illegal_type:
748d624b921SLiaoChunyu; RV32:       # %bb.0:
749d624b921SLiaoChunyu; RV32-NEXT:    addi a3, a0, 1
750230e6165SCraig Topper; RV32-NEXT:    seqz a0, a3
751d624b921SLiaoChunyu; RV32-NEXT:    add a0, a1, a0
752d624b921SLiaoChunyu; RV32-NEXT:    andi a1, a0, 1023
753d624b921SLiaoChunyu; RV32-NEXT:    or a0, a3, a1
754d624b921SLiaoChunyu; RV32-NEXT:    seqz a0, a0
755d624b921SLiaoChunyu; RV32-NEXT:    sw a3, 0(a2)
756d624b921SLiaoChunyu; RV32-NEXT:    sh a1, 4(a2)
757d624b921SLiaoChunyu; RV32-NEXT:    ret
758d624b921SLiaoChunyu;
759d624b921SLiaoChunyu; RV64-LABEL: uaddo_i42_increment_illegal_type:
760d624b921SLiaoChunyu; RV64:       # %bb.0:
761d624b921SLiaoChunyu; RV64-NEXT:    addi a2, a0, 1
762d624b921SLiaoChunyu; RV64-NEXT:    slli a0, a2, 22
763d624b921SLiaoChunyu; RV64-NEXT:    srli a3, a0, 22
764d624b921SLiaoChunyu; RV64-NEXT:    seqz a0, a3
765d624b921SLiaoChunyu; RV64-NEXT:    srli a3, a3, 32
7662967e5f8SAlex Bradbury; RV64-NEXT:    sw a2, 0(a1)
767d624b921SLiaoChunyu; RV64-NEXT:    sh a3, 4(a1)
768d624b921SLiaoChunyu; RV64-NEXT:    ret
769d624b921SLiaoChunyu  %a = add i42 %x, 1
770d624b921SLiaoChunyu  %ov = icmp eq i42 %a, 0
771d624b921SLiaoChunyu  store i42 %a, ptr %p
772d624b921SLiaoChunyu  ret i1 %ov
773d624b921SLiaoChunyu}
774d624b921SLiaoChunyu
775d624b921SLiaoChunyudefine i1 @usubo_ult_i64_overflow_used(i64 %x, i64 %y, ptr %p) {
776d624b921SLiaoChunyu; RV32-LABEL: usubo_ult_i64_overflow_used:
777d624b921SLiaoChunyu; RV32:       # %bb.0:
778e15dbda9SCraig Topper; RV32-NEXT:    beq a1, a3, .LBB22_2
779d624b921SLiaoChunyu; RV32-NEXT:  # %bb.1:
780d624b921SLiaoChunyu; RV32-NEXT:    sltu a0, a1, a3
781d624b921SLiaoChunyu; RV32-NEXT:    ret
782e15dbda9SCraig Topper; RV32-NEXT:  .LBB22_2:
783d624b921SLiaoChunyu; RV32-NEXT:    sltu a0, a0, a2
784d624b921SLiaoChunyu; RV32-NEXT:    ret
785d624b921SLiaoChunyu;
786d624b921SLiaoChunyu; RV64-LABEL: usubo_ult_i64_overflow_used:
787d624b921SLiaoChunyu; RV64:       # %bb.0:
788d624b921SLiaoChunyu; RV64-NEXT:    sltu a0, a0, a1
789d624b921SLiaoChunyu; RV64-NEXT:    ret
790d624b921SLiaoChunyu  %s = sub i64 %x, %y
791d624b921SLiaoChunyu  %ov = icmp ult i64 %x, %y
792d624b921SLiaoChunyu  ret i1 %ov
793d624b921SLiaoChunyu}
794d624b921SLiaoChunyu
795d624b921SLiaoChunyudefine i1 @usubo_ult_i64_math_overflow_used(i64 %x, i64 %y, ptr %p) {
796d624b921SLiaoChunyu; RV32-LABEL: usubo_ult_i64_math_overflow_used:
797d624b921SLiaoChunyu; RV32:       # %bb.0:
798d624b921SLiaoChunyu; RV32-NEXT:    mv a5, a0
799d624b921SLiaoChunyu; RV32-NEXT:    sltu a0, a0, a2
800d624b921SLiaoChunyu; RV32-NEXT:    sub a6, a1, a3
801d624b921SLiaoChunyu; RV32-NEXT:    sub a5, a5, a2
802*9122c523SPengcheng Wang; RV32-NEXT:    sub a2, a6, a0
803d624b921SLiaoChunyu; RV32-NEXT:    sw a5, 0(a4)
804*9122c523SPengcheng Wang; RV32-NEXT:    sw a2, 4(a4)
805e15dbda9SCraig Topper; RV32-NEXT:    beq a1, a3, .LBB23_2
806d624b921SLiaoChunyu; RV32-NEXT:  # %bb.1:
807d624b921SLiaoChunyu; RV32-NEXT:    sltu a0, a1, a3
808e15dbda9SCraig Topper; RV32-NEXT:  .LBB23_2:
809d624b921SLiaoChunyu; RV32-NEXT:    ret
810d624b921SLiaoChunyu;
811d624b921SLiaoChunyu; RV64-LABEL: usubo_ult_i64_math_overflow_used:
812d624b921SLiaoChunyu; RV64:       # %bb.0:
813d624b921SLiaoChunyu; RV64-NEXT:    sub a3, a0, a1
814d624b921SLiaoChunyu; RV64-NEXT:    sltu a0, a0, a1
815d624b921SLiaoChunyu; RV64-NEXT:    sd a3, 0(a2)
816d624b921SLiaoChunyu; RV64-NEXT:    ret
817d624b921SLiaoChunyu  %s = sub i64 %x, %y
818d624b921SLiaoChunyu  store i64 %s, ptr %p
819d624b921SLiaoChunyu  %ov = icmp ult i64 %x, %y
820d624b921SLiaoChunyu  ret i1 %ov
821d624b921SLiaoChunyu}
822d624b921SLiaoChunyu
823d624b921SLiaoChunyu; Verify insertion point for single-BB. Toggle predicate.
824d624b921SLiaoChunyu
825d624b921SLiaoChunyudefine i1 @usubo_ugt_i32(i32 %x, i32 %y, ptr %p) {
826d624b921SLiaoChunyu; RV32-LABEL: usubo_ugt_i32:
827d624b921SLiaoChunyu; RV32:       # %bb.0:
828d624b921SLiaoChunyu; RV32-NEXT:    sltu a3, a0, a1
829d624b921SLiaoChunyu; RV32-NEXT:    sub a0, a0, a1
830d624b921SLiaoChunyu; RV32-NEXT:    sw a0, 0(a2)
831d624b921SLiaoChunyu; RV32-NEXT:    mv a0, a3
832d624b921SLiaoChunyu; RV32-NEXT:    ret
833d624b921SLiaoChunyu;
834d624b921SLiaoChunyu; RV64-LABEL: usubo_ugt_i32:
835d624b921SLiaoChunyu; RV64:       # %bb.0:
836d624b921SLiaoChunyu; RV64-NEXT:    sext.w a3, a1
837d624b921SLiaoChunyu; RV64-NEXT:    sext.w a4, a0
838d624b921SLiaoChunyu; RV64-NEXT:    sltu a3, a4, a3
839d624b921SLiaoChunyu; RV64-NEXT:    subw a0, a0, a1
840d624b921SLiaoChunyu; RV64-NEXT:    sw a0, 0(a2)
841d624b921SLiaoChunyu; RV64-NEXT:    mv a0, a3
842d624b921SLiaoChunyu; RV64-NEXT:    ret
843d624b921SLiaoChunyu  %ov = icmp ugt i32 %y, %x
844d624b921SLiaoChunyu  %s = sub i32 %x, %y
845d624b921SLiaoChunyu  store i32 %s, ptr %p
846d624b921SLiaoChunyu  ret i1 %ov
847d624b921SLiaoChunyu}
848d624b921SLiaoChunyu
849d624b921SLiaoChunyu; Constant operand should match.
850d624b921SLiaoChunyu
851d624b921SLiaoChunyudefine i1 @usubo_ugt_constant_op0_i8(i8 %x, ptr %p) {
852d624b921SLiaoChunyu; RV32-LABEL: usubo_ugt_constant_op0_i8:
853d624b921SLiaoChunyu; RV32:       # %bb.0:
854d624b921SLiaoChunyu; RV32-NEXT:    andi a2, a0, 255
855d624b921SLiaoChunyu; RV32-NEXT:    li a3, 42
856d624b921SLiaoChunyu; RV32-NEXT:    sub a3, a3, a0
857d624b921SLiaoChunyu; RV32-NEXT:    sltiu a0, a2, 43
858d624b921SLiaoChunyu; RV32-NEXT:    xori a0, a0, 1
859d624b921SLiaoChunyu; RV32-NEXT:    sb a3, 0(a1)
860d624b921SLiaoChunyu; RV32-NEXT:    ret
861d624b921SLiaoChunyu;
862d624b921SLiaoChunyu; RV64-LABEL: usubo_ugt_constant_op0_i8:
863d624b921SLiaoChunyu; RV64:       # %bb.0:
864d624b921SLiaoChunyu; RV64-NEXT:    andi a2, a0, 255
865d624b921SLiaoChunyu; RV64-NEXT:    li a3, 42
866d624b921SLiaoChunyu; RV64-NEXT:    subw a3, a3, a0
867d624b921SLiaoChunyu; RV64-NEXT:    sltiu a0, a2, 43
868d624b921SLiaoChunyu; RV64-NEXT:    xori a0, a0, 1
869d624b921SLiaoChunyu; RV64-NEXT:    sb a3, 0(a1)
870d624b921SLiaoChunyu; RV64-NEXT:    ret
871d624b921SLiaoChunyu  %s = sub i8 42, %x
872d624b921SLiaoChunyu  %ov = icmp ugt i8 %x, 42
873d624b921SLiaoChunyu  store i8 %s, ptr %p
874d624b921SLiaoChunyu  ret i1 %ov
875d624b921SLiaoChunyu}
876d624b921SLiaoChunyu
877d624b921SLiaoChunyu; Compare with constant operand 0 is canonicalized by commuting, but verify match for non-canonical form.
878d624b921SLiaoChunyu
879d624b921SLiaoChunyudefine i1 @usubo_ult_constant_op0_i16(i16 %x, ptr %p) {
880d624b921SLiaoChunyu; RV32-LABEL: usubo_ult_constant_op0_i16:
881d624b921SLiaoChunyu; RV32:       # %bb.0:
882d624b921SLiaoChunyu; RV32-NEXT:    slli a2, a0, 16
883d624b921SLiaoChunyu; RV32-NEXT:    li a3, 43
884*9122c523SPengcheng Wang; RV32-NEXT:    srli a2, a2, 16
885d624b921SLiaoChunyu; RV32-NEXT:    sub a3, a3, a0
886d624b921SLiaoChunyu; RV32-NEXT:    sltiu a0, a2, 44
887d624b921SLiaoChunyu; RV32-NEXT:    xori a0, a0, 1
888d624b921SLiaoChunyu; RV32-NEXT:    sh a3, 0(a1)
889d624b921SLiaoChunyu; RV32-NEXT:    ret
890d624b921SLiaoChunyu;
891d624b921SLiaoChunyu; RV64-LABEL: usubo_ult_constant_op0_i16:
892d624b921SLiaoChunyu; RV64:       # %bb.0:
893d624b921SLiaoChunyu; RV64-NEXT:    slli a2, a0, 48
894d624b921SLiaoChunyu; RV64-NEXT:    li a3, 43
895*9122c523SPengcheng Wang; RV64-NEXT:    srli a2, a2, 48
896d624b921SLiaoChunyu; RV64-NEXT:    subw a3, a3, a0
897d624b921SLiaoChunyu; RV64-NEXT:    sltiu a0, a2, 44
898d624b921SLiaoChunyu; RV64-NEXT:    xori a0, a0, 1
899d624b921SLiaoChunyu; RV64-NEXT:    sh a3, 0(a1)
900d624b921SLiaoChunyu; RV64-NEXT:    ret
901d624b921SLiaoChunyu  %s = sub i16 43, %x
902d624b921SLiaoChunyu  %ov = icmp ult i16 43, %x
903d624b921SLiaoChunyu  store i16 %s, ptr %p
904d624b921SLiaoChunyu  ret i1 %ov
905d624b921SLiaoChunyu}
906d624b921SLiaoChunyu
907d624b921SLiaoChunyu; Subtract with constant operand 1 is canonicalized to add.
908d624b921SLiaoChunyu
909d624b921SLiaoChunyudefine i1 @usubo_ult_constant_op1_i16(i16 %x, ptr %p) {
910d624b921SLiaoChunyu; RV32-LABEL: usubo_ult_constant_op1_i16:
911d624b921SLiaoChunyu; RV32:       # %bb.0:
912d624b921SLiaoChunyu; RV32-NEXT:    slli a2, a0, 16
913d624b921SLiaoChunyu; RV32-NEXT:    srli a2, a2, 16
914d624b921SLiaoChunyu; RV32-NEXT:    addi a3, a0, -44
915d624b921SLiaoChunyu; RV32-NEXT:    sltiu a0, a2, 44
916d624b921SLiaoChunyu; RV32-NEXT:    sh a3, 0(a1)
917d624b921SLiaoChunyu; RV32-NEXT:    ret
918d624b921SLiaoChunyu;
919d624b921SLiaoChunyu; RV64-LABEL: usubo_ult_constant_op1_i16:
920d624b921SLiaoChunyu; RV64:       # %bb.0:
921d624b921SLiaoChunyu; RV64-NEXT:    slli a2, a0, 48
922d624b921SLiaoChunyu; RV64-NEXT:    srli a2, a2, 48
92386240751SPhilip Reames; RV64-NEXT:    addi a3, a0, -44
924d624b921SLiaoChunyu; RV64-NEXT:    sltiu a0, a2, 44
925d624b921SLiaoChunyu; RV64-NEXT:    sh a3, 0(a1)
926d624b921SLiaoChunyu; RV64-NEXT:    ret
927d624b921SLiaoChunyu  %s = add i16 %x, -44
928d624b921SLiaoChunyu  %ov = icmp ult i16 %x, 44
929d624b921SLiaoChunyu  store i16 %s, ptr %p
930d624b921SLiaoChunyu  ret i1 %ov
931d624b921SLiaoChunyu}
932d624b921SLiaoChunyu
933d624b921SLiaoChunyudefine i1 @usubo_ugt_constant_op1_i8(i8 %x, ptr %p) {
934d624b921SLiaoChunyu; RV32-LABEL: usubo_ugt_constant_op1_i8:
935d624b921SLiaoChunyu; RV32:       # %bb.0:
936d624b921SLiaoChunyu; RV32-NEXT:    andi a2, a0, 255
937d624b921SLiaoChunyu; RV32-NEXT:    sltiu a2, a2, 45
938d624b921SLiaoChunyu; RV32-NEXT:    addi a0, a0, -45
939d624b921SLiaoChunyu; RV32-NEXT:    sb a0, 0(a1)
940d624b921SLiaoChunyu; RV32-NEXT:    mv a0, a2
941d624b921SLiaoChunyu; RV32-NEXT:    ret
942d624b921SLiaoChunyu;
943d624b921SLiaoChunyu; RV64-LABEL: usubo_ugt_constant_op1_i8:
944d624b921SLiaoChunyu; RV64:       # %bb.0:
945d624b921SLiaoChunyu; RV64-NEXT:    andi a2, a0, 255
946d624b921SLiaoChunyu; RV64-NEXT:    sltiu a2, a2, 45
94786240751SPhilip Reames; RV64-NEXT:    addi a0, a0, -45
948d624b921SLiaoChunyu; RV64-NEXT:    sb a0, 0(a1)
949d624b921SLiaoChunyu; RV64-NEXT:    mv a0, a2
950d624b921SLiaoChunyu; RV64-NEXT:    ret
951d624b921SLiaoChunyu  %ov = icmp ugt i8 45, %x
952d624b921SLiaoChunyu  %s = add i8 %x, -45
953d624b921SLiaoChunyu  store i8 %s, ptr %p
954d624b921SLiaoChunyu  ret i1 %ov
955d624b921SLiaoChunyu}
956d624b921SLiaoChunyu
957d624b921SLiaoChunyu; Special-case: subtract 1 changes the compare predicate and constant.
958d624b921SLiaoChunyu
959d624b921SLiaoChunyudefine i1 @usubo_eq_constant1_op1_i32(i32 %x, ptr %p) {
960d624b921SLiaoChunyu; RV32-LABEL: usubo_eq_constant1_op1_i32:
961d624b921SLiaoChunyu; RV32:       # %bb.0:
962d624b921SLiaoChunyu; RV32-NEXT:    addi a2, a0, -1
963d624b921SLiaoChunyu; RV32-NEXT:    seqz a0, a0
964d624b921SLiaoChunyu; RV32-NEXT:    sw a2, 0(a1)
965d624b921SLiaoChunyu; RV32-NEXT:    ret
966d624b921SLiaoChunyu;
967d624b921SLiaoChunyu; RV64-LABEL: usubo_eq_constant1_op1_i32:
968d624b921SLiaoChunyu; RV64:       # %bb.0:
969d624b921SLiaoChunyu; RV64-NEXT:    sext.w a2, a0
97086240751SPhilip Reames; RV64-NEXT:    addi a3, a0, -1
971d624b921SLiaoChunyu; RV64-NEXT:    seqz a0, a2
972d624b921SLiaoChunyu; RV64-NEXT:    sw a3, 0(a1)
973d624b921SLiaoChunyu; RV64-NEXT:    ret
974d624b921SLiaoChunyu  %s = add i32 %x, -1
975d624b921SLiaoChunyu  %ov = icmp eq i32 %x, 0
976d624b921SLiaoChunyu  store i32 %s, ptr %p
977d624b921SLiaoChunyu  ret i1 %ov
978d624b921SLiaoChunyu}
979d624b921SLiaoChunyu
980d624b921SLiaoChunyu; Special-case: subtract from 0 (negate) changes the compare predicate.
981d624b921SLiaoChunyu
982d624b921SLiaoChunyudefine i1 @usubo_ne_constant0_op1_i32(i32 %x, ptr %p) {
983d624b921SLiaoChunyu; RV32-LABEL: usubo_ne_constant0_op1_i32:
984d624b921SLiaoChunyu; RV32:       # %bb.0:
985d624b921SLiaoChunyu; RV32-NEXT:    neg a2, a0
986d624b921SLiaoChunyu; RV32-NEXT:    snez a0, a0
987d624b921SLiaoChunyu; RV32-NEXT:    sw a2, 0(a1)
988d624b921SLiaoChunyu; RV32-NEXT:    ret
989d624b921SLiaoChunyu;
990d624b921SLiaoChunyu; RV64-LABEL: usubo_ne_constant0_op1_i32:
991d624b921SLiaoChunyu; RV64:       # %bb.0:
992d624b921SLiaoChunyu; RV64-NEXT:    sext.w a2, a0
993d624b921SLiaoChunyu; RV64-NEXT:    negw a3, a0
994d624b921SLiaoChunyu; RV64-NEXT:    snez a0, a2
995d624b921SLiaoChunyu; RV64-NEXT:    sw a3, 0(a1)
996d624b921SLiaoChunyu; RV64-NEXT:    ret
997d624b921SLiaoChunyu  %s = sub i32 0, %x
998d624b921SLiaoChunyu  %ov = icmp ne i32 %x, 0
999d624b921SLiaoChunyu  store i32 %s, ptr %p
1000d624b921SLiaoChunyu  ret i1 %ov
1001d624b921SLiaoChunyu}
1002d624b921SLiaoChunyu
1003d624b921SLiaoChunyu; This used to verify insertion point for multi-BB, but now we just bail out.
1004d624b921SLiaoChunyu
1005d624b921SLiaoChunyudeclare void @call(i1)
1006d624b921SLiaoChunyu
1007d624b921SLiaoChunyudefine i1 @usubo_ult_sub_dominates_i64(i64 %x, i64 %y, ptr %p, i1 %cond) {
1008d624b921SLiaoChunyu; RV32-LABEL: usubo_ult_sub_dominates_i64:
1009d624b921SLiaoChunyu; RV32:       # %bb.0: # %entry
1010cbdccb30SGuozhi Wei; RV32-NEXT:    andi a6, a5, 1
1011cbdccb30SGuozhi Wei; RV32-NEXT:    beqz a6, .LBB31_5
1012d624b921SLiaoChunyu; RV32-NEXT:  # %bb.1: # %t
1013cbdccb30SGuozhi Wei; RV32-NEXT:    mv a7, a0
1014d624b921SLiaoChunyu; RV32-NEXT:    sltu a0, a0, a2
1015d624b921SLiaoChunyu; RV32-NEXT:    sub t0, a1, a3
1016cbdccb30SGuozhi Wei; RV32-NEXT:    sub a2, a7, a2
1017*9122c523SPengcheng Wang; RV32-NEXT:    sub a7, t0, a0
1018d624b921SLiaoChunyu; RV32-NEXT:    sw a2, 0(a4)
1019*9122c523SPengcheng Wang; RV32-NEXT:    sw a7, 4(a4)
1020cbdccb30SGuozhi Wei; RV32-NEXT:    beqz a6, .LBB31_5
1021d624b921SLiaoChunyu; RV32-NEXT:  # %bb.2: # %end
1022e15dbda9SCraig Topper; RV32-NEXT:    beq a1, a3, .LBB31_4
1023d624b921SLiaoChunyu; RV32-NEXT:  # %bb.3: # %end
1024d624b921SLiaoChunyu; RV32-NEXT:    sltu a0, a1, a3
1025e15dbda9SCraig Topper; RV32-NEXT:  .LBB31_4: # %end
1026d624b921SLiaoChunyu; RV32-NEXT:    ret
1027e15dbda9SCraig Topper; RV32-NEXT:  .LBB31_5: # %f
1028d624b921SLiaoChunyu; RV32-NEXT:    mv a0, a5
1029d624b921SLiaoChunyu; RV32-NEXT:    ret
1030d624b921SLiaoChunyu;
1031d624b921SLiaoChunyu; RV64-LABEL: usubo_ult_sub_dominates_i64:
1032d624b921SLiaoChunyu; RV64:       # %bb.0: # %entry
1033d624b921SLiaoChunyu; RV64-NEXT:    andi a4, a3, 1
1034e15dbda9SCraig Topper; RV64-NEXT:    beqz a4, .LBB31_3
1035d624b921SLiaoChunyu; RV64-NEXT:  # %bb.1: # %t
1036d624b921SLiaoChunyu; RV64-NEXT:    sub a5, a0, a1
1037d624b921SLiaoChunyu; RV64-NEXT:    sd a5, 0(a2)
1038e15dbda9SCraig Topper; RV64-NEXT:    beqz a4, .LBB31_3
1039d624b921SLiaoChunyu; RV64-NEXT:  # %bb.2: # %end
1040d624b921SLiaoChunyu; RV64-NEXT:    sltu a0, a0, a1
1041d624b921SLiaoChunyu; RV64-NEXT:    ret
1042e15dbda9SCraig Topper; RV64-NEXT:  .LBB31_3: # %f
1043d624b921SLiaoChunyu; RV64-NEXT:    mv a0, a3
1044d624b921SLiaoChunyu; RV64-NEXT:    ret
1045d624b921SLiaoChunyuentry:
1046d624b921SLiaoChunyu  br i1 %cond, label %t, label %f
1047d624b921SLiaoChunyu
1048d624b921SLiaoChunyut:
1049d624b921SLiaoChunyu  %s = sub i64 %x, %y
1050d624b921SLiaoChunyu  store i64 %s, ptr %p
1051d624b921SLiaoChunyu  br i1 %cond, label %end, label %f
1052d624b921SLiaoChunyu
1053d624b921SLiaoChunyuf:
1054d624b921SLiaoChunyu  ret i1 %cond
1055d624b921SLiaoChunyu
1056d624b921SLiaoChunyuend:
1057d624b921SLiaoChunyu  %ov = icmp ult i64 %x, %y
1058d624b921SLiaoChunyu  ret i1 %ov
1059d624b921SLiaoChunyu}
1060d624b921SLiaoChunyu
1061d624b921SLiaoChunyudefine i1 @usubo_ult_cmp_dominates_i64(i64 %x, i64 %y, ptr %p, i1 %cond) {
1062d624b921SLiaoChunyu; RV32-LABEL: usubo_ult_cmp_dominates_i64:
1063d624b921SLiaoChunyu; RV32:       # %bb.0: # %entry
1064d624b921SLiaoChunyu; RV32-NEXT:    addi sp, sp, -32
1065d624b921SLiaoChunyu; RV32-NEXT:    .cfi_def_cfa_offset 32
1066d624b921SLiaoChunyu; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1067d624b921SLiaoChunyu; RV32-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
1068d624b921SLiaoChunyu; RV32-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
1069d624b921SLiaoChunyu; RV32-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
1070d624b921SLiaoChunyu; RV32-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
1071d624b921SLiaoChunyu; RV32-NEXT:    sw s4, 8(sp) # 4-byte Folded Spill
1072d624b921SLiaoChunyu; RV32-NEXT:    sw s5, 4(sp) # 4-byte Folded Spill
1073d624b921SLiaoChunyu; RV32-NEXT:    sw s6, 0(sp) # 4-byte Folded Spill
1074d624b921SLiaoChunyu; RV32-NEXT:    .cfi_offset ra, -4
1075d624b921SLiaoChunyu; RV32-NEXT:    .cfi_offset s0, -8
1076d624b921SLiaoChunyu; RV32-NEXT:    .cfi_offset s1, -12
1077d624b921SLiaoChunyu; RV32-NEXT:    .cfi_offset s2, -16
1078d624b921SLiaoChunyu; RV32-NEXT:    .cfi_offset s3, -20
1079d624b921SLiaoChunyu; RV32-NEXT:    .cfi_offset s4, -24
1080d624b921SLiaoChunyu; RV32-NEXT:    .cfi_offset s5, -28
1081d624b921SLiaoChunyu; RV32-NEXT:    .cfi_offset s6, -32
1082*9122c523SPengcheng Wang; RV32-NEXT:    mv s5, a5
1083*9122c523SPengcheng Wang; RV32-NEXT:    mv s3, a1
1084*9122c523SPengcheng Wang; RV32-NEXT:    andi a1, a5, 1
1085*9122c523SPengcheng Wang; RV32-NEXT:    beqz a1, .LBB32_8
1086d624b921SLiaoChunyu; RV32-NEXT:  # %bb.1: # %t
1087d624b921SLiaoChunyu; RV32-NEXT:    mv s0, a4
1088*9122c523SPengcheng Wang; RV32-NEXT:    mv s2, a3
1089d624b921SLiaoChunyu; RV32-NEXT:    mv s1, a2
10907b3bbd83SJay Foad; RV32-NEXT:    mv s4, a0
1091*9122c523SPengcheng Wang; RV32-NEXT:    beq s3, a3, .LBB32_3
1092d624b921SLiaoChunyu; RV32-NEXT:  # %bb.2: # %t
1093*9122c523SPengcheng Wang; RV32-NEXT:    sltu s6, s3, s2
1094e15dbda9SCraig Topper; RV32-NEXT:    j .LBB32_4
1095e15dbda9SCraig Topper; RV32-NEXT:  .LBB32_3:
10967b3bbd83SJay Foad; RV32-NEXT:    sltu s6, s4, s1
1097e15dbda9SCraig Topper; RV32-NEXT:  .LBB32_4: # %t
1098d624b921SLiaoChunyu; RV32-NEXT:    mv a0, s6
1099eabaee0cSFangrui Song; RV32-NEXT:    call call
1100e15dbda9SCraig Topper; RV32-NEXT:    beqz s6, .LBB32_8
1101d624b921SLiaoChunyu; RV32-NEXT:  # %bb.5: # %end
11027b3bbd83SJay Foad; RV32-NEXT:    sltu a1, s4, s1
1103d624b921SLiaoChunyu; RV32-NEXT:    mv a0, a1
1104*9122c523SPengcheng Wang; RV32-NEXT:    beq s3, s2, .LBB32_7
1105d624b921SLiaoChunyu; RV32-NEXT:  # %bb.6: # %end
1106*9122c523SPengcheng Wang; RV32-NEXT:    sltu a0, s3, s2
1107e15dbda9SCraig Topper; RV32-NEXT:  .LBB32_7: # %end
1108*9122c523SPengcheng Wang; RV32-NEXT:    sub a2, s3, s2
1109*9122c523SPengcheng Wang; RV32-NEXT:    sub a3, s4, s1
1110d624b921SLiaoChunyu; RV32-NEXT:    sub a2, a2, a1
1111*9122c523SPengcheng Wang; RV32-NEXT:    sw a3, 0(s0)
1112d624b921SLiaoChunyu; RV32-NEXT:    sw a2, 4(s0)
1113e15dbda9SCraig Topper; RV32-NEXT:    j .LBB32_9
1114e15dbda9SCraig Topper; RV32-NEXT:  .LBB32_8: # %f
1115*9122c523SPengcheng Wang; RV32-NEXT:    mv a0, s5
1116e15dbda9SCraig Topper; RV32-NEXT:  .LBB32_9: # %f
1117d624b921SLiaoChunyu; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1118d624b921SLiaoChunyu; RV32-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
1119d624b921SLiaoChunyu; RV32-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
1120d624b921SLiaoChunyu; RV32-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
1121d624b921SLiaoChunyu; RV32-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
1122d624b921SLiaoChunyu; RV32-NEXT:    lw s4, 8(sp) # 4-byte Folded Reload
1123d624b921SLiaoChunyu; RV32-NEXT:    lw s5, 4(sp) # 4-byte Folded Reload
1124d624b921SLiaoChunyu; RV32-NEXT:    lw s6, 0(sp) # 4-byte Folded Reload
112597982a8cSdlav-sc; RV32-NEXT:    .cfi_restore ra
112697982a8cSdlav-sc; RV32-NEXT:    .cfi_restore s0
112797982a8cSdlav-sc; RV32-NEXT:    .cfi_restore s1
112897982a8cSdlav-sc; RV32-NEXT:    .cfi_restore s2
112997982a8cSdlav-sc; RV32-NEXT:    .cfi_restore s3
113097982a8cSdlav-sc; RV32-NEXT:    .cfi_restore s4
113197982a8cSdlav-sc; RV32-NEXT:    .cfi_restore s5
113297982a8cSdlav-sc; RV32-NEXT:    .cfi_restore s6
1133d624b921SLiaoChunyu; RV32-NEXT:    addi sp, sp, 32
113497982a8cSdlav-sc; RV32-NEXT:    .cfi_def_cfa_offset 0
1135d624b921SLiaoChunyu; RV32-NEXT:    ret
1136d624b921SLiaoChunyu;
1137d624b921SLiaoChunyu; RV64-LABEL: usubo_ult_cmp_dominates_i64:
1138d624b921SLiaoChunyu; RV64:       # %bb.0: # %entry
1139d624b921SLiaoChunyu; RV64-NEXT:    addi sp, sp, -48
1140d624b921SLiaoChunyu; RV64-NEXT:    .cfi_def_cfa_offset 48
1141d624b921SLiaoChunyu; RV64-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
1142d624b921SLiaoChunyu; RV64-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
1143d624b921SLiaoChunyu; RV64-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
1144d624b921SLiaoChunyu; RV64-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
1145d624b921SLiaoChunyu; RV64-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
1146d624b921SLiaoChunyu; RV64-NEXT:    sd s4, 0(sp) # 8-byte Folded Spill
1147d624b921SLiaoChunyu; RV64-NEXT:    .cfi_offset ra, -8
1148d624b921SLiaoChunyu; RV64-NEXT:    .cfi_offset s0, -16
1149d624b921SLiaoChunyu; RV64-NEXT:    .cfi_offset s1, -24
1150d624b921SLiaoChunyu; RV64-NEXT:    .cfi_offset s2, -32
1151d624b921SLiaoChunyu; RV64-NEXT:    .cfi_offset s3, -40
1152d624b921SLiaoChunyu; RV64-NEXT:    .cfi_offset s4, -48
1153d624b921SLiaoChunyu; RV64-NEXT:    mv s0, a3
1154*9122c523SPengcheng Wang; RV64-NEXT:    mv s2, a1
1155*9122c523SPengcheng Wang; RV64-NEXT:    andi a1, a3, 1
1156*9122c523SPengcheng Wang; RV64-NEXT:    beqz a1, .LBB32_3
1157d624b921SLiaoChunyu; RV64-NEXT:  # %bb.1: # %t
1158d624b921SLiaoChunyu; RV64-NEXT:    mv s1, a2
1159d624b921SLiaoChunyu; RV64-NEXT:    mv s3, a0
1160*9122c523SPengcheng Wang; RV64-NEXT:    sltu s4, a0, s2
1161d624b921SLiaoChunyu; RV64-NEXT:    mv a0, s4
1162eabaee0cSFangrui Song; RV64-NEXT:    call call
1163e15dbda9SCraig Topper; RV64-NEXT:    bgeu s3, s2, .LBB32_3
1164d624b921SLiaoChunyu; RV64-NEXT:  # %bb.2: # %end
1165d624b921SLiaoChunyu; RV64-NEXT:    sub a0, s3, s2
1166d624b921SLiaoChunyu; RV64-NEXT:    sd a0, 0(s1)
1167d624b921SLiaoChunyu; RV64-NEXT:    mv a0, s4
1168e15dbda9SCraig Topper; RV64-NEXT:    j .LBB32_4
1169e15dbda9SCraig Topper; RV64-NEXT:  .LBB32_3: # %f
1170d624b921SLiaoChunyu; RV64-NEXT:    mv a0, s0
1171e15dbda9SCraig Topper; RV64-NEXT:  .LBB32_4: # %f
1172d624b921SLiaoChunyu; RV64-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
1173d624b921SLiaoChunyu; RV64-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
1174d624b921SLiaoChunyu; RV64-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
1175d624b921SLiaoChunyu; RV64-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
1176d624b921SLiaoChunyu; RV64-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
1177d624b921SLiaoChunyu; RV64-NEXT:    ld s4, 0(sp) # 8-byte Folded Reload
117897982a8cSdlav-sc; RV64-NEXT:    .cfi_restore ra
117997982a8cSdlav-sc; RV64-NEXT:    .cfi_restore s0
118097982a8cSdlav-sc; RV64-NEXT:    .cfi_restore s1
118197982a8cSdlav-sc; RV64-NEXT:    .cfi_restore s2
118297982a8cSdlav-sc; RV64-NEXT:    .cfi_restore s3
118397982a8cSdlav-sc; RV64-NEXT:    .cfi_restore s4
1184d624b921SLiaoChunyu; RV64-NEXT:    addi sp, sp, 48
118597982a8cSdlav-sc; RV64-NEXT:    .cfi_def_cfa_offset 0
1186d624b921SLiaoChunyu; RV64-NEXT:    ret
1187d624b921SLiaoChunyuentry:
1188d624b921SLiaoChunyu  br i1 %cond, label %t, label %f
1189d624b921SLiaoChunyu
1190d624b921SLiaoChunyut:
1191d624b921SLiaoChunyu  %ov = icmp ult i64 %x, %y
1192d624b921SLiaoChunyu  call void @call(i1 %ov)
1193d624b921SLiaoChunyu  br i1 %ov, label %end, label %f
1194d624b921SLiaoChunyu
1195d624b921SLiaoChunyuf:
1196d624b921SLiaoChunyu  ret i1 %cond
1197d624b921SLiaoChunyu
1198d624b921SLiaoChunyuend:
1199d624b921SLiaoChunyu  %s = sub i64 %x, %y
1200d624b921SLiaoChunyu  store i64 %s, ptr %p
1201d624b921SLiaoChunyu  ret i1 %ov
1202d624b921SLiaoChunyu}
1203d624b921SLiaoChunyu
1204d624b921SLiaoChunyu; Verify that crazy/non-canonical code does not crash.
1205d624b921SLiaoChunyu
1206d624b921SLiaoChunyudefine void @bar() {
1207d624b921SLiaoChunyu; RV32-LABEL: bar:
1208d624b921SLiaoChunyu; RV32:       # %bb.0:
1209d624b921SLiaoChunyu;
1210d624b921SLiaoChunyu; RV64-LABEL: bar:
1211d624b921SLiaoChunyu; RV64:       # %bb.0:
1212d624b921SLiaoChunyu  %cmp = icmp eq i64 1, -1
1213d624b921SLiaoChunyu  %frombool = zext i1 %cmp to i8
1214d624b921SLiaoChunyu  unreachable
1215d624b921SLiaoChunyu}
1216d624b921SLiaoChunyu
1217d624b921SLiaoChunyudefine void @foo() {
1218d624b921SLiaoChunyu; RV32-LABEL: foo:
1219d624b921SLiaoChunyu; RV32:       # %bb.0:
1220d624b921SLiaoChunyu;
1221d624b921SLiaoChunyu; RV64-LABEL: foo:
1222d624b921SLiaoChunyu; RV64:       # %bb.0:
1223d624b921SLiaoChunyu  %sub = add nsw i64 1, 1
1224d624b921SLiaoChunyu  %conv = trunc i64 %sub to i32
1225d624b921SLiaoChunyu  unreachable
1226d624b921SLiaoChunyu}
1227d624b921SLiaoChunyu
1228d624b921SLiaoChunyu; Similarly for usubo.
1229d624b921SLiaoChunyu
1230d624b921SLiaoChunyudefine i1 @bar2() {
1231d624b921SLiaoChunyu; RV32-LABEL: bar2:
1232d624b921SLiaoChunyu; RV32:       # %bb.0:
1233d624b921SLiaoChunyu; RV32-NEXT:    li a0, 0
1234d624b921SLiaoChunyu; RV32-NEXT:    ret
1235d624b921SLiaoChunyu;
1236d624b921SLiaoChunyu; RV64-LABEL: bar2:
1237d624b921SLiaoChunyu; RV64:       # %bb.0:
1238d624b921SLiaoChunyu; RV64-NEXT:    li a0, 0
1239d624b921SLiaoChunyu; RV64-NEXT:    ret
1240d624b921SLiaoChunyu  %cmp = icmp eq i64 1, 0
1241d624b921SLiaoChunyu  ret i1 %cmp
1242d624b921SLiaoChunyu}
1243d624b921SLiaoChunyu
1244d624b921SLiaoChunyudefine i64 @foo2(ptr %p) {
1245d624b921SLiaoChunyu; RV32-LABEL: foo2:
1246d624b921SLiaoChunyu; RV32:       # %bb.0:
1247d624b921SLiaoChunyu; RV32-NEXT:    li a0, 0
1248d624b921SLiaoChunyu; RV32-NEXT:    li a1, 0
1249d624b921SLiaoChunyu; RV32-NEXT:    ret
1250d624b921SLiaoChunyu;
1251d624b921SLiaoChunyu; RV64-LABEL: foo2:
1252d624b921SLiaoChunyu; RV64:       # %bb.0:
1253d624b921SLiaoChunyu; RV64-NEXT:    li a0, 0
1254d624b921SLiaoChunyu; RV64-NEXT:    ret
1255d624b921SLiaoChunyu  %sub = add nsw i64 1, -1
1256d624b921SLiaoChunyu  ret i64 %sub
1257d624b921SLiaoChunyu}
1258d624b921SLiaoChunyu
1259d624b921SLiaoChunyu; Avoid hoisting a math op into a dominating block which would
1260d624b921SLiaoChunyu; increase the critical path.
1261d624b921SLiaoChunyu
1262d624b921SLiaoChunyudefine void @PR41129(ptr %p64) {
1263d624b921SLiaoChunyu; RV32-LABEL: PR41129:
1264d624b921SLiaoChunyu; RV32:       # %bb.0: # %entry
126524847a90SLiaoChunyu; RV32-NEXT:    lw a1, 0(a0)
126614c4f28eSAlex Bradbury; RV32-NEXT:    lw a2, 4(a0)
126724847a90SLiaoChunyu; RV32-NEXT:    or a3, a1, a2
1268e15dbda9SCraig Topper; RV32-NEXT:    beqz a3, .LBB37_2
1269d624b921SLiaoChunyu; RV32-NEXT:  # %bb.1: # %false
127024847a90SLiaoChunyu; RV32-NEXT:    andi a1, a1, 7
127124847a90SLiaoChunyu; RV32-NEXT:    sw a1, 0(a0)
12722967e5f8SAlex Bradbury; RV32-NEXT:    sw zero, 4(a0)
1273d624b921SLiaoChunyu; RV32-NEXT:    ret
1274e15dbda9SCraig Topper; RV32-NEXT:  .LBB37_2: # %true
127524847a90SLiaoChunyu; RV32-NEXT:    seqz a3, a1
1276d624b921SLiaoChunyu; RV32-NEXT:    addi a1, a1, -1
1277*9122c523SPengcheng Wang; RV32-NEXT:    sub a2, a2, a3
127824847a90SLiaoChunyu; RV32-NEXT:    sw a1, 0(a0)
127924847a90SLiaoChunyu; RV32-NEXT:    sw a2, 4(a0)
1280d624b921SLiaoChunyu; RV32-NEXT:    ret
1281d624b921SLiaoChunyu;
1282d624b921SLiaoChunyu; RV64-LABEL: PR41129:
1283d624b921SLiaoChunyu; RV64:       # %bb.0: # %entry
1284d624b921SLiaoChunyu; RV64-NEXT:    ld a1, 0(a0)
1285e15dbda9SCraig Topper; RV64-NEXT:    beqz a1, .LBB37_2
1286d624b921SLiaoChunyu; RV64-NEXT:  # %bb.1: # %false
1287d624b921SLiaoChunyu; RV64-NEXT:    andi a1, a1, 7
1288d624b921SLiaoChunyu; RV64-NEXT:    sd a1, 0(a0)
1289d624b921SLiaoChunyu; RV64-NEXT:    ret
1290e15dbda9SCraig Topper; RV64-NEXT:  .LBB37_2: # %true
1291d624b921SLiaoChunyu; RV64-NEXT:    addi a1, a1, -1
1292d624b921SLiaoChunyu; RV64-NEXT:    sd a1, 0(a0)
1293d624b921SLiaoChunyu; RV64-NEXT:    ret
1294d624b921SLiaoChunyuentry:
1295d624b921SLiaoChunyu  %key = load i64, ptr %p64, align 8
1296d624b921SLiaoChunyu  %cond17 = icmp eq i64 %key, 0
1297d624b921SLiaoChunyu  br i1 %cond17, label %true, label %false
1298d624b921SLiaoChunyu
1299d624b921SLiaoChunyufalse:
1300d624b921SLiaoChunyu  %andval = and i64 %key, 7
1301d624b921SLiaoChunyu  store i64 %andval, ptr %p64
1302d624b921SLiaoChunyu  br label %exit
1303d624b921SLiaoChunyu
1304d624b921SLiaoChunyutrue:
1305d624b921SLiaoChunyu  %svalue = add i64 %key, -1
1306d624b921SLiaoChunyu  store i64 %svalue, ptr %p64
1307d624b921SLiaoChunyu  br label %exit
1308d624b921SLiaoChunyu
1309d624b921SLiaoChunyuexit:
1310d624b921SLiaoChunyu  ret void
1311d624b921SLiaoChunyu}
1312d624b921SLiaoChunyu
1313eb54254bSLiaoChunyudefine i16 @overflow_not_used(i16 %a, i16 %b, ptr %res) {
131442a5dda5SLiaoChunyu; RV32-LABEL: overflow_not_used:
131542a5dda5SLiaoChunyu; RV32:       # %bb.0:
131642a5dda5SLiaoChunyu; RV32-NEXT:    lui a3, 16
1317*9122c523SPengcheng Wang; RV32-NEXT:    add a0, a1, a0
131842a5dda5SLiaoChunyu; RV32-NEXT:    addi a3, a3, -1
131942a5dda5SLiaoChunyu; RV32-NEXT:    and a4, a1, a3
132042a5dda5SLiaoChunyu; RV32-NEXT:    and a3, a0, a3
1321e15dbda9SCraig Topper; RV32-NEXT:    bltu a3, a4, .LBB38_2
132242a5dda5SLiaoChunyu; RV32-NEXT:  # %bb.1:
132342a5dda5SLiaoChunyu; RV32-NEXT:    li a1, 42
1324e15dbda9SCraig Topper; RV32-NEXT:  .LBB38_2:
132542a5dda5SLiaoChunyu; RV32-NEXT:    sh a0, 0(a2)
132642a5dda5SLiaoChunyu; RV32-NEXT:    mv a0, a1
132742a5dda5SLiaoChunyu; RV32-NEXT:    ret
132842a5dda5SLiaoChunyu;
132942a5dda5SLiaoChunyu; RV64-LABEL: overflow_not_used:
133042a5dda5SLiaoChunyu; RV64:       # %bb.0:
133142a5dda5SLiaoChunyu; RV64-NEXT:    lui a3, 16
1332*9122c523SPengcheng Wang; RV64-NEXT:    add a0, a1, a0
133342a5dda5SLiaoChunyu; RV64-NEXT:    addiw a3, a3, -1
133442a5dda5SLiaoChunyu; RV64-NEXT:    and a4, a1, a3
133542a5dda5SLiaoChunyu; RV64-NEXT:    and a3, a0, a3
1336e15dbda9SCraig Topper; RV64-NEXT:    bltu a3, a4, .LBB38_2
133742a5dda5SLiaoChunyu; RV64-NEXT:  # %bb.1:
133842a5dda5SLiaoChunyu; RV64-NEXT:    li a1, 42
1339e15dbda9SCraig Topper; RV64-NEXT:  .LBB38_2:
134042a5dda5SLiaoChunyu; RV64-NEXT:    sh a0, 0(a2)
134142a5dda5SLiaoChunyu; RV64-NEXT:    mv a0, a1
134242a5dda5SLiaoChunyu; RV64-NEXT:    ret
134342a5dda5SLiaoChunyu  %add = add i16 %b, %a
134442a5dda5SLiaoChunyu  %cmp = icmp ult i16 %add, %b
134542a5dda5SLiaoChunyu  %Q = select i1 %cmp, i16 %b, i16 42
134642a5dda5SLiaoChunyu  store i16 %add, ptr %res
134742a5dda5SLiaoChunyu  ret i16 %Q
134842a5dda5SLiaoChunyu}
1349