1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -O0 -mtriple=riscv32 -mattr=+xcvbi -verify-machineinstrs < %s \ 3; RUN: | FileCheck %s --check-prefixes=CHECK_NOPT 4; RUN: llc -O3 -mtriple=riscv32 -mattr=+xcvbi -verify-machineinstrs < %s \ 5; RUN: | FileCheck %s --check-prefixes=CHECK_OPT 6 7define i32 @beqimm(i32 %a) { 8; CHECK_NOPT-LABEL: beqimm: 9; CHECK_NOPT: # %bb.0: 10; CHECK_NOPT-NEXT: cv.beqimm a0, 5, .LBB0_2 11; CHECK_NOPT-NEXT: j .LBB0_1 12; CHECK_NOPT-NEXT: .LBB0_1: # %f 13; CHECK_NOPT-NEXT: li a0, 0 14; CHECK_NOPT-NEXT: ret 15; CHECK_NOPT-NEXT: .LBB0_2: # %t 16; CHECK_NOPT-NEXT: li a0, 1 17; CHECK_NOPT-NEXT: ret 18; 19; CHECK_OPT-LABEL: beqimm: 20; CHECK_OPT: # %bb.0: 21; CHECK_OPT-NEXT: cv.bneimm a0, 5, .LBB0_2 22; CHECK_OPT-NEXT: # %bb.1: # %t 23; CHECK_OPT-NEXT: li a0, 1 24; CHECK_OPT-NEXT: ret 25; CHECK_OPT-NEXT: .LBB0_2: # %f 26; CHECK_OPT-NEXT: li a0, 0 27; CHECK_OPT-NEXT: ret 28 %1 = icmp eq i32 %a, 5 29 br i1 %1, label %t, label %f 30f: 31 ret i32 0 32t: 33 ret i32 1 34} 35 36define i32 @bneimm(i32 %a) { 37; CHECK_NOPT-LABEL: bneimm: 38; CHECK_NOPT: # %bb.0: 39; CHECK_NOPT-NEXT: cv.bneimm a0, 5, .LBB1_2 40; CHECK_NOPT-NEXT: j .LBB1_1 41; CHECK_NOPT-NEXT: .LBB1_1: # %f 42; CHECK_NOPT-NEXT: li a0, 0 43; CHECK_NOPT-NEXT: ret 44; CHECK_NOPT-NEXT: .LBB1_2: # %t 45; CHECK_NOPT-NEXT: li a0, 1 46; CHECK_NOPT-NEXT: ret 47; 48; CHECK_OPT-LABEL: bneimm: 49; CHECK_OPT: # %bb.0: 50; CHECK_OPT-NEXT: cv.beqimm a0, 5, .LBB1_2 51; CHECK_OPT-NEXT: # %bb.1: # %t 52; CHECK_OPT-NEXT: li a0, 1 53; CHECK_OPT-NEXT: ret 54; CHECK_OPT-NEXT: .LBB1_2: # %f 55; CHECK_OPT-NEXT: li a0, 0 56; CHECK_OPT-NEXT: ret 57 %1 = icmp ne i32 %a, 5 58 br i1 %1, label %t, label %f 59f: 60 ret i32 0 61t: 62 ret i32 1 63} 64 65define i32 @select_beqimm_1(i32 %a, i32 %x, i32 %y) { 66; CHECK_NOPT-LABEL: select_beqimm_1: 67; CHECK_NOPT: # %bb.0: # %entry 68; CHECK_NOPT-NEXT: addi sp, sp, -16 69; CHECK_NOPT-NEXT: .cfi_def_cfa_offset 16 70; CHECK_NOPT-NEXT: sw a1, 8(sp) # 4-byte Folded Spill 71; CHECK_NOPT-NEXT: sw a2, 12(sp) # 4-byte Folded Spill 72; CHECK_NOPT-NEXT: cv.beqimm a0, -16, .LBB2_2 73; CHECK_NOPT-NEXT: # %bb.1: # %entry 74; CHECK_NOPT-NEXT: lw a0, 8(sp) # 4-byte Folded Reload 75; CHECK_NOPT-NEXT: sw a0, 12(sp) # 4-byte Folded Spill 76; CHECK_NOPT-NEXT: .LBB2_2: # %entry 77; CHECK_NOPT-NEXT: lw a0, 12(sp) # 4-byte Folded Reload 78; CHECK_NOPT-NEXT: addi sp, sp, 16 79; CHECK_NOPT-NEXT: .cfi_def_cfa_offset 0 80; CHECK_NOPT-NEXT: ret 81; 82; CHECK_OPT-LABEL: select_beqimm_1: 83; CHECK_OPT: # %bb.0: # %entry 84; CHECK_OPT-NEXT: cv.beqimm a0, -16, .LBB2_2 85; CHECK_OPT-NEXT: # %bb.1: # %entry 86; CHECK_OPT-NEXT: mv a2, a1 87; CHECK_OPT-NEXT: .LBB2_2: # %entry 88; CHECK_OPT-NEXT: mv a0, a2 89; CHECK_OPT-NEXT: ret 90entry: 91 %cmp.not = icmp eq i32 %a, -16 92 %cond = select i1 %cmp.not, i32 %y, i32 %x 93 ret i32 %cond 94} 95 96define i32 @select_beqimm_2(i32 %a, i32 %x, i32 %y) { 97; CHECK_NOPT-LABEL: select_beqimm_2: 98; CHECK_NOPT: # %bb.0: # %entry 99; CHECK_NOPT-NEXT: addi sp, sp, -16 100; CHECK_NOPT-NEXT: .cfi_def_cfa_offset 16 101; CHECK_NOPT-NEXT: sw a1, 8(sp) # 4-byte Folded Spill 102; CHECK_NOPT-NEXT: sw a2, 12(sp) # 4-byte Folded Spill 103; CHECK_NOPT-NEXT: cv.beqimm a0, 0, .LBB3_2 104; CHECK_NOPT-NEXT: # %bb.1: # %entry 105; CHECK_NOPT-NEXT: lw a0, 8(sp) # 4-byte Folded Reload 106; CHECK_NOPT-NEXT: sw a0, 12(sp) # 4-byte Folded Spill 107; CHECK_NOPT-NEXT: .LBB3_2: # %entry 108; CHECK_NOPT-NEXT: lw a0, 12(sp) # 4-byte Folded Reload 109; CHECK_NOPT-NEXT: addi sp, sp, 16 110; CHECK_NOPT-NEXT: .cfi_def_cfa_offset 0 111; CHECK_NOPT-NEXT: ret 112; 113; CHECK_OPT-LABEL: select_beqimm_2: 114; CHECK_OPT: # %bb.0: # %entry 115; CHECK_OPT-NEXT: cv.beqimm a0, 0, .LBB3_2 116; CHECK_OPT-NEXT: # %bb.1: # %entry 117; CHECK_OPT-NEXT: mv a2, a1 118; CHECK_OPT-NEXT: .LBB3_2: # %entry 119; CHECK_OPT-NEXT: mv a0, a2 120; CHECK_OPT-NEXT: ret 121entry: 122 %cmp.not = icmp eq i32 %a, 0 123 %cond = select i1 %cmp.not, i32 %y, i32 %x 124 ret i32 %cond 125} 126 127define i32 @select_beqimm_3(i32 %a, i32 %x, i32 %y) { 128; CHECK_NOPT-LABEL: select_beqimm_3: 129; CHECK_NOPT: # %bb.0: # %entry 130; CHECK_NOPT-NEXT: addi sp, sp, -16 131; CHECK_NOPT-NEXT: .cfi_def_cfa_offset 16 132; CHECK_NOPT-NEXT: sw a1, 8(sp) # 4-byte Folded Spill 133; CHECK_NOPT-NEXT: sw a2, 12(sp) # 4-byte Folded Spill 134; CHECK_NOPT-NEXT: cv.beqimm a0, 15, .LBB4_2 135; CHECK_NOPT-NEXT: # %bb.1: # %entry 136; CHECK_NOPT-NEXT: lw a0, 8(sp) # 4-byte Folded Reload 137; CHECK_NOPT-NEXT: sw a0, 12(sp) # 4-byte Folded Spill 138; CHECK_NOPT-NEXT: .LBB4_2: # %entry 139; CHECK_NOPT-NEXT: lw a0, 12(sp) # 4-byte Folded Reload 140; CHECK_NOPT-NEXT: addi sp, sp, 16 141; CHECK_NOPT-NEXT: .cfi_def_cfa_offset 0 142; CHECK_NOPT-NEXT: ret 143; 144; CHECK_OPT-LABEL: select_beqimm_3: 145; CHECK_OPT: # %bb.0: # %entry 146; CHECK_OPT-NEXT: cv.beqimm a0, 15, .LBB4_2 147; CHECK_OPT-NEXT: # %bb.1: # %entry 148; CHECK_OPT-NEXT: mv a2, a1 149; CHECK_OPT-NEXT: .LBB4_2: # %entry 150; CHECK_OPT-NEXT: mv a0, a2 151; CHECK_OPT-NEXT: ret 152entry: 153 %cmp.not = icmp eq i32 %a, 15 154 %cond = select i1 %cmp.not, i32 %y, i32 %x 155 ret i32 %cond 156} 157 158define i32 @select_no_beqimm_1(i32 %a, i32 %x, i32 %y) { 159; CHECK_NOPT-LABEL: select_no_beqimm_1: 160; CHECK_NOPT: # %bb.0: # %entry 161; CHECK_NOPT-NEXT: addi sp, sp, -16 162; CHECK_NOPT-NEXT: .cfi_def_cfa_offset 16 163; CHECK_NOPT-NEXT: sw a1, 8(sp) # 4-byte Folded Spill 164; CHECK_NOPT-NEXT: li a1, -17 165; CHECK_NOPT-NEXT: sw a2, 12(sp) # 4-byte Folded Spill 166; CHECK_NOPT-NEXT: beq a0, a1, .LBB5_2 167; CHECK_NOPT-NEXT: # %bb.1: # %entry 168; CHECK_NOPT-NEXT: lw a0, 8(sp) # 4-byte Folded Reload 169; CHECK_NOPT-NEXT: sw a0, 12(sp) # 4-byte Folded Spill 170; CHECK_NOPT-NEXT: .LBB5_2: # %entry 171; CHECK_NOPT-NEXT: lw a0, 12(sp) # 4-byte Folded Reload 172; CHECK_NOPT-NEXT: addi sp, sp, 16 173; CHECK_NOPT-NEXT: .cfi_def_cfa_offset 0 174; CHECK_NOPT-NEXT: ret 175; 176; CHECK_OPT-LABEL: select_no_beqimm_1: 177; CHECK_OPT: # %bb.0: # %entry 178; CHECK_OPT-NEXT: li a3, -17 179; CHECK_OPT-NEXT: beq a0, a3, .LBB5_2 180; CHECK_OPT-NEXT: # %bb.1: # %entry 181; CHECK_OPT-NEXT: mv a2, a1 182; CHECK_OPT-NEXT: .LBB5_2: # %entry 183; CHECK_OPT-NEXT: mv a0, a2 184; CHECK_OPT-NEXT: ret 185entry: 186 %cmp.not = icmp eq i32 %a, -17 187 %cond = select i1 %cmp.not, i32 %y, i32 %x 188 ret i32 %cond 189} 190 191define i32 @select_no_beqimm_2(i32 %a, i32 %x, i32 %y) { 192; CHECK_NOPT-LABEL: select_no_beqimm_2: 193; CHECK_NOPT: # %bb.0: # %entry 194; CHECK_NOPT-NEXT: addi sp, sp, -16 195; CHECK_NOPT-NEXT: .cfi_def_cfa_offset 16 196; CHECK_NOPT-NEXT: sw a1, 8(sp) # 4-byte Folded Spill 197; CHECK_NOPT-NEXT: li a1, 16 198; CHECK_NOPT-NEXT: sw a2, 12(sp) # 4-byte Folded Spill 199; CHECK_NOPT-NEXT: beq a0, a1, .LBB6_2 200; CHECK_NOPT-NEXT: # %bb.1: # %entry 201; CHECK_NOPT-NEXT: lw a0, 8(sp) # 4-byte Folded Reload 202; CHECK_NOPT-NEXT: sw a0, 12(sp) # 4-byte Folded Spill 203; CHECK_NOPT-NEXT: .LBB6_2: # %entry 204; CHECK_NOPT-NEXT: lw a0, 12(sp) # 4-byte Folded Reload 205; CHECK_NOPT-NEXT: addi sp, sp, 16 206; CHECK_NOPT-NEXT: .cfi_def_cfa_offset 0 207; CHECK_NOPT-NEXT: ret 208; 209; CHECK_OPT-LABEL: select_no_beqimm_2: 210; CHECK_OPT: # %bb.0: # %entry 211; CHECK_OPT-NEXT: li a3, 16 212; CHECK_OPT-NEXT: beq a0, a3, .LBB6_2 213; CHECK_OPT-NEXT: # %bb.1: # %entry 214; CHECK_OPT-NEXT: mv a2, a1 215; CHECK_OPT-NEXT: .LBB6_2: # %entry 216; CHECK_OPT-NEXT: mv a0, a2 217; CHECK_OPT-NEXT: ret 218entry: 219 %cmp.not = icmp eq i32 %a, 16 220 %cond = select i1 %cmp.not, i32 %y, i32 %x 221 ret i32 %cond 222} 223 224define i32 @select_bneimm_1(i32 %a, i32 %x, i32 %y) { 225; CHECK_NOPT-LABEL: select_bneimm_1: 226; CHECK_NOPT: # %bb.0: # %entry 227; CHECK_NOPT-NEXT: addi sp, sp, -16 228; CHECK_NOPT-NEXT: .cfi_def_cfa_offset 16 229; CHECK_NOPT-NEXT: sw a1, 8(sp) # 4-byte Folded Spill 230; CHECK_NOPT-NEXT: sw a2, 12(sp) # 4-byte Folded Spill 231; CHECK_NOPT-NEXT: cv.bneimm a0, 0, .LBB7_2 232; CHECK_NOPT-NEXT: # %bb.1: # %entry 233; CHECK_NOPT-NEXT: lw a0, 8(sp) # 4-byte Folded Reload 234; CHECK_NOPT-NEXT: sw a0, 12(sp) # 4-byte Folded Spill 235; CHECK_NOPT-NEXT: .LBB7_2: # %entry 236; CHECK_NOPT-NEXT: lw a0, 12(sp) # 4-byte Folded Reload 237; CHECK_NOPT-NEXT: addi sp, sp, 16 238; CHECK_NOPT-NEXT: .cfi_def_cfa_offset 0 239; CHECK_NOPT-NEXT: ret 240; 241; CHECK_OPT-LABEL: select_bneimm_1: 242; CHECK_OPT: # %bb.0: # %entry 243; CHECK_OPT-NEXT: cv.bneimm a0, 0, .LBB7_2 244; CHECK_OPT-NEXT: # %bb.1: # %entry 245; CHECK_OPT-NEXT: mv a2, a1 246; CHECK_OPT-NEXT: .LBB7_2: # %entry 247; CHECK_OPT-NEXT: mv a0, a2 248; CHECK_OPT-NEXT: ret 249entry: 250 %cmp.not = icmp ne i32 %a, 0 251 %cond = select i1 %cmp.not, i32 %y, i32 %x 252 ret i32 %cond 253} 254 255