150 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \3; RUN: | FileCheck -check-prefix=RV32I %s4; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \5; RUN: | FileCheck -check-prefix=RV64I %s6 7declare void @notdead(ptr)8 9define ptr @test_frameaddress_0() nounwind {10; RV32I-LABEL: test_frameaddress_0:11; RV32I: # %bb.0:12; RV32I-NEXT: addi sp, sp, -1613; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill14; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill15; RV32I-NEXT: addi s0, sp, 1616; RV32I-NEXT: mv a0, s017; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload18; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload19; RV32I-NEXT: addi sp, sp, 1620; RV32I-NEXT: ret21;22; RV64I-LABEL: test_frameaddress_0:23; RV64I: # %bb.0:24; RV64I-NEXT: addi sp, sp, -1625; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill26; RV64I-NEXT: sd s0, 0(sp) # 8-byte Folded Spill27; RV64I-NEXT: addi s0, sp, 1628; RV64I-NEXT: mv a0, s029; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload30; RV64I-NEXT: ld s0, 0(sp) # 8-byte Folded Reload31; RV64I-NEXT: addi sp, sp, 1632; RV64I-NEXT: ret33 %1 = call ptr @llvm.frameaddress(i32 0)34 ret ptr %135}36 37define ptr @test_frameaddress_2() nounwind {38; RV32I-LABEL: test_frameaddress_2:39; RV32I: # %bb.0:40; RV32I-NEXT: addi sp, sp, -1641; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill42; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill43; RV32I-NEXT: addi s0, sp, 1644; RV32I-NEXT: lw a0, -8(s0)45; RV32I-NEXT: lw a0, -8(a0)46; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload47; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload48; RV32I-NEXT: addi sp, sp, 1649; RV32I-NEXT: ret50;51; RV64I-LABEL: test_frameaddress_2:52; RV64I: # %bb.0:53; RV64I-NEXT: addi sp, sp, -1654; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill55; RV64I-NEXT: sd s0, 0(sp) # 8-byte Folded Spill56; RV64I-NEXT: addi s0, sp, 1657; RV64I-NEXT: ld a0, -16(s0)58; RV64I-NEXT: ld a0, -16(a0)59; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload60; RV64I-NEXT: ld s0, 0(sp) # 8-byte Folded Reload61; RV64I-NEXT: addi sp, sp, 1662; RV64I-NEXT: ret63 %1 = call ptr @llvm.frameaddress(i32 2)64 ret ptr %165}66 67define ptr @test_frameaddress_3_alloca() nounwind {68; RV32I-LABEL: test_frameaddress_3_alloca:69; RV32I: # %bb.0:70; RV32I-NEXT: addi sp, sp, -11271; RV32I-NEXT: sw ra, 108(sp) # 4-byte Folded Spill72; RV32I-NEXT: sw s0, 104(sp) # 4-byte Folded Spill73; RV32I-NEXT: addi s0, sp, 11274; RV32I-NEXT: addi a0, s0, -10875; RV32I-NEXT: call notdead76; RV32I-NEXT: lw a0, -8(s0)77; RV32I-NEXT: lw a0, -8(a0)78; RV32I-NEXT: lw a0, -8(a0)79; RV32I-NEXT: lw ra, 108(sp) # 4-byte Folded Reload80; RV32I-NEXT: lw s0, 104(sp) # 4-byte Folded Reload81; RV32I-NEXT: addi sp, sp, 11282; RV32I-NEXT: ret83;84; RV64I-LABEL: test_frameaddress_3_alloca:85; RV64I: # %bb.0:86; RV64I-NEXT: addi sp, sp, -12887; RV64I-NEXT: sd ra, 120(sp) # 8-byte Folded Spill88; RV64I-NEXT: sd s0, 112(sp) # 8-byte Folded Spill89; RV64I-NEXT: addi s0, sp, 12890; RV64I-NEXT: addi a0, s0, -11691; RV64I-NEXT: call notdead92; RV64I-NEXT: ld a0, -16(s0)93; RV64I-NEXT: ld a0, -16(a0)94; RV64I-NEXT: ld a0, -16(a0)95; RV64I-NEXT: ld ra, 120(sp) # 8-byte Folded Reload96; RV64I-NEXT: ld s0, 112(sp) # 8-byte Folded Reload97; RV64I-NEXT: addi sp, sp, 12898; RV64I-NEXT: ret99 %1 = alloca [100 x i8]100 call void @notdead(ptr %1)101 %2 = call ptr @llvm.frameaddress(i32 3)102 ret ptr %2103}104 105define ptr @test_returnaddress_0() nounwind {106; RV32I-LABEL: test_returnaddress_0:107; RV32I: # %bb.0:108; RV32I-NEXT: mv a0, ra109; RV32I-NEXT: ret110;111; RV64I-LABEL: test_returnaddress_0:112; RV64I: # %bb.0:113; RV64I-NEXT: mv a0, ra114; RV64I-NEXT: ret115 %1 = call ptr @llvm.returnaddress(i32 0)116 ret ptr %1117}118 119define ptr @test_returnaddress_2() nounwind {120; RV32I-LABEL: test_returnaddress_2:121; RV32I: # %bb.0:122; RV32I-NEXT: addi sp, sp, -16123; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill124; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill125; RV32I-NEXT: addi s0, sp, 16126; RV32I-NEXT: lw a0, -8(s0)127; RV32I-NEXT: lw a0, -8(a0)128; RV32I-NEXT: lw a0, -4(a0)129; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload130; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload131; RV32I-NEXT: addi sp, sp, 16132; RV32I-NEXT: ret133;134; RV64I-LABEL: test_returnaddress_2:135; RV64I: # %bb.0:136; RV64I-NEXT: addi sp, sp, -16137; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill138; RV64I-NEXT: sd s0, 0(sp) # 8-byte Folded Spill139; RV64I-NEXT: addi s0, sp, 16140; RV64I-NEXT: ld a0, -16(s0)141; RV64I-NEXT: ld a0, -16(a0)142; RV64I-NEXT: ld a0, -8(a0)143; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload144; RV64I-NEXT: ld s0, 0(sp) # 8-byte Folded Reload145; RV64I-NEXT: addi sp, sp, 16146; RV64I-NEXT: ret147 %1 = call ptr @llvm.returnaddress(i32 2)148 ret ptr %1149}150