summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/RISCV/codemodel-lowering.ll
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/CodeGen/RISCV/codemodel-lowering.ll')
-rw-r--r--llvm/test/CodeGen/RISCV/codemodel-lowering.ll80
1 files changed, 80 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/RISCV/codemodel-lowering.ll b/llvm/test/CodeGen/RISCV/codemodel-lowering.ll
new file mode 100644
index 00000000000..573f661b154
--- /dev/null
+++ b/llvm/test/CodeGen/RISCV/codemodel-lowering.ll
@@ -0,0 +1,80 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=riscv32 -mattr=+f -code-model=small -verify-machineinstrs < %s \
+; RUN: | FileCheck %s -check-prefix=RV32I-SMALL
+; RUN: llc -mtriple=riscv32 -mattr=+f -code-model=medium -verify-machineinstrs < %s \
+; RUN: | FileCheck %s -check-prefix=RV32I-MEDIUM
+
+; Check lowering of globals
+@G = global i32 0
+
+define i32 @lower_global(i32 %a) nounwind {
+; RV32I-SMALL-LABEL: lower_global:
+; RV32I-SMALL: # %bb.0:
+; RV32I-SMALL-NEXT: lui a0, %hi(G)
+; RV32I-SMALL-NEXT: lw a0, %lo(G)(a0)
+; RV32I-SMALL-NEXT: ret
+;
+; RV32I-MEDIUM-LABEL: lower_global:
+; RV32I-MEDIUM: # %bb.0:
+; RV32I-MEDIUM-NEXT: .LBB0_1: # Label of block must be emitted
+; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(G)
+; RV32I-MEDIUM-NEXT: addi a0, a0, %pcrel_lo(.LBB0_1)
+; RV32I-MEDIUM-NEXT: lw a0, 0(a0)
+; RV32I-MEDIUM-NEXT: ret
+ %1 = load volatile i32, i32* @G
+ ret i32 %1
+}
+
+; Check lowering of blockaddresses
+
+@addr = global i8* null
+
+define void @lower_blockaddress() nounwind {
+; RV32I-SMALL-LABEL: lower_blockaddress:
+; RV32I-SMALL: # %bb.0:
+; RV32I-SMALL-NEXT: lui a0, %hi(addr)
+; RV32I-SMALL-NEXT: addi a1, zero, 1
+; RV32I-SMALL-NEXT: sw a1, %lo(addr)(a0)
+; RV32I-SMALL-NEXT: ret
+;
+; RV32I-MEDIUM-LABEL: lower_blockaddress:
+; RV32I-MEDIUM: # %bb.0:
+; RV32I-MEDIUM-NEXT: .LBB1_1: # Label of block must be emitted
+; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(addr)
+; RV32I-MEDIUM-NEXT: addi a0, a0, %pcrel_lo(.LBB1_1)
+; RV32I-MEDIUM-NEXT: addi a1, zero, 1
+; RV32I-MEDIUM-NEXT: sw a1, 0(a0)
+; RV32I-MEDIUM-NEXT: ret
+ store volatile i8* blockaddress(@lower_blockaddress, %block), i8** @addr
+ ret void
+
+block:
+ unreachable
+}
+
+; Check lowering of constantpools
+
+define float @lower_constantpool(float %a) nounwind {
+; RV32I-SMALL-LABEL: lower_constantpool:
+; RV32I-SMALL: # %bb.0:
+; RV32I-SMALL-NEXT: fmv.w.x ft0, a0
+; RV32I-SMALL-NEXT: lui a0, %hi(.LCPI2_0)
+; RV32I-SMALL-NEXT: addi a0, a0, %lo(.LCPI2_0)
+; RV32I-SMALL-NEXT: flw ft1, 0(a0)
+; RV32I-SMALL-NEXT: fadd.s ft0, ft0, ft1
+; RV32I-SMALL-NEXT: fmv.x.w a0, ft0
+; RV32I-SMALL-NEXT: ret
+;
+; RV32I-MEDIUM-LABEL: lower_constantpool:
+; RV32I-MEDIUM: # %bb.0:
+; RV32I-MEDIUM-NEXT: .LBB2_1: # Label of block must be emitted
+; RV32I-MEDIUM-NEXT: auipc a1, %pcrel_hi(.LCPI2_0)
+; RV32I-MEDIUM-NEXT: addi a1, a1, %pcrel_lo(.LBB2_1)
+; RV32I-MEDIUM-NEXT: flw ft0, 0(a1)
+; RV32I-MEDIUM-NEXT: fmv.w.x ft1, a0
+; RV32I-MEDIUM-NEXT: fadd.s ft0, ft1, ft0
+; RV32I-MEDIUM-NEXT: fmv.x.w a0, ft0
+; RV32I-MEDIUM-NEXT: ret
+ %1 = fadd float %a, 1.0
+ ret float %1
+}
OpenPOWER on IntegriCloud