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