1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=riscv64 | FileCheck %s --check-prefixes=CHECK,RV64I
3; RUN: llc < %s -mtriple=riscv64 -mattr=+zba,+zbb | \
4; RUN:   FileCheck %s --check-prefixes=CHECK,RV64ZB
5
6; Make sure we emit an lw for the stack reload in 'truebb'.
7define i1 @test_sext_w(i64 %x, i32 %y) nounwind {
8; CHECK-LABEL: test_sext_w:
9; CHECK:       # %bb.0:
10; CHECK-NEXT:    addi sp, sp, -144
11; CHECK-NEXT:    sd ra, 136(sp) # 8-byte Folded Spill
12; CHECK-NEXT:    sd gp, 128(sp) # 8-byte Folded Spill
13; CHECK-NEXT:    sd tp, 120(sp) # 8-byte Folded Spill
14; CHECK-NEXT:    sd s0, 112(sp) # 8-byte Folded Spill
15; CHECK-NEXT:    sd s1, 104(sp) # 8-byte Folded Spill
16; CHECK-NEXT:    sd s2, 96(sp) # 8-byte Folded Spill
17; CHECK-NEXT:    sd s3, 88(sp) # 8-byte Folded Spill
18; CHECK-NEXT:    sd s4, 80(sp) # 8-byte Folded Spill
19; CHECK-NEXT:    sd s5, 72(sp) # 8-byte Folded Spill
20; CHECK-NEXT:    sd s6, 64(sp) # 8-byte Folded Spill
21; CHECK-NEXT:    sd s7, 56(sp) # 8-byte Folded Spill
22; CHECK-NEXT:    sd s8, 48(sp) # 8-byte Folded Spill
23; CHECK-NEXT:    sd s9, 40(sp) # 8-byte Folded Spill
24; CHECK-NEXT:    sd s10, 32(sp) # 8-byte Folded Spill
25; CHECK-NEXT:    sd s11, 24(sp) # 8-byte Folded Spill
26; CHECK-NEXT:    sd a1, 8(sp) # 8-byte Folded Spill
27; CHECK-NEXT:    sd a0, 16(sp) # 8-byte Folded Spill
28; CHECK-NEXT:    #APP
29; CHECK-NEXT:    #NO_APP
30; CHECK-NEXT:    ld a0, 16(sp) # 8-byte Folded Reload
31; CHECK-NEXT:    beqz a0, .LBB0_2
32; CHECK-NEXT:  # %bb.1: # %falsebb
33; CHECK-NEXT:    li a0, 0
34; CHECK-NEXT:    j .LBB0_3
35; CHECK-NEXT:  .LBB0_2: # %truebb
36; CHECK-NEXT:    lw a0, 8(sp) # 8-byte Folded Reload
37; CHECK-NEXT:    slti a0, a0, 0
38; CHECK-NEXT:  .LBB0_3: # %falsebb
39; CHECK-NEXT:    ld ra, 136(sp) # 8-byte Folded Reload
40; CHECK-NEXT:    ld gp, 128(sp) # 8-byte Folded Reload
41; CHECK-NEXT:    ld tp, 120(sp) # 8-byte Folded Reload
42; CHECK-NEXT:    ld s0, 112(sp) # 8-byte Folded Reload
43; CHECK-NEXT:    ld s1, 104(sp) # 8-byte Folded Reload
44; CHECK-NEXT:    ld s2, 96(sp) # 8-byte Folded Reload
45; CHECK-NEXT:    ld s3, 88(sp) # 8-byte Folded Reload
46; CHECK-NEXT:    ld s4, 80(sp) # 8-byte Folded Reload
47; CHECK-NEXT:    ld s5, 72(sp) # 8-byte Folded Reload
48; CHECK-NEXT:    ld s6, 64(sp) # 8-byte Folded Reload
49; CHECK-NEXT:    ld s7, 56(sp) # 8-byte Folded Reload
50; CHECK-NEXT:    ld s8, 48(sp) # 8-byte Folded Reload
51; CHECK-NEXT:    ld s9, 40(sp) # 8-byte Folded Reload
52; CHECK-NEXT:    ld s10, 32(sp) # 8-byte Folded Reload
53; CHECK-NEXT:    ld s11, 24(sp) # 8-byte Folded Reload
54; CHECK-NEXT:    addi sp, sp, 144
55; CHECK-NEXT:    ret
56  tail call void asm sideeffect "", "~{x1},~{x3},~{x4},~{x5},~{x6},~{x7},~{x8},~{x9},~{x10},~{x11},~{x12},~{x13},~{x14},~{x15},~{x16},~{x17},~{x18},~{x19},~{x20},~{x21},~{x22},~{x23},~{x24},~{x25},~{x26},~{x27},~{x28},~{x29},~{x30},~{x31}"()
57  %a = icmp eq i64 %x, 0
58  br i1 %a, label %truebb, label %falsebb
59truebb:
60  %b = icmp slt i32 %y, 0
61  ret i1 %b
62falsebb:
63  ret i1 0
64}
65
66; Make sure we emit an lb for the stack reload in 'truebb' with Zbb.
67define i64 @test_sext_b(i64 %x, i8 %y) nounwind {
68; RV64I-LABEL: test_sext_b:
69; RV64I:       # %bb.0:
70; RV64I-NEXT:    addi sp, sp, -144
71; RV64I-NEXT:    sd ra, 136(sp) # 8-byte Folded Spill
72; RV64I-NEXT:    sd gp, 128(sp) # 8-byte Folded Spill
73; RV64I-NEXT:    sd tp, 120(sp) # 8-byte Folded Spill
74; RV64I-NEXT:    sd s0, 112(sp) # 8-byte Folded Spill
75; RV64I-NEXT:    sd s1, 104(sp) # 8-byte Folded Spill
76; RV64I-NEXT:    sd s2, 96(sp) # 8-byte Folded Spill
77; RV64I-NEXT:    sd s3, 88(sp) # 8-byte Folded Spill
78; RV64I-NEXT:    sd s4, 80(sp) # 8-byte Folded Spill
79; RV64I-NEXT:    sd s5, 72(sp) # 8-byte Folded Spill
80; RV64I-NEXT:    sd s6, 64(sp) # 8-byte Folded Spill
81; RV64I-NEXT:    sd s7, 56(sp) # 8-byte Folded Spill
82; RV64I-NEXT:    sd s8, 48(sp) # 8-byte Folded Spill
83; RV64I-NEXT:    sd s9, 40(sp) # 8-byte Folded Spill
84; RV64I-NEXT:    sd s10, 32(sp) # 8-byte Folded Spill
85; RV64I-NEXT:    sd s11, 24(sp) # 8-byte Folded Spill
86; RV64I-NEXT:    sd a1, 8(sp) # 8-byte Folded Spill
87; RV64I-NEXT:    sd a0, 16(sp) # 8-byte Folded Spill
88; RV64I-NEXT:    #APP
89; RV64I-NEXT:    #NO_APP
90; RV64I-NEXT:    ld a0, 16(sp) # 8-byte Folded Reload
91; RV64I-NEXT:    beqz a0, .LBB1_2
92; RV64I-NEXT:  # %bb.1: # %falsebb
93; RV64I-NEXT:    li a0, 0
94; RV64I-NEXT:    j .LBB1_3
95; RV64I-NEXT:  .LBB1_2: # %truebb
96; RV64I-NEXT:    ld a0, 8(sp) # 8-byte Folded Reload
97; RV64I-NEXT:    slli a0, a0, 56
98; RV64I-NEXT:    srai a0, a0, 56
99; RV64I-NEXT:  .LBB1_3: # %falsebb
100; RV64I-NEXT:    ld ra, 136(sp) # 8-byte Folded Reload
101; RV64I-NEXT:    ld gp, 128(sp) # 8-byte Folded Reload
102; RV64I-NEXT:    ld tp, 120(sp) # 8-byte Folded Reload
103; RV64I-NEXT:    ld s0, 112(sp) # 8-byte Folded Reload
104; RV64I-NEXT:    ld s1, 104(sp) # 8-byte Folded Reload
105; RV64I-NEXT:    ld s2, 96(sp) # 8-byte Folded Reload
106; RV64I-NEXT:    ld s3, 88(sp) # 8-byte Folded Reload
107; RV64I-NEXT:    ld s4, 80(sp) # 8-byte Folded Reload
108; RV64I-NEXT:    ld s5, 72(sp) # 8-byte Folded Reload
109; RV64I-NEXT:    ld s6, 64(sp) # 8-byte Folded Reload
110; RV64I-NEXT:    ld s7, 56(sp) # 8-byte Folded Reload
111; RV64I-NEXT:    ld s8, 48(sp) # 8-byte Folded Reload
112; RV64I-NEXT:    ld s9, 40(sp) # 8-byte Folded Reload
113; RV64I-NEXT:    ld s10, 32(sp) # 8-byte Folded Reload
114; RV64I-NEXT:    ld s11, 24(sp) # 8-byte Folded Reload
115; RV64I-NEXT:    addi sp, sp, 144
116; RV64I-NEXT:    ret
117;
118; RV64ZB-LABEL: test_sext_b:
119; RV64ZB:       # %bb.0:
120; RV64ZB-NEXT:    addi sp, sp, -144
121; RV64ZB-NEXT:    sd ra, 136(sp) # 8-byte Folded Spill
122; RV64ZB-NEXT:    sd gp, 128(sp) # 8-byte Folded Spill
123; RV64ZB-NEXT:    sd tp, 120(sp) # 8-byte Folded Spill
124; RV64ZB-NEXT:    sd s0, 112(sp) # 8-byte Folded Spill
125; RV64ZB-NEXT:    sd s1, 104(sp) # 8-byte Folded Spill
126; RV64ZB-NEXT:    sd s2, 96(sp) # 8-byte Folded Spill
127; RV64ZB-NEXT:    sd s3, 88(sp) # 8-byte Folded Spill
128; RV64ZB-NEXT:    sd s4, 80(sp) # 8-byte Folded Spill
129; RV64ZB-NEXT:    sd s5, 72(sp) # 8-byte Folded Spill
130; RV64ZB-NEXT:    sd s6, 64(sp) # 8-byte Folded Spill
131; RV64ZB-NEXT:    sd s7, 56(sp) # 8-byte Folded Spill
132; RV64ZB-NEXT:    sd s8, 48(sp) # 8-byte Folded Spill
133; RV64ZB-NEXT:    sd s9, 40(sp) # 8-byte Folded Spill
134; RV64ZB-NEXT:    sd s10, 32(sp) # 8-byte Folded Spill
135; RV64ZB-NEXT:    sd s11, 24(sp) # 8-byte Folded Spill
136; RV64ZB-NEXT:    sd a1, 8(sp) # 8-byte Folded Spill
137; RV64ZB-NEXT:    sd a0, 16(sp) # 8-byte Folded Spill
138; RV64ZB-NEXT:    #APP
139; RV64ZB-NEXT:    #NO_APP
140; RV64ZB-NEXT:    ld a0, 16(sp) # 8-byte Folded Reload
141; RV64ZB-NEXT:    beqz a0, .LBB1_2
142; RV64ZB-NEXT:  # %bb.1: # %falsebb
143; RV64ZB-NEXT:    li a0, 0
144; RV64ZB-NEXT:    j .LBB1_3
145; RV64ZB-NEXT:  .LBB1_2: # %truebb
146; RV64ZB-NEXT:    lb a0, 8(sp) # 8-byte Folded Reload
147; RV64ZB-NEXT:  .LBB1_3: # %falsebb
148; RV64ZB-NEXT:    ld ra, 136(sp) # 8-byte Folded Reload
149; RV64ZB-NEXT:    ld gp, 128(sp) # 8-byte Folded Reload
150; RV64ZB-NEXT:    ld tp, 120(sp) # 8-byte Folded Reload
151; RV64ZB-NEXT:    ld s0, 112(sp) # 8-byte Folded Reload
152; RV64ZB-NEXT:    ld s1, 104(sp) # 8-byte Folded Reload
153; RV64ZB-NEXT:    ld s2, 96(sp) # 8-byte Folded Reload
154; RV64ZB-NEXT:    ld s3, 88(sp) # 8-byte Folded Reload
155; RV64ZB-NEXT:    ld s4, 80(sp) # 8-byte Folded Reload
156; RV64ZB-NEXT:    ld s5, 72(sp) # 8-byte Folded Reload
157; RV64ZB-NEXT:    ld s6, 64(sp) # 8-byte Folded Reload
158; RV64ZB-NEXT:    ld s7, 56(sp) # 8-byte Folded Reload
159; RV64ZB-NEXT:    ld s8, 48(sp) # 8-byte Folded Reload
160; RV64ZB-NEXT:    ld s9, 40(sp) # 8-byte Folded Reload
161; RV64ZB-NEXT:    ld s10, 32(sp) # 8-byte Folded Reload
162; RV64ZB-NEXT:    ld s11, 24(sp) # 8-byte Folded Reload
163; RV64ZB-NEXT:    addi sp, sp, 144
164; RV64ZB-NEXT:    ret
165  tail call void asm sideeffect "", "~{x1},~{x3},~{x4},~{x5},~{x6},~{x7},~{x8},~{x9},~{x10},~{x11},~{x12},~{x13},~{x14},~{x15},~{x16},~{x17},~{x18},~{x19},~{x20},~{x21},~{x22},~{x23},~{x24},~{x25},~{x26},~{x27},~{x28},~{x29},~{x30},~{x31}"()
166  %a = icmp eq i64 %x, 0
167  br i1 %a, label %truebb, label %falsebb
168truebb:
169  %b = sext i8 %y to i64
170  ret i64 %b
171falsebb:
172  ret i64 0
173}
174
175; Make sure we emit an lh for the stack reload in 'truebb' with Zbb.
176define i64 @test_sext_h(i64 %x, i16 %y) nounwind {
177; RV64I-LABEL: test_sext_h:
178; RV64I:       # %bb.0:
179; RV64I-NEXT:    addi sp, sp, -144
180; RV64I-NEXT:    sd ra, 136(sp) # 8-byte Folded Spill
181; RV64I-NEXT:    sd gp, 128(sp) # 8-byte Folded Spill
182; RV64I-NEXT:    sd tp, 120(sp) # 8-byte Folded Spill
183; RV64I-NEXT:    sd s0, 112(sp) # 8-byte Folded Spill
184; RV64I-NEXT:    sd s1, 104(sp) # 8-byte Folded Spill
185; RV64I-NEXT:    sd s2, 96(sp) # 8-byte Folded Spill
186; RV64I-NEXT:    sd s3, 88(sp) # 8-byte Folded Spill
187; RV64I-NEXT:    sd s4, 80(sp) # 8-byte Folded Spill
188; RV64I-NEXT:    sd s5, 72(sp) # 8-byte Folded Spill
189; RV64I-NEXT:    sd s6, 64(sp) # 8-byte Folded Spill
190; RV64I-NEXT:    sd s7, 56(sp) # 8-byte Folded Spill
191; RV64I-NEXT:    sd s8, 48(sp) # 8-byte Folded Spill
192; RV64I-NEXT:    sd s9, 40(sp) # 8-byte Folded Spill
193; RV64I-NEXT:    sd s10, 32(sp) # 8-byte Folded Spill
194; RV64I-NEXT:    sd s11, 24(sp) # 8-byte Folded Spill
195; RV64I-NEXT:    sd a1, 8(sp) # 8-byte Folded Spill
196; RV64I-NEXT:    sd a0, 16(sp) # 8-byte Folded Spill
197; RV64I-NEXT:    #APP
198; RV64I-NEXT:    #NO_APP
199; RV64I-NEXT:    ld a0, 16(sp) # 8-byte Folded Reload
200; RV64I-NEXT:    beqz a0, .LBB2_2
201; RV64I-NEXT:  # %bb.1: # %falsebb
202; RV64I-NEXT:    li a0, 0
203; RV64I-NEXT:    j .LBB2_3
204; RV64I-NEXT:  .LBB2_2: # %truebb
205; RV64I-NEXT:    ld a0, 8(sp) # 8-byte Folded Reload
206; RV64I-NEXT:    slli a0, a0, 48
207; RV64I-NEXT:    srai a0, a0, 48
208; RV64I-NEXT:  .LBB2_3: # %falsebb
209; RV64I-NEXT:    ld ra, 136(sp) # 8-byte Folded Reload
210; RV64I-NEXT:    ld gp, 128(sp) # 8-byte Folded Reload
211; RV64I-NEXT:    ld tp, 120(sp) # 8-byte Folded Reload
212; RV64I-NEXT:    ld s0, 112(sp) # 8-byte Folded Reload
213; RV64I-NEXT:    ld s1, 104(sp) # 8-byte Folded Reload
214; RV64I-NEXT:    ld s2, 96(sp) # 8-byte Folded Reload
215; RV64I-NEXT:    ld s3, 88(sp) # 8-byte Folded Reload
216; RV64I-NEXT:    ld s4, 80(sp) # 8-byte Folded Reload
217; RV64I-NEXT:    ld s5, 72(sp) # 8-byte Folded Reload
218; RV64I-NEXT:    ld s6, 64(sp) # 8-byte Folded Reload
219; RV64I-NEXT:    ld s7, 56(sp) # 8-byte Folded Reload
220; RV64I-NEXT:    ld s8, 48(sp) # 8-byte Folded Reload
221; RV64I-NEXT:    ld s9, 40(sp) # 8-byte Folded Reload
222; RV64I-NEXT:    ld s10, 32(sp) # 8-byte Folded Reload
223; RV64I-NEXT:    ld s11, 24(sp) # 8-byte Folded Reload
224; RV64I-NEXT:    addi sp, sp, 144
225; RV64I-NEXT:    ret
226;
227; RV64ZB-LABEL: test_sext_h:
228; RV64ZB:       # %bb.0:
229; RV64ZB-NEXT:    addi sp, sp, -144
230; RV64ZB-NEXT:    sd ra, 136(sp) # 8-byte Folded Spill
231; RV64ZB-NEXT:    sd gp, 128(sp) # 8-byte Folded Spill
232; RV64ZB-NEXT:    sd tp, 120(sp) # 8-byte Folded Spill
233; RV64ZB-NEXT:    sd s0, 112(sp) # 8-byte Folded Spill
234; RV64ZB-NEXT:    sd s1, 104(sp) # 8-byte Folded Spill
235; RV64ZB-NEXT:    sd s2, 96(sp) # 8-byte Folded Spill
236; RV64ZB-NEXT:    sd s3, 88(sp) # 8-byte Folded Spill
237; RV64ZB-NEXT:    sd s4, 80(sp) # 8-byte Folded Spill
238; RV64ZB-NEXT:    sd s5, 72(sp) # 8-byte Folded Spill
239; RV64ZB-NEXT:    sd s6, 64(sp) # 8-byte Folded Spill
240; RV64ZB-NEXT:    sd s7, 56(sp) # 8-byte Folded Spill
241; RV64ZB-NEXT:    sd s8, 48(sp) # 8-byte Folded Spill
242; RV64ZB-NEXT:    sd s9, 40(sp) # 8-byte Folded Spill
243; RV64ZB-NEXT:    sd s10, 32(sp) # 8-byte Folded Spill
244; RV64ZB-NEXT:    sd s11, 24(sp) # 8-byte Folded Spill
245; RV64ZB-NEXT:    sd a1, 8(sp) # 8-byte Folded Spill
246; RV64ZB-NEXT:    sd a0, 16(sp) # 8-byte Folded Spill
247; RV64ZB-NEXT:    #APP
248; RV64ZB-NEXT:    #NO_APP
249; RV64ZB-NEXT:    ld a0, 16(sp) # 8-byte Folded Reload
250; RV64ZB-NEXT:    beqz a0, .LBB2_2
251; RV64ZB-NEXT:  # %bb.1: # %falsebb
252; RV64ZB-NEXT:    li a0, 0
253; RV64ZB-NEXT:    j .LBB2_3
254; RV64ZB-NEXT:  .LBB2_2: # %truebb
255; RV64ZB-NEXT:    lh a0, 8(sp) # 8-byte Folded Reload
256; RV64ZB-NEXT:  .LBB2_3: # %falsebb
257; RV64ZB-NEXT:    ld ra, 136(sp) # 8-byte Folded Reload
258; RV64ZB-NEXT:    ld gp, 128(sp) # 8-byte Folded Reload
259; RV64ZB-NEXT:    ld tp, 120(sp) # 8-byte Folded Reload
260; RV64ZB-NEXT:    ld s0, 112(sp) # 8-byte Folded Reload
261; RV64ZB-NEXT:    ld s1, 104(sp) # 8-byte Folded Reload
262; RV64ZB-NEXT:    ld s2, 96(sp) # 8-byte Folded Reload
263; RV64ZB-NEXT:    ld s3, 88(sp) # 8-byte Folded Reload
264; RV64ZB-NEXT:    ld s4, 80(sp) # 8-byte Folded Reload
265; RV64ZB-NEXT:    ld s5, 72(sp) # 8-byte Folded Reload
266; RV64ZB-NEXT:    ld s6, 64(sp) # 8-byte Folded Reload
267; RV64ZB-NEXT:    ld s7, 56(sp) # 8-byte Folded Reload
268; RV64ZB-NEXT:    ld s8, 48(sp) # 8-byte Folded Reload
269; RV64ZB-NEXT:    ld s9, 40(sp) # 8-byte Folded Reload
270; RV64ZB-NEXT:    ld s10, 32(sp) # 8-byte Folded Reload
271; RV64ZB-NEXT:    ld s11, 24(sp) # 8-byte Folded Reload
272; RV64ZB-NEXT:    addi sp, sp, 144
273; RV64ZB-NEXT:    ret
274  tail call void asm sideeffect "", "~{x1},~{x3},~{x4},~{x5},~{x6},~{x7},~{x8},~{x9},~{x10},~{x11},~{x12},~{x13},~{x14},~{x15},~{x16},~{x17},~{x18},~{x19},~{x20},~{x21},~{x22},~{x23},~{x24},~{x25},~{x26},~{x27},~{x28},~{x29},~{x30},~{x31}"()
275  %a = icmp eq i64 %x, 0
276  br i1 %a, label %truebb, label %falsebb
277truebb:
278  %b = sext i16 %y to i64
279  ret i64 %b
280falsebb:
281  ret i64 0
282}
283
284; Make sure we emit an lbu for the stack reload in 'truebb' with Zbb.
285define i64 @test_zext_b(i64 %x, i8 %y) nounwind {
286; CHECK-LABEL: test_zext_b:
287; CHECK:       # %bb.0:
288; CHECK-NEXT:    addi sp, sp, -144
289; CHECK-NEXT:    sd ra, 136(sp) # 8-byte Folded Spill
290; CHECK-NEXT:    sd gp, 128(sp) # 8-byte Folded Spill
291; CHECK-NEXT:    sd tp, 120(sp) # 8-byte Folded Spill
292; CHECK-NEXT:    sd s0, 112(sp) # 8-byte Folded Spill
293; CHECK-NEXT:    sd s1, 104(sp) # 8-byte Folded Spill
294; CHECK-NEXT:    sd s2, 96(sp) # 8-byte Folded Spill
295; CHECK-NEXT:    sd s3, 88(sp) # 8-byte Folded Spill
296; CHECK-NEXT:    sd s4, 80(sp) # 8-byte Folded Spill
297; CHECK-NEXT:    sd s5, 72(sp) # 8-byte Folded Spill
298; CHECK-NEXT:    sd s6, 64(sp) # 8-byte Folded Spill
299; CHECK-NEXT:    sd s7, 56(sp) # 8-byte Folded Spill
300; CHECK-NEXT:    sd s8, 48(sp) # 8-byte Folded Spill
301; CHECK-NEXT:    sd s9, 40(sp) # 8-byte Folded Spill
302; CHECK-NEXT:    sd s10, 32(sp) # 8-byte Folded Spill
303; CHECK-NEXT:    sd s11, 24(sp) # 8-byte Folded Spill
304; CHECK-NEXT:    sd a1, 8(sp) # 8-byte Folded Spill
305; CHECK-NEXT:    sd a0, 16(sp) # 8-byte Folded Spill
306; CHECK-NEXT:    #APP
307; CHECK-NEXT:    #NO_APP
308; CHECK-NEXT:    ld a0, 16(sp) # 8-byte Folded Reload
309; CHECK-NEXT:    beqz a0, .LBB3_2
310; CHECK-NEXT:  # %bb.1: # %falsebb
311; CHECK-NEXT:    li a0, 0
312; CHECK-NEXT:    j .LBB3_3
313; CHECK-NEXT:  .LBB3_2: # %truebb
314; CHECK-NEXT:    lbu a0, 8(sp) # 8-byte Folded Reload
315; CHECK-NEXT:  .LBB3_3: # %falsebb
316; CHECK-NEXT:    ld ra, 136(sp) # 8-byte Folded Reload
317; CHECK-NEXT:    ld gp, 128(sp) # 8-byte Folded Reload
318; CHECK-NEXT:    ld tp, 120(sp) # 8-byte Folded Reload
319; CHECK-NEXT:    ld s0, 112(sp) # 8-byte Folded Reload
320; CHECK-NEXT:    ld s1, 104(sp) # 8-byte Folded Reload
321; CHECK-NEXT:    ld s2, 96(sp) # 8-byte Folded Reload
322; CHECK-NEXT:    ld s3, 88(sp) # 8-byte Folded Reload
323; CHECK-NEXT:    ld s4, 80(sp) # 8-byte Folded Reload
324; CHECK-NEXT:    ld s5, 72(sp) # 8-byte Folded Reload
325; CHECK-NEXT:    ld s6, 64(sp) # 8-byte Folded Reload
326; CHECK-NEXT:    ld s7, 56(sp) # 8-byte Folded Reload
327; CHECK-NEXT:    ld s8, 48(sp) # 8-byte Folded Reload
328; CHECK-NEXT:    ld s9, 40(sp) # 8-byte Folded Reload
329; CHECK-NEXT:    ld s10, 32(sp) # 8-byte Folded Reload
330; CHECK-NEXT:    ld s11, 24(sp) # 8-byte Folded Reload
331; CHECK-NEXT:    addi sp, sp, 144
332; CHECK-NEXT:    ret
333  tail call void asm sideeffect "", "~{x1},~{x3},~{x4},~{x5},~{x6},~{x7},~{x8},~{x9},~{x10},~{x11},~{x12},~{x13},~{x14},~{x15},~{x16},~{x17},~{x18},~{x19},~{x20},~{x21},~{x22},~{x23},~{x24},~{x25},~{x26},~{x27},~{x28},~{x29},~{x30},~{x31}"()
334  %a = icmp eq i64 %x, 0
335  br i1 %a, label %truebb, label %falsebb
336truebb:
337  %b = zext i8 %y to i64
338  ret i64 %b
339falsebb:
340  ret i64 0
341}
342
343; Make sure we emit an lhu for the stack reload in 'truebb' with Zbb.
344define i64 @test_zext_h(i64 %x, i16 %y) nounwind {
345; RV64I-LABEL: test_zext_h:
346; RV64I:       # %bb.0:
347; RV64I-NEXT:    addi sp, sp, -144
348; RV64I-NEXT:    sd ra, 136(sp) # 8-byte Folded Spill
349; RV64I-NEXT:    sd gp, 128(sp) # 8-byte Folded Spill
350; RV64I-NEXT:    sd tp, 120(sp) # 8-byte Folded Spill
351; RV64I-NEXT:    sd s0, 112(sp) # 8-byte Folded Spill
352; RV64I-NEXT:    sd s1, 104(sp) # 8-byte Folded Spill
353; RV64I-NEXT:    sd s2, 96(sp) # 8-byte Folded Spill
354; RV64I-NEXT:    sd s3, 88(sp) # 8-byte Folded Spill
355; RV64I-NEXT:    sd s4, 80(sp) # 8-byte Folded Spill
356; RV64I-NEXT:    sd s5, 72(sp) # 8-byte Folded Spill
357; RV64I-NEXT:    sd s6, 64(sp) # 8-byte Folded Spill
358; RV64I-NEXT:    sd s7, 56(sp) # 8-byte Folded Spill
359; RV64I-NEXT:    sd s8, 48(sp) # 8-byte Folded Spill
360; RV64I-NEXT:    sd s9, 40(sp) # 8-byte Folded Spill
361; RV64I-NEXT:    sd s10, 32(sp) # 8-byte Folded Spill
362; RV64I-NEXT:    sd s11, 24(sp) # 8-byte Folded Spill
363; RV64I-NEXT:    sd a1, 8(sp) # 8-byte Folded Spill
364; RV64I-NEXT:    sd a0, 16(sp) # 8-byte Folded Spill
365; RV64I-NEXT:    #APP
366; RV64I-NEXT:    #NO_APP
367; RV64I-NEXT:    ld a0, 16(sp) # 8-byte Folded Reload
368; RV64I-NEXT:    beqz a0, .LBB4_2
369; RV64I-NEXT:  # %bb.1: # %falsebb
370; RV64I-NEXT:    li a0, 0
371; RV64I-NEXT:    j .LBB4_3
372; RV64I-NEXT:  .LBB4_2: # %truebb
373; RV64I-NEXT:    ld a0, 8(sp) # 8-byte Folded Reload
374; RV64I-NEXT:    slli a0, a0, 48
375; RV64I-NEXT:    srli a0, a0, 48
376; RV64I-NEXT:  .LBB4_3: # %falsebb
377; RV64I-NEXT:    ld ra, 136(sp) # 8-byte Folded Reload
378; RV64I-NEXT:    ld gp, 128(sp) # 8-byte Folded Reload
379; RV64I-NEXT:    ld tp, 120(sp) # 8-byte Folded Reload
380; RV64I-NEXT:    ld s0, 112(sp) # 8-byte Folded Reload
381; RV64I-NEXT:    ld s1, 104(sp) # 8-byte Folded Reload
382; RV64I-NEXT:    ld s2, 96(sp) # 8-byte Folded Reload
383; RV64I-NEXT:    ld s3, 88(sp) # 8-byte Folded Reload
384; RV64I-NEXT:    ld s4, 80(sp) # 8-byte Folded Reload
385; RV64I-NEXT:    ld s5, 72(sp) # 8-byte Folded Reload
386; RV64I-NEXT:    ld s6, 64(sp) # 8-byte Folded Reload
387; RV64I-NEXT:    ld s7, 56(sp) # 8-byte Folded Reload
388; RV64I-NEXT:    ld s8, 48(sp) # 8-byte Folded Reload
389; RV64I-NEXT:    ld s9, 40(sp) # 8-byte Folded Reload
390; RV64I-NEXT:    ld s10, 32(sp) # 8-byte Folded Reload
391; RV64I-NEXT:    ld s11, 24(sp) # 8-byte Folded Reload
392; RV64I-NEXT:    addi sp, sp, 144
393; RV64I-NEXT:    ret
394;
395; RV64ZB-LABEL: test_zext_h:
396; RV64ZB:       # %bb.0:
397; RV64ZB-NEXT:    addi sp, sp, -144
398; RV64ZB-NEXT:    sd ra, 136(sp) # 8-byte Folded Spill
399; RV64ZB-NEXT:    sd gp, 128(sp) # 8-byte Folded Spill
400; RV64ZB-NEXT:    sd tp, 120(sp) # 8-byte Folded Spill
401; RV64ZB-NEXT:    sd s0, 112(sp) # 8-byte Folded Spill
402; RV64ZB-NEXT:    sd s1, 104(sp) # 8-byte Folded Spill
403; RV64ZB-NEXT:    sd s2, 96(sp) # 8-byte Folded Spill
404; RV64ZB-NEXT:    sd s3, 88(sp) # 8-byte Folded Spill
405; RV64ZB-NEXT:    sd s4, 80(sp) # 8-byte Folded Spill
406; RV64ZB-NEXT:    sd s5, 72(sp) # 8-byte Folded Spill
407; RV64ZB-NEXT:    sd s6, 64(sp) # 8-byte Folded Spill
408; RV64ZB-NEXT:    sd s7, 56(sp) # 8-byte Folded Spill
409; RV64ZB-NEXT:    sd s8, 48(sp) # 8-byte Folded Spill
410; RV64ZB-NEXT:    sd s9, 40(sp) # 8-byte Folded Spill
411; RV64ZB-NEXT:    sd s10, 32(sp) # 8-byte Folded Spill
412; RV64ZB-NEXT:    sd s11, 24(sp) # 8-byte Folded Spill
413; RV64ZB-NEXT:    sd a1, 8(sp) # 8-byte Folded Spill
414; RV64ZB-NEXT:    sd a0, 16(sp) # 8-byte Folded Spill
415; RV64ZB-NEXT:    #APP
416; RV64ZB-NEXT:    #NO_APP
417; RV64ZB-NEXT:    ld a0, 16(sp) # 8-byte Folded Reload
418; RV64ZB-NEXT:    beqz a0, .LBB4_2
419; RV64ZB-NEXT:  # %bb.1: # %falsebb
420; RV64ZB-NEXT:    li a0, 0
421; RV64ZB-NEXT:    j .LBB4_3
422; RV64ZB-NEXT:  .LBB4_2: # %truebb
423; RV64ZB-NEXT:    lhu a0, 8(sp) # 8-byte Folded Reload
424; RV64ZB-NEXT:  .LBB4_3: # %falsebb
425; RV64ZB-NEXT:    ld ra, 136(sp) # 8-byte Folded Reload
426; RV64ZB-NEXT:    ld gp, 128(sp) # 8-byte Folded Reload
427; RV64ZB-NEXT:    ld tp, 120(sp) # 8-byte Folded Reload
428; RV64ZB-NEXT:    ld s0, 112(sp) # 8-byte Folded Reload
429; RV64ZB-NEXT:    ld s1, 104(sp) # 8-byte Folded Reload
430; RV64ZB-NEXT:    ld s2, 96(sp) # 8-byte Folded Reload
431; RV64ZB-NEXT:    ld s3, 88(sp) # 8-byte Folded Reload
432; RV64ZB-NEXT:    ld s4, 80(sp) # 8-byte Folded Reload
433; RV64ZB-NEXT:    ld s5, 72(sp) # 8-byte Folded Reload
434; RV64ZB-NEXT:    ld s6, 64(sp) # 8-byte Folded Reload
435; RV64ZB-NEXT:    ld s7, 56(sp) # 8-byte Folded Reload
436; RV64ZB-NEXT:    ld s8, 48(sp) # 8-byte Folded Reload
437; RV64ZB-NEXT:    ld s9, 40(sp) # 8-byte Folded Reload
438; RV64ZB-NEXT:    ld s10, 32(sp) # 8-byte Folded Reload
439; RV64ZB-NEXT:    ld s11, 24(sp) # 8-byte Folded Reload
440; RV64ZB-NEXT:    addi sp, sp, 144
441; RV64ZB-NEXT:    ret
442  tail call void asm sideeffect "", "~{x1},~{x3},~{x4},~{x5},~{x6},~{x7},~{x8},~{x9},~{x10},~{x11},~{x12},~{x13},~{x14},~{x15},~{x16},~{x17},~{x18},~{x19},~{x20},~{x21},~{x22},~{x23},~{x24},~{x25},~{x26},~{x27},~{x28},~{x29},~{x30},~{x31}"()
443  %a = icmp eq i64 %x, 0
444  br i1 %a, label %truebb, label %falsebb
445truebb:
446  %b = zext i16 %y to i64
447  ret i64 %b
448falsebb:
449  ret i64 0
450}
451
452; Make sure we emit an lwu for the stack reload in 'truebb' with Zbb.
453define i64 @test_zext_w(i64 %x, i32 %y) nounwind {
454; RV64I-LABEL: test_zext_w:
455; RV64I:       # %bb.0:
456; RV64I-NEXT:    addi sp, sp, -144
457; RV64I-NEXT:    sd ra, 136(sp) # 8-byte Folded Spill
458; RV64I-NEXT:    sd gp, 128(sp) # 8-byte Folded Spill
459; RV64I-NEXT:    sd tp, 120(sp) # 8-byte Folded Spill
460; RV64I-NEXT:    sd s0, 112(sp) # 8-byte Folded Spill
461; RV64I-NEXT:    sd s1, 104(sp) # 8-byte Folded Spill
462; RV64I-NEXT:    sd s2, 96(sp) # 8-byte Folded Spill
463; RV64I-NEXT:    sd s3, 88(sp) # 8-byte Folded Spill
464; RV64I-NEXT:    sd s4, 80(sp) # 8-byte Folded Spill
465; RV64I-NEXT:    sd s5, 72(sp) # 8-byte Folded Spill
466; RV64I-NEXT:    sd s6, 64(sp) # 8-byte Folded Spill
467; RV64I-NEXT:    sd s7, 56(sp) # 8-byte Folded Spill
468; RV64I-NEXT:    sd s8, 48(sp) # 8-byte Folded Spill
469; RV64I-NEXT:    sd s9, 40(sp) # 8-byte Folded Spill
470; RV64I-NEXT:    sd s10, 32(sp) # 8-byte Folded Spill
471; RV64I-NEXT:    sd s11, 24(sp) # 8-byte Folded Spill
472; RV64I-NEXT:    sd a1, 8(sp) # 8-byte Folded Spill
473; RV64I-NEXT:    sd a0, 16(sp) # 8-byte Folded Spill
474; RV64I-NEXT:    #APP
475; RV64I-NEXT:    #NO_APP
476; RV64I-NEXT:    ld a0, 16(sp) # 8-byte Folded Reload
477; RV64I-NEXT:    beqz a0, .LBB5_2
478; RV64I-NEXT:  # %bb.1: # %falsebb
479; RV64I-NEXT:    li a0, 0
480; RV64I-NEXT:    j .LBB5_3
481; RV64I-NEXT:  .LBB5_2: # %truebb
482; RV64I-NEXT:    ld a0, 8(sp) # 8-byte Folded Reload
483; RV64I-NEXT:    slli a0, a0, 32
484; RV64I-NEXT:    srli a0, a0, 32
485; RV64I-NEXT:  .LBB5_3: # %falsebb
486; RV64I-NEXT:    ld ra, 136(sp) # 8-byte Folded Reload
487; RV64I-NEXT:    ld gp, 128(sp) # 8-byte Folded Reload
488; RV64I-NEXT:    ld tp, 120(sp) # 8-byte Folded Reload
489; RV64I-NEXT:    ld s0, 112(sp) # 8-byte Folded Reload
490; RV64I-NEXT:    ld s1, 104(sp) # 8-byte Folded Reload
491; RV64I-NEXT:    ld s2, 96(sp) # 8-byte Folded Reload
492; RV64I-NEXT:    ld s3, 88(sp) # 8-byte Folded Reload
493; RV64I-NEXT:    ld s4, 80(sp) # 8-byte Folded Reload
494; RV64I-NEXT:    ld s5, 72(sp) # 8-byte Folded Reload
495; RV64I-NEXT:    ld s6, 64(sp) # 8-byte Folded Reload
496; RV64I-NEXT:    ld s7, 56(sp) # 8-byte Folded Reload
497; RV64I-NEXT:    ld s8, 48(sp) # 8-byte Folded Reload
498; RV64I-NEXT:    ld s9, 40(sp) # 8-byte Folded Reload
499; RV64I-NEXT:    ld s10, 32(sp) # 8-byte Folded Reload
500; RV64I-NEXT:    ld s11, 24(sp) # 8-byte Folded Reload
501; RV64I-NEXT:    addi sp, sp, 144
502; RV64I-NEXT:    ret
503;
504; RV64ZB-LABEL: test_zext_w:
505; RV64ZB:       # %bb.0:
506; RV64ZB-NEXT:    addi sp, sp, -144
507; RV64ZB-NEXT:    sd ra, 136(sp) # 8-byte Folded Spill
508; RV64ZB-NEXT:    sd gp, 128(sp) # 8-byte Folded Spill
509; RV64ZB-NEXT:    sd tp, 120(sp) # 8-byte Folded Spill
510; RV64ZB-NEXT:    sd s0, 112(sp) # 8-byte Folded Spill
511; RV64ZB-NEXT:    sd s1, 104(sp) # 8-byte Folded Spill
512; RV64ZB-NEXT:    sd s2, 96(sp) # 8-byte Folded Spill
513; RV64ZB-NEXT:    sd s3, 88(sp) # 8-byte Folded Spill
514; RV64ZB-NEXT:    sd s4, 80(sp) # 8-byte Folded Spill
515; RV64ZB-NEXT:    sd s5, 72(sp) # 8-byte Folded Spill
516; RV64ZB-NEXT:    sd s6, 64(sp) # 8-byte Folded Spill
517; RV64ZB-NEXT:    sd s7, 56(sp) # 8-byte Folded Spill
518; RV64ZB-NEXT:    sd s8, 48(sp) # 8-byte Folded Spill
519; RV64ZB-NEXT:    sd s9, 40(sp) # 8-byte Folded Spill
520; RV64ZB-NEXT:    sd s10, 32(sp) # 8-byte Folded Spill
521; RV64ZB-NEXT:    sd s11, 24(sp) # 8-byte Folded Spill
522; RV64ZB-NEXT:    sd a1, 8(sp) # 8-byte Folded Spill
523; RV64ZB-NEXT:    sd a0, 16(sp) # 8-byte Folded Spill
524; RV64ZB-NEXT:    #APP
525; RV64ZB-NEXT:    #NO_APP
526; RV64ZB-NEXT:    ld a0, 16(sp) # 8-byte Folded Reload
527; RV64ZB-NEXT:    beqz a0, .LBB5_2
528; RV64ZB-NEXT:  # %bb.1: # %falsebb
529; RV64ZB-NEXT:    li a0, 0
530; RV64ZB-NEXT:    j .LBB5_3
531; RV64ZB-NEXT:  .LBB5_2: # %truebb
532; RV64ZB-NEXT:    lwu a0, 8(sp) # 8-byte Folded Reload
533; RV64ZB-NEXT:  .LBB5_3: # %falsebb
534; RV64ZB-NEXT:    ld ra, 136(sp) # 8-byte Folded Reload
535; RV64ZB-NEXT:    ld gp, 128(sp) # 8-byte Folded Reload
536; RV64ZB-NEXT:    ld tp, 120(sp) # 8-byte Folded Reload
537; RV64ZB-NEXT:    ld s0, 112(sp) # 8-byte Folded Reload
538; RV64ZB-NEXT:    ld s1, 104(sp) # 8-byte Folded Reload
539; RV64ZB-NEXT:    ld s2, 96(sp) # 8-byte Folded Reload
540; RV64ZB-NEXT:    ld s3, 88(sp) # 8-byte Folded Reload
541; RV64ZB-NEXT:    ld s4, 80(sp) # 8-byte Folded Reload
542; RV64ZB-NEXT:    ld s5, 72(sp) # 8-byte Folded Reload
543; RV64ZB-NEXT:    ld s6, 64(sp) # 8-byte Folded Reload
544; RV64ZB-NEXT:    ld s7, 56(sp) # 8-byte Folded Reload
545; RV64ZB-NEXT:    ld s8, 48(sp) # 8-byte Folded Reload
546; RV64ZB-NEXT:    ld s9, 40(sp) # 8-byte Folded Reload
547; RV64ZB-NEXT:    ld s10, 32(sp) # 8-byte Folded Reload
548; RV64ZB-NEXT:    ld s11, 24(sp) # 8-byte Folded Reload
549; RV64ZB-NEXT:    addi sp, sp, 144
550; RV64ZB-NEXT:    ret
551  tail call void asm sideeffect "", "~{x1},~{x3},~{x4},~{x5},~{x6},~{x7},~{x8},~{x9},~{x10},~{x11},~{x12},~{x13},~{x14},~{x15},~{x16},~{x17},~{x18},~{x19},~{x20},~{x21},~{x22},~{x23},~{x24},~{x25},~{x26},~{x27},~{x28},~{x29},~{x30},~{x31}"()
552  %a = icmp eq i64 %x, 0
553  br i1 %a, label %truebb, label %falsebb
554truebb:
555  %b = zext i32 %y to i64
556  ret i64 %b
557falsebb:
558  ret i64 0
559}
560