| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 |
| ; RUN: llc -mtriple=riscv32 -global-isel < %s | FileCheck %s --check-prefixes=CHECK,CHECKI,RV32 |
| ; RUN: llc -mtriple=riscv64 -global-isel < %s | FileCheck %s --check-prefixes=CHECK,CHECKI,RV64 |
| ; RUN: llc -mtriple=riscv32 -mattr=+f -global-isel < %s | FileCheck %s --check-prefixes=CHECK,CHECKIF,RV32 |
| ; RUN: llc -mtriple=riscv64 -mattr=+f -global-isel < %s | FileCheck %s --check-prefixes=CHECK,CHECKIF,RV64 |
| |
| define i1 @phi_i1(i1 %cnd, i1 %a, i1 %b) { |
| ; CHECK-LABEL: phi_i1: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: mv a3, a0 |
| ; CHECK-NEXT: mv a0, a1 |
| ; CHECK-NEXT: andi a3, a3, 1 |
| ; CHECK-NEXT: bnez a3, .LBB0_2 |
| ; CHECK-NEXT: # %bb.1: # %cond.false |
| ; CHECK-NEXT: mv a0, a2 |
| ; CHECK-NEXT: .LBB0_2: # %cond.end |
| ; CHECK-NEXT: ret |
| entry: |
| br i1 %cnd, label %cond.end, label %cond.false |
| |
| cond.false: ; preds = %entry |
| br label %cond.end |
| |
| cond.end: ; preds = %entry, %cond.false |
| %cond = phi i1 [ %b, %cond.false ], [ %a, %entry ] |
| ret i1 %cond |
| } |
| |
| define i8 @phi_i8(i1 %cnd, i8 %a, i8 %b) { |
| ; CHECK-LABEL: phi_i8: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: mv a3, a0 |
| ; CHECK-NEXT: mv a0, a1 |
| ; CHECK-NEXT: andi a3, a3, 1 |
| ; CHECK-NEXT: bnez a3, .LBB1_2 |
| ; CHECK-NEXT: # %bb.1: # %cond.false |
| ; CHECK-NEXT: mv a0, a2 |
| ; CHECK-NEXT: .LBB1_2: # %cond.end |
| ; CHECK-NEXT: ret |
| entry: |
| br i1 %cnd, label %cond.end, label %cond.false |
| |
| cond.false: ; preds = %entry |
| br label %cond.end |
| |
| cond.end: ; preds = %entry, %cond.false |
| %cond = phi i8 [ %b, %cond.false ], [ %a, %entry ] |
| ret i8 %cond |
| } |
| |
| define i16 @phi_i16(i1 %cnd, i16 %a, i16 %b) { |
| ; CHECK-LABEL: phi_i16: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: mv a3, a0 |
| ; CHECK-NEXT: mv a0, a1 |
| ; CHECK-NEXT: andi a3, a3, 1 |
| ; CHECK-NEXT: bnez a3, .LBB2_2 |
| ; CHECK-NEXT: # %bb.1: # %cond.false |
| ; CHECK-NEXT: mv a0, a2 |
| ; CHECK-NEXT: .LBB2_2: # %cond.end |
| ; CHECK-NEXT: ret |
| entry: |
| br i1 %cnd, label %cond.end, label %cond.false |
| |
| cond.false: ; preds = %entry |
| br label %cond.end |
| |
| cond.end: ; preds = %entry, %cond.false |
| %cond = phi i16 [ %b, %cond.false ], [ %a, %entry ] |
| ret i16 %cond |
| } |
| |
| define i32 @phi_i32(i1 %cnd, i32 %a, i32 %b) { |
| ; CHECK-LABEL: phi_i32: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: mv a3, a0 |
| ; CHECK-NEXT: mv a0, a1 |
| ; CHECK-NEXT: andi a3, a3, 1 |
| ; CHECK-NEXT: bnez a3, .LBB3_2 |
| ; CHECK-NEXT: # %bb.1: # %cond.false |
| ; CHECK-NEXT: mv a0, a2 |
| ; CHECK-NEXT: .LBB3_2: # %cond.end |
| ; CHECK-NEXT: ret |
| entry: |
| br i1 %cnd, label %cond.end, label %cond.false |
| |
| cond.false: ; preds = %entry |
| br label %cond.end |
| |
| cond.end: ; preds = %entry, %cond.false |
| %cond = phi i32 [ %b, %cond.false ], [ %a, %entry ] |
| ret i32 %cond |
| } |
| |
| define i64 @phi_i64(i1 %cnd, i64 %a, i64 %b) { |
| ; RV32-LABEL: phi_i64: |
| ; RV32: # %bb.0: # %entry |
| ; RV32-NEXT: mv a5, a0 |
| ; RV32-NEXT: mv a0, a1 |
| ; RV32-NEXT: mv a1, a2 |
| ; RV32-NEXT: andi a5, a5, 1 |
| ; RV32-NEXT: bnez a5, .LBB4_2 |
| ; RV32-NEXT: # %bb.1: # %cond.false |
| ; RV32-NEXT: mv a0, a3 |
| ; RV32-NEXT: mv a1, a4 |
| ; RV32-NEXT: .LBB4_2: # %cond.end |
| ; RV32-NEXT: ret |
| ; |
| ; RV64-LABEL: phi_i64: |
| ; RV64: # %bb.0: # %entry |
| ; RV64-NEXT: mv a3, a0 |
| ; RV64-NEXT: mv a0, a1 |
| ; RV64-NEXT: andi a3, a3, 1 |
| ; RV64-NEXT: bnez a3, .LBB4_2 |
| ; RV64-NEXT: # %bb.1: # %cond.false |
| ; RV64-NEXT: mv a0, a2 |
| ; RV64-NEXT: .LBB4_2: # %cond.end |
| ; RV64-NEXT: ret |
| entry: |
| br i1 %cnd, label %cond.end, label %cond.false |
| |
| cond.false: ; preds = %entry |
| br label %cond.end |
| |
| cond.end: ; preds = %entry, %cond.false |
| %cond = phi i64 [ %b, %cond.false ], [ %a, %entry ] |
| ret i64 %cond |
| } |
| |
| define ptr @phi_ptr(i1 %cnd, ptr %a, ptr %b) { |
| ; CHECK-LABEL: phi_ptr: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: mv a3, a0 |
| ; CHECK-NEXT: mv a0, a1 |
| ; CHECK-NEXT: andi a3, a3, 1 |
| ; CHECK-NEXT: bnez a3, .LBB5_2 |
| ; CHECK-NEXT: # %bb.1: # %cond.false |
| ; CHECK-NEXT: mv a0, a2 |
| ; CHECK-NEXT: .LBB5_2: # %cond.end |
| ; CHECK-NEXT: ret |
| entry: |
| br i1 %cnd, label %cond.end, label %cond.false |
| |
| cond.false: ; preds = %entry |
| br label %cond.end |
| |
| cond.end: ; preds = %entry, %cond.false |
| %cond = phi ptr [ %b, %cond.false ], [ %a, %entry ] |
| ret ptr %cond |
| } |
| |
| define float @phi_float(i1 %cnd, float %a, float %b) { |
| ; CHECKI-LABEL: phi_float: |
| ; CHECKI: # %bb.0: # %entry |
| ; CHECKI-NEXT: mv a3, a0 |
| ; CHECKI-NEXT: mv a0, a1 |
| ; CHECKI-NEXT: andi a3, a3, 1 |
| ; CHECKI-NEXT: bnez a3, .LBB6_2 |
| ; CHECKI-NEXT: # %bb.1: # %cond.false |
| ; CHECKI-NEXT: mv a0, a2 |
| ; CHECKI-NEXT: .LBB6_2: # %cond.end |
| ; CHECKI-NEXT: ret |
| ; |
| ; CHECKIF-LABEL: phi_float: |
| ; CHECKIF: # %bb.0: # %entry |
| ; CHECKIF-NEXT: andi a0, a0, 1 |
| ; CHECKIF-NEXT: bnez a0, .LBB6_2 |
| ; CHECKIF-NEXT: # %bb.1: # %cond.false |
| ; CHECKIF-NEXT: fmv.s fa0, fa1 |
| ; CHECKIF-NEXT: .LBB6_2: # %cond.end |
| ; CHECKIF-NEXT: ret |
| entry: |
| br i1 %cnd, label %cond.end, label %cond.false |
| |
| cond.false: ; preds = %entry |
| br label %cond.end |
| |
| cond.end: ; preds = %entry, %cond.false |
| %cond = phi float [ %b, %cond.false ], [ %a, %entry ] |
| ret float %cond |
| } |