1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2; RUN: llc -mtriple=riscv32 -global-isel < %s | FileCheck %s --check-prefixes=CHECK,CHECKI,RV32 3; RUN: llc -mtriple=riscv64 -global-isel < %s | FileCheck %s --check-prefixes=CHECK,CHECKI,RV64 4; RUN: llc -mtriple=riscv32 -mattr=+f -global-isel < %s | FileCheck %s --check-prefixes=CHECK,CHECKIF,RV32 5; RUN: llc -mtriple=riscv64 -mattr=+f -global-isel < %s | FileCheck %s --check-prefixes=CHECK,CHECKIF,RV64 6 7define i1 @phi_i1(i1 %cnd, i1 %a, i1 %b) { 8; CHECK-LABEL: phi_i1: 9; CHECK: # %bb.0: # %entry 10; CHECK-NEXT: mv a3, a0 11; CHECK-NEXT: mv a0, a1 12; CHECK-NEXT: andi a3, a3, 1 13; CHECK-NEXT: bnez a3, .LBB0_2 14; CHECK-NEXT: # %bb.1: # %cond.false 15; CHECK-NEXT: mv a0, a2 16; CHECK-NEXT: .LBB0_2: # %cond.end 17; CHECK-NEXT: ret 18entry: 19 br i1 %cnd, label %cond.end, label %cond.false 20 21cond.false: ; preds = %entry 22 br label %cond.end 23 24cond.end: ; preds = %entry, %cond.false 25 %cond = phi i1 [ %b, %cond.false ], [ %a, %entry ] 26 ret i1 %cond 27} 28 29define i8 @phi_i8(i1 %cnd, i8 %a, i8 %b) { 30; CHECK-LABEL: phi_i8: 31; CHECK: # %bb.0: # %entry 32; CHECK-NEXT: mv a3, a0 33; CHECK-NEXT: mv a0, a1 34; CHECK-NEXT: andi a3, a3, 1 35; CHECK-NEXT: bnez a3, .LBB1_2 36; CHECK-NEXT: # %bb.1: # %cond.false 37; CHECK-NEXT: mv a0, a2 38; CHECK-NEXT: .LBB1_2: # %cond.end 39; CHECK-NEXT: ret 40entry: 41 br i1 %cnd, label %cond.end, label %cond.false 42 43cond.false: ; preds = %entry 44 br label %cond.end 45 46cond.end: ; preds = %entry, %cond.false 47 %cond = phi i8 [ %b, %cond.false ], [ %a, %entry ] 48 ret i8 %cond 49} 50 51define i16 @phi_i16(i1 %cnd, i16 %a, i16 %b) { 52; CHECK-LABEL: phi_i16: 53; CHECK: # %bb.0: # %entry 54; CHECK-NEXT: mv a3, a0 55; CHECK-NEXT: mv a0, a1 56; CHECK-NEXT: andi a3, a3, 1 57; CHECK-NEXT: bnez a3, .LBB2_2 58; CHECK-NEXT: # %bb.1: # %cond.false 59; CHECK-NEXT: mv a0, a2 60; CHECK-NEXT: .LBB2_2: # %cond.end 61; CHECK-NEXT: ret 62entry: 63 br i1 %cnd, label %cond.end, label %cond.false 64 65cond.false: ; preds = %entry 66 br label %cond.end 67 68cond.end: ; preds = %entry, %cond.false 69 %cond = phi i16 [ %b, %cond.false ], [ %a, %entry ] 70 ret i16 %cond 71} 72 73define i32 @phi_i32(i1 %cnd, i32 %a, i32 %b) { 74; CHECK-LABEL: phi_i32: 75; CHECK: # %bb.0: # %entry 76; CHECK-NEXT: mv a3, a0 77; CHECK-NEXT: mv a0, a1 78; CHECK-NEXT: andi a3, a3, 1 79; CHECK-NEXT: bnez a3, .LBB3_2 80; CHECK-NEXT: # %bb.1: # %cond.false 81; CHECK-NEXT: mv a0, a2 82; CHECK-NEXT: .LBB3_2: # %cond.end 83; CHECK-NEXT: ret 84entry: 85 br i1 %cnd, label %cond.end, label %cond.false 86 87cond.false: ; preds = %entry 88 br label %cond.end 89 90cond.end: ; preds = %entry, %cond.false 91 %cond = phi i32 [ %b, %cond.false ], [ %a, %entry ] 92 ret i32 %cond 93} 94 95define i64 @phi_i64(i1 %cnd, i64 %a, i64 %b) { 96; RV32-LABEL: phi_i64: 97; RV32: # %bb.0: # %entry 98; RV32-NEXT: mv a5, a0 99; RV32-NEXT: mv a0, a1 100; RV32-NEXT: mv a1, a2 101; RV32-NEXT: andi a5, a5, 1 102; RV32-NEXT: bnez a5, .LBB4_2 103; RV32-NEXT: # %bb.1: # %cond.false 104; RV32-NEXT: mv a0, a3 105; RV32-NEXT: mv a1, a4 106; RV32-NEXT: .LBB4_2: # %cond.end 107; RV32-NEXT: ret 108; 109; RV64-LABEL: phi_i64: 110; RV64: # %bb.0: # %entry 111; RV64-NEXT: mv a3, a0 112; RV64-NEXT: mv a0, a1 113; RV64-NEXT: andi a3, a3, 1 114; RV64-NEXT: bnez a3, .LBB4_2 115; RV64-NEXT: # %bb.1: # %cond.false 116; RV64-NEXT: mv a0, a2 117; RV64-NEXT: .LBB4_2: # %cond.end 118; RV64-NEXT: ret 119entry: 120 br i1 %cnd, label %cond.end, label %cond.false 121 122cond.false: ; preds = %entry 123 br label %cond.end 124 125cond.end: ; preds = %entry, %cond.false 126 %cond = phi i64 [ %b, %cond.false ], [ %a, %entry ] 127 ret i64 %cond 128} 129 130define ptr @phi_ptr(i1 %cnd, ptr %a, ptr %b) { 131; CHECK-LABEL: phi_ptr: 132; CHECK: # %bb.0: # %entry 133; CHECK-NEXT: mv a3, a0 134; CHECK-NEXT: mv a0, a1 135; CHECK-NEXT: andi a3, a3, 1 136; CHECK-NEXT: bnez a3, .LBB5_2 137; CHECK-NEXT: # %bb.1: # %cond.false 138; CHECK-NEXT: mv a0, a2 139; CHECK-NEXT: .LBB5_2: # %cond.end 140; CHECK-NEXT: ret 141entry: 142 br i1 %cnd, label %cond.end, label %cond.false 143 144cond.false: ; preds = %entry 145 br label %cond.end 146 147cond.end: ; preds = %entry, %cond.false 148 %cond = phi ptr [ %b, %cond.false ], [ %a, %entry ] 149 ret ptr %cond 150} 151 152define float @phi_float(i1 %cnd, float %a, float %b) { 153; CHECKI-LABEL: phi_float: 154; CHECKI: # %bb.0: # %entry 155; CHECKI-NEXT: mv a3, a0 156; CHECKI-NEXT: mv a0, a1 157; CHECKI-NEXT: andi a3, a3, 1 158; CHECKI-NEXT: bnez a3, .LBB6_2 159; CHECKI-NEXT: # %bb.1: # %cond.false 160; CHECKI-NEXT: mv a0, a2 161; CHECKI-NEXT: .LBB6_2: # %cond.end 162; CHECKI-NEXT: ret 163; 164; CHECKIF-LABEL: phi_float: 165; CHECKIF: # %bb.0: # %entry 166; CHECKIF-NEXT: andi a0, a0, 1 167; CHECKIF-NEXT: bnez a0, .LBB6_2 168; CHECKIF-NEXT: # %bb.1: # %cond.false 169; CHECKIF-NEXT: fmv.s fa0, fa1 170; CHECKIF-NEXT: .LBB6_2: # %cond.end 171; CHECKIF-NEXT: ret 172entry: 173 br i1 %cnd, label %cond.end, label %cond.false 174 175cond.false: ; preds = %entry 176 br label %cond.end 177 178cond.end: ; preds = %entry, %cond.false 179 %cond = phi float [ %b, %cond.false ], [ %a, %entry ] 180 ret float %cond 181} 182