| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc -mtriple=riscv64 < %s | FileCheck --check-prefix=RV64I %s |
| ; RUN: llc -mtriple=riscv32 < %s | FileCheck --check-prefix=RV32I %s |
| @var = external global i32 |
| |
| define void @func() { |
| ; RV64I-LABEL: func: |
| ; RV64I: # %bb.0: |
| ; RV64I-NEXT: lui a0, 1 |
| ; RV64I-NEXT: addiw a0, a0, 16 |
| ; RV64I-NEXT: sub sp, sp, a0 |
| ; RV64I-NEXT: .cfi_def_cfa_offset 4112 |
| ; RV64I-NEXT: lui a0, %hi(var) |
| ; RV64I-NEXT: lw a1, %lo(var)(a0) |
| ; RV64I-NEXT: lw a2, %lo(var)(a0) |
| ; RV64I-NEXT: lw a3, %lo(var)(a0) |
| ; RV64I-NEXT: lw a4, %lo(var)(a0) |
| ; RV64I-NEXT: lw a5, %lo(var)(a0) |
| ; RV64I-NEXT: lw a6, %lo(var)(a0) |
| ; RV64I-NEXT: lw a7, %lo(var)(a0) |
| ; RV64I-NEXT: lw t0, %lo(var)(a0) |
| ; RV64I-NEXT: lw t1, %lo(var)(a0) |
| ; RV64I-NEXT: lw t2, %lo(var)(a0) |
| ; RV64I-NEXT: lw t3, %lo(var)(a0) |
| ; RV64I-NEXT: lw t4, %lo(var)(a0) |
| ; RV64I-NEXT: lw t5, %lo(var)(a0) |
| ; RV64I-NEXT: lw t6, %lo(var)(a0) |
| ; RV64I-NEXT: sd s0, 0(sp) |
| ; RV64I-NEXT: lui s0, 1 |
| ; RV64I-NEXT: add s0, sp, s0 |
| ; RV64I-NEXT: sw a1, 12(s0) |
| ; RV64I-NEXT: ld s0, 0(sp) |
| ; RV64I-NEXT: sw a1, %lo(var)(a0) |
| ; RV64I-NEXT: sw a2, %lo(var)(a0) |
| ; RV64I-NEXT: sw a3, %lo(var)(a0) |
| ; RV64I-NEXT: sw a4, %lo(var)(a0) |
| ; RV64I-NEXT: sw a5, %lo(var)(a0) |
| ; RV64I-NEXT: sw a6, %lo(var)(a0) |
| ; RV64I-NEXT: sw a7, %lo(var)(a0) |
| ; RV64I-NEXT: sw t0, %lo(var)(a0) |
| ; RV64I-NEXT: sw t1, %lo(var)(a0) |
| ; RV64I-NEXT: sw t2, %lo(var)(a0) |
| ; RV64I-NEXT: sw t3, %lo(var)(a0) |
| ; RV64I-NEXT: sw t4, %lo(var)(a0) |
| ; RV64I-NEXT: sw t5, %lo(var)(a0) |
| ; RV64I-NEXT: sw t6, %lo(var)(a0) |
| ; RV64I-NEXT: lui a0, 1 |
| ; RV64I-NEXT: addiw a0, a0, 16 |
| ; RV64I-NEXT: add sp, sp, a0 |
| ; RV64I-NEXT: ret |
| ; |
| ; RV32I-LABEL: func: |
| ; RV32I: # %bb.0: |
| ; RV32I-NEXT: lui a0, 1 |
| ; RV32I-NEXT: addi a0, a0, 16 |
| ; RV32I-NEXT: sub sp, sp, a0 |
| ; RV32I-NEXT: .cfi_def_cfa_offset 4112 |
| ; RV32I-NEXT: lui a0, %hi(var) |
| ; RV32I-NEXT: lw a1, %lo(var)(a0) |
| ; RV32I-NEXT: lw a2, %lo(var)(a0) |
| ; RV32I-NEXT: lw a3, %lo(var)(a0) |
| ; RV32I-NEXT: lw a4, %lo(var)(a0) |
| ; RV32I-NEXT: lw a5, %lo(var)(a0) |
| ; RV32I-NEXT: lw a6, %lo(var)(a0) |
| ; RV32I-NEXT: lw a7, %lo(var)(a0) |
| ; RV32I-NEXT: lw t0, %lo(var)(a0) |
| ; RV32I-NEXT: lw t1, %lo(var)(a0) |
| ; RV32I-NEXT: lw t2, %lo(var)(a0) |
| ; RV32I-NEXT: lw t3, %lo(var)(a0) |
| ; RV32I-NEXT: lw t4, %lo(var)(a0) |
| ; RV32I-NEXT: lw t5, %lo(var)(a0) |
| ; RV32I-NEXT: lw t6, %lo(var)(a0) |
| ; RV32I-NEXT: sw s0, 0(sp) |
| ; RV32I-NEXT: lui s0, 1 |
| ; RV32I-NEXT: add s0, sp, s0 |
| ; RV32I-NEXT: sw a1, 12(s0) |
| ; RV32I-NEXT: lw s0, 0(sp) |
| ; RV32I-NEXT: sw a1, %lo(var)(a0) |
| ; RV32I-NEXT: sw a2, %lo(var)(a0) |
| ; RV32I-NEXT: sw a3, %lo(var)(a0) |
| ; RV32I-NEXT: sw a4, %lo(var)(a0) |
| ; RV32I-NEXT: sw a5, %lo(var)(a0) |
| ; RV32I-NEXT: sw a6, %lo(var)(a0) |
| ; RV32I-NEXT: sw a7, %lo(var)(a0) |
| ; RV32I-NEXT: sw t0, %lo(var)(a0) |
| ; RV32I-NEXT: sw t1, %lo(var)(a0) |
| ; RV32I-NEXT: sw t2, %lo(var)(a0) |
| ; RV32I-NEXT: sw t3, %lo(var)(a0) |
| ; RV32I-NEXT: sw t4, %lo(var)(a0) |
| ; RV32I-NEXT: sw t5, %lo(var)(a0) |
| ; RV32I-NEXT: sw t6, %lo(var)(a0) |
| ; RV32I-NEXT: lui a0, 1 |
| ; RV32I-NEXT: addi a0, a0, 16 |
| ; RV32I-NEXT: add sp, sp, a0 |
| ; RV32I-NEXT: ret |
| %space = alloca i32, align 4 |
| %stackspace = alloca[1024 x i32], align 4 |
| |
| ;; Load values to increase register pressure. |
| %v0 = load volatile i32, ptr @var |
| %v1 = load volatile i32, ptr @var |
| %v2 = load volatile i32, ptr @var |
| %v3 = load volatile i32, ptr @var |
| %v4 = load volatile i32, ptr @var |
| %v5 = load volatile i32, ptr @var |
| %v6 = load volatile i32, ptr @var |
| %v7 = load volatile i32, ptr @var |
| %v8 = load volatile i32, ptr @var |
| %v9 = load volatile i32, ptr @var |
| %v10 = load volatile i32, ptr @var |
| %v11 = load volatile i32, ptr @var |
| %v12 = load volatile i32, ptr @var |
| %v13 = load volatile i32, ptr @var |
| |
| store volatile i32 %v0, ptr %space |
| |
| ;; store values so they are used. |
| store volatile i32 %v0, ptr @var |
| store volatile i32 %v1, ptr @var |
| store volatile i32 %v2, ptr @var |
| store volatile i32 %v3, ptr @var |
| store volatile i32 %v4, ptr @var |
| store volatile i32 %v5, ptr @var |
| store volatile i32 %v6, ptr @var |
| store volatile i32 %v7, ptr @var |
| store volatile i32 %v8, ptr @var |
| store volatile i32 %v9, ptr @var |
| store volatile i32 %v10, ptr @var |
| store volatile i32 %v11, ptr @var |
| store volatile i32 %v12, ptr @var |
| store volatile i32 %v13, ptr @var |
| |
| ret void |
| } |
| |
| define void @shrink_wrap(i1 %c) { |
| ; RV64I-LABEL: shrink_wrap: |
| ; RV64I: # %bb.0: |
| ; RV64I-NEXT: andi a0, a0, 1 |
| ; RV64I-NEXT: bnez a0, .LBB1_2 |
| ; RV64I-NEXT: # %bb.1: # %bar |
| ; RV64I-NEXT: lui a0, 1 |
| ; RV64I-NEXT: addiw a0, a0, 16 |
| ; RV64I-NEXT: sub sp, sp, a0 |
| ; RV64I-NEXT: .cfi_def_cfa_offset 4112 |
| ; RV64I-NEXT: lui a0, %hi(var) |
| ; RV64I-NEXT: lw a1, %lo(var)(a0) |
| ; RV64I-NEXT: lw a2, %lo(var)(a0) |
| ; RV64I-NEXT: lw a3, %lo(var)(a0) |
| ; RV64I-NEXT: lw a4, %lo(var)(a0) |
| ; RV64I-NEXT: lw a5, %lo(var)(a0) |
| ; RV64I-NEXT: lw a6, %lo(var)(a0) |
| ; RV64I-NEXT: lw a7, %lo(var)(a0) |
| ; RV64I-NEXT: lw t0, %lo(var)(a0) |
| ; RV64I-NEXT: lw t1, %lo(var)(a0) |
| ; RV64I-NEXT: lw t2, %lo(var)(a0) |
| ; RV64I-NEXT: lw t3, %lo(var)(a0) |
| ; RV64I-NEXT: lw t4, %lo(var)(a0) |
| ; RV64I-NEXT: lw t5, %lo(var)(a0) |
| ; RV64I-NEXT: lw t6, %lo(var)(a0) |
| ; RV64I-NEXT: sd s0, 0(sp) |
| ; RV64I-NEXT: lui s0, 1 |
| ; RV64I-NEXT: add s0, sp, s0 |
| ; RV64I-NEXT: sw a1, 12(s0) |
| ; RV64I-NEXT: ld s0, 0(sp) |
| ; RV64I-NEXT: sw a1, %lo(var)(a0) |
| ; RV64I-NEXT: sw a2, %lo(var)(a0) |
| ; RV64I-NEXT: sw a3, %lo(var)(a0) |
| ; RV64I-NEXT: sw a4, %lo(var)(a0) |
| ; RV64I-NEXT: sw a5, %lo(var)(a0) |
| ; RV64I-NEXT: sw a6, %lo(var)(a0) |
| ; RV64I-NEXT: sw a7, %lo(var)(a0) |
| ; RV64I-NEXT: sw t0, %lo(var)(a0) |
| ; RV64I-NEXT: sw t1, %lo(var)(a0) |
| ; RV64I-NEXT: sw t2, %lo(var)(a0) |
| ; RV64I-NEXT: sw t3, %lo(var)(a0) |
| ; RV64I-NEXT: sw t4, %lo(var)(a0) |
| ; RV64I-NEXT: sw t5, %lo(var)(a0) |
| ; RV64I-NEXT: sw t6, %lo(var)(a0) |
| ; RV64I-NEXT: lui a0, 1 |
| ; RV64I-NEXT: addiw a0, a0, 16 |
| ; RV64I-NEXT: add sp, sp, a0 |
| ; RV64I-NEXT: .LBB1_2: # %foo |
| ; RV64I-NEXT: ret |
| ; |
| ; RV32I-LABEL: shrink_wrap: |
| ; RV32I: # %bb.0: |
| ; RV32I-NEXT: andi a0, a0, 1 |
| ; RV32I-NEXT: bnez a0, .LBB1_2 |
| ; RV32I-NEXT: # %bb.1: # %bar |
| ; RV32I-NEXT: lui a0, 1 |
| ; RV32I-NEXT: addi a0, a0, 16 |
| ; RV32I-NEXT: sub sp, sp, a0 |
| ; RV32I-NEXT: .cfi_def_cfa_offset 4112 |
| ; RV32I-NEXT: lui a0, %hi(var) |
| ; RV32I-NEXT: lw a1, %lo(var)(a0) |
| ; RV32I-NEXT: lw a2, %lo(var)(a0) |
| ; RV32I-NEXT: lw a3, %lo(var)(a0) |
| ; RV32I-NEXT: lw a4, %lo(var)(a0) |
| ; RV32I-NEXT: lw a5, %lo(var)(a0) |
| ; RV32I-NEXT: lw a6, %lo(var)(a0) |
| ; RV32I-NEXT: lw a7, %lo(var)(a0) |
| ; RV32I-NEXT: lw t0, %lo(var)(a0) |
| ; RV32I-NEXT: lw t1, %lo(var)(a0) |
| ; RV32I-NEXT: lw t2, %lo(var)(a0) |
| ; RV32I-NEXT: lw t3, %lo(var)(a0) |
| ; RV32I-NEXT: lw t4, %lo(var)(a0) |
| ; RV32I-NEXT: lw t5, %lo(var)(a0) |
| ; RV32I-NEXT: lw t6, %lo(var)(a0) |
| ; RV32I-NEXT: sw s0, 0(sp) |
| ; RV32I-NEXT: lui s0, 1 |
| ; RV32I-NEXT: add s0, sp, s0 |
| ; RV32I-NEXT: sw a1, 12(s0) |
| ; RV32I-NEXT: lw s0, 0(sp) |
| ; RV32I-NEXT: sw a1, %lo(var)(a0) |
| ; RV32I-NEXT: sw a2, %lo(var)(a0) |
| ; RV32I-NEXT: sw a3, %lo(var)(a0) |
| ; RV32I-NEXT: sw a4, %lo(var)(a0) |
| ; RV32I-NEXT: sw a5, %lo(var)(a0) |
| ; RV32I-NEXT: sw a6, %lo(var)(a0) |
| ; RV32I-NEXT: sw a7, %lo(var)(a0) |
| ; RV32I-NEXT: sw t0, %lo(var)(a0) |
| ; RV32I-NEXT: sw t1, %lo(var)(a0) |
| ; RV32I-NEXT: sw t2, %lo(var)(a0) |
| ; RV32I-NEXT: sw t3, %lo(var)(a0) |
| ; RV32I-NEXT: sw t4, %lo(var)(a0) |
| ; RV32I-NEXT: sw t5, %lo(var)(a0) |
| ; RV32I-NEXT: sw t6, %lo(var)(a0) |
| ; RV32I-NEXT: lui a0, 1 |
| ; RV32I-NEXT: addi a0, a0, 16 |
| ; RV32I-NEXT: add sp, sp, a0 |
| ; RV32I-NEXT: .LBB1_2: # %foo |
| ; RV32I-NEXT: ret |
| %space = alloca i32, align 4 |
| %stackspace = alloca[1024 x i32], align 4 |
| br i1 %c, label %foo, label %bar |
| |
| bar: |
| |
| ;; Load values to increase register pressure. |
| %v0 = load volatile i32, ptr @var |
| %v1 = load volatile i32, ptr @var |
| %v2 = load volatile i32, ptr @var |
| %v3 = load volatile i32, ptr @var |
| %v4 = load volatile i32, ptr @var |
| %v5 = load volatile i32, ptr @var |
| %v6 = load volatile i32, ptr @var |
| %v7 = load volatile i32, ptr @var |
| %v8 = load volatile i32, ptr @var |
| %v9 = load volatile i32, ptr @var |
| %v10 = load volatile i32, ptr @var |
| %v11 = load volatile i32, ptr @var |
| %v12 = load volatile i32, ptr @var |
| %v13 = load volatile i32, ptr @var |
| |
| store volatile i32 %v0, ptr %space |
| |
| ;; store values so they are used. |
| store volatile i32 %v0, ptr @var |
| store volatile i32 %v1, ptr @var |
| store volatile i32 %v2, ptr @var |
| store volatile i32 %v3, ptr @var |
| store volatile i32 %v4, ptr @var |
| store volatile i32 %v5, ptr @var |
| store volatile i32 %v6, ptr @var |
| store volatile i32 %v7, ptr @var |
| store volatile i32 %v8, ptr @var |
| store volatile i32 %v9, ptr @var |
| store volatile i32 %v10, ptr @var |
| store volatile i32 %v11, ptr @var |
| store volatile i32 %v12, ptr @var |
| store volatile i32 %v13, ptr @var |
| br label %foo |
| |
| foo: |
| ret void |
| } |