Index: lib/Target/RISCV/RISCVISelLowering.cpp =================================================================== --- lib/Target/RISCV/RISCVISelLowering.cpp +++ lib/Target/RISCV/RISCVISelLowering.cpp @@ -988,10 +988,13 @@ Glue = Chain.getValue(1); } - if (isa(Callee)) { - Callee = lowerGlobalAddress(Callee, DAG); - } else if (isa(Callee)) { - Callee = lowerExternalSymbol(Callee, DAG); + // If the callee is a GlobalAddress/ExternalSymbol node, turn it into a + // TargetGlobalAddress/TargetExternalSymbol node so that legalize won't + // split it and then direct call can be matched by PseudoCALL. + if (GlobalAddressSDNode *S = dyn_cast(Callee)) { + Callee = DAG.getTargetGlobalAddress(S->getGlobal(), DL, PtrVT, 0, 0); + } else if (ExternalSymbolSDNode *S = dyn_cast(Callee)) { + Callee = DAG.getTargetExternalSymbol(S->getSymbol(), PtrVT, 0); } // The first call operand is the chain and the second is the target address. Index: lib/Target/RISCV/RISCVInstrInfo.cpp =================================================================== --- lib/Target/RISCV/RISCVInstrInfo.cpp +++ lib/Target/RISCV/RISCVInstrInfo.cpp @@ -379,6 +379,8 @@ case TargetOpcode::KILL: case TargetOpcode::DBG_VALUE: return 0; + case RISCV::PseudoCALL: + return 8; case TargetOpcode::INLINEASM: { const MachineFunction &MF = *MI.getParent()->getParent(); const auto &TM = static_cast(MF.getTarget()); Index: lib/Target/RISCV/RISCVInstrInfo.td =================================================================== --- lib/Target/RISCV/RISCVInstrInfo.td +++ lib/Target/RISCV/RISCVInstrInfo.td @@ -635,16 +635,19 @@ (PseudoBRIND GPR:$rs1, simm12:$imm12)>; // PseudoCALL is a pseudo instruction which will eventually expand to auipc -// and jalr. Define AsmString because we want assembler could print "call" -// when compile with -S. Define isCodeGenOnly = 0 because we want parser -// could parsing assembly "call" instruction. -let isCall = 1, Defs = [X1], isCodeGenOnly = 0, - hasSideEffects = 0, mayLoad = 0, mayStore = 0 in +// and jalr while encoding. This is desirable, as an auipc+jalr pair with +// R_RISCV_CALL and R_RISCV_RELAX relocations can be be relaxed by the linker +// if the offset fits in a signed 21-bit immediate. +// Define AsmString to print "call" when compile with -S flag. +// Define isCodeGenOnly = 0 to support parsing assembly "call" instruction. +let isCall = 1, Defs = [X1], isCodeGenOnly = 0 in def PseudoCALL : Pseudo<(outs), (ins bare_symbol:$func), - []> { + [(Call tglobaladdr:$func)]> { let AsmString = "call\t$func"; } +def : Pat<(Call texternalsym:$func), (PseudoCALL texternalsym:$func)>; + let isCall = 1, Defs = [X1] in def PseudoCALLIndirect : Pseudo<(outs), (ins GPR:$rs1), [(Call GPR:$rs1)]>, PseudoInstExpansion<(JALR X1, GPR:$rs1, 0)>; Index: test/CodeGen/RISCV/alloca.ll =================================================================== --- test/CodeGen/RISCV/alloca.ll +++ test/CodeGen/RISCV/alloca.ll @@ -18,9 +18,7 @@ ; RV32I-NEXT: andi a0, a0, -16 ; RV32I-NEXT: sub a0, sp, a0 ; RV32I-NEXT: mv sp, a0 -; RV32I-NEXT: lui a1, %hi(notdead) -; RV32I-NEXT: addi a1, a1, %lo(notdead) -; RV32I-NEXT: jalr a1 +; RV32I-NEXT: call notdead ; RV32I-NEXT: addi sp, s0, -16 ; RV32I-NEXT: lw s0, 8(sp) ; RV32I-NEXT: lw ra, 12(sp) @@ -47,9 +45,7 @@ ; RV32I-NEXT: andi a0, a0, -16 ; RV32I-NEXT: sub a0, sp, a0 ; RV32I-NEXT: mv sp, a0 -; RV32I-NEXT: lui a1, %hi(notdead) -; RV32I-NEXT: addi a1, a1, %lo(notdead) -; RV32I-NEXT: jalr a1 +; RV32I-NEXT: call notdead ; RV32I-NEXT: mv sp, s1 ; RV32I-NEXT: addi sp, s0, -16 ; RV32I-NEXT: lw s1, 4(sp) @@ -88,8 +84,6 @@ ; RV32I-NEXT: sw a1, 4(sp) ; RV32I-NEXT: addi a1, zero, 9 ; RV32I-NEXT: sw a1, 0(sp) -; RV32I-NEXT: lui a1, %hi(func) -; RV32I-NEXT: addi t0, a1, %lo(func) ; RV32I-NEXT: addi a1, zero, 2 ; RV32I-NEXT: addi a2, zero, 3 ; RV32I-NEXT: addi a3, zero, 4 @@ -97,7 +91,7 @@ ; RV32I-NEXT: addi a5, zero, 6 ; RV32I-NEXT: addi a6, zero, 7 ; RV32I-NEXT: addi a7, zero, 8 -; RV32I-NEXT: jalr t0 +; RV32I-NEXT: call func ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: addi sp, s0, -16 ; RV32I-NEXT: lw s0, 8(sp) Index: test/CodeGen/RISCV/analyze-branch.ll =================================================================== --- test/CodeGen/RISCV/analyze-branch.ll +++ test/CodeGen/RISCV/analyze-branch.ll @@ -20,16 +20,13 @@ ; RV32I-NEXT: addi a1, zero, 42 ; RV32I-NEXT: bne a0, a1, .LBB0_3 ; RV32I-NEXT: # %bb.1: # %true -; RV32I-NEXT: lui a0, %hi(test_true) -; RV32I-NEXT: addi a0, a0, %lo(test_true) +; RV32I-NEXT: call test_true ; RV32I-NEXT: .LBB0_2: # %true -; RV32I-NEXT: jalr a0 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret ; RV32I-NEXT: .LBB0_3: # %false -; RV32I-NEXT: lui a0, %hi(test_false) -; RV32I-NEXT: addi a0, a0, %lo(test_false) +; RV32I-NEXT: call test_false ; RV32I-NEXT: j .LBB0_2 %tst = icmp eq i32 %in, 42 br i1 %tst, label %true, label %false, !prof !0 @@ -55,16 +52,13 @@ ; RV32I-NEXT: addi a1, zero, 42 ; RV32I-NEXT: beq a0, a1, .LBB1_3 ; RV32I-NEXT: # %bb.1: # %false -; RV32I-NEXT: lui a0, %hi(test_false) -; RV32I-NEXT: addi a0, a0, %lo(test_false) +; RV32I-NEXT: call test_false ; RV32I-NEXT: .LBB1_2: # %true -; RV32I-NEXT: jalr a0 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret ; RV32I-NEXT: .LBB1_3: # %true -; RV32I-NEXT: lui a0, %hi(test_true) -; RV32I-NEXT: addi a0, a0, %lo(test_true) +; RV32I-NEXT: call test_true ; RV32I-NEXT: j .LBB1_2 %tst = icmp eq i32 %in, 42 br i1 %tst, label %true, label %false, !prof !1 Index: test/CodeGen/RISCV/bswap-ctlz-cttz-ctpop.ll =================================================================== --- test/CodeGen/RISCV/bswap-ctlz-cttz-ctpop.ll +++ test/CodeGen/RISCV/bswap-ctlz-cttz-ctpop.ll @@ -108,9 +108,7 @@ ; RV32I-NEXT: and a0, a0, a1 ; RV32I-NEXT: lui a1, 4112 ; RV32I-NEXT: addi a1, a1, 257 -; RV32I-NEXT: lui a2, %hi(__mulsi3) -; RV32I-NEXT: addi a2, a2, %lo(__mulsi3) -; RV32I-NEXT: jalr a2 +; RV32I-NEXT: call __mulsi3 ; RV32I-NEXT: srli a0, a0, 24 ; RV32I-NEXT: j .LBB3_3 ; RV32I-NEXT: .LBB3_2: @@ -154,9 +152,7 @@ ; RV32I-NEXT: and a0, a0, a1 ; RV32I-NEXT: lui a1, 4112 ; RV32I-NEXT: addi a1, a1, 257 -; RV32I-NEXT: lui a2, %hi(__mulsi3) -; RV32I-NEXT: addi a2, a2, %lo(__mulsi3) -; RV32I-NEXT: jalr a2 +; RV32I-NEXT: call __mulsi3 ; RV32I-NEXT: srli a0, a0, 24 ; RV32I-NEXT: j .LBB4_3 ; RV32I-NEXT: .LBB4_2: @@ -197,9 +193,7 @@ ; RV32I-NEXT: and a0, a0, a1 ; RV32I-NEXT: lui a1, 4112 ; RV32I-NEXT: addi a1, a1, 257 -; RV32I-NEXT: lui a2, %hi(__mulsi3) -; RV32I-NEXT: addi a2, a2, %lo(__mulsi3) -; RV32I-NEXT: jalr a2 +; RV32I-NEXT: call __mulsi3 ; RV32I-NEXT: srli a0, a0, 24 ; RV32I-NEXT: j .LBB5_3 ; RV32I-NEXT: .LBB5_2: @@ -248,9 +242,7 @@ ; RV32I-NEXT: and a0, a0, a1 ; RV32I-NEXT: lui a1, 4112 ; RV32I-NEXT: addi a1, a1, 257 -; RV32I-NEXT: lui a2, %hi(__mulsi3) -; RV32I-NEXT: addi a2, a2, %lo(__mulsi3) -; RV32I-NEXT: jalr a2 +; RV32I-NEXT: call __mulsi3 ; RV32I-NEXT: srli a0, a0, 24 ; RV32I-NEXT: j .LBB6_3 ; RV32I-NEXT: .LBB6_2: @@ -266,16 +258,15 @@ define i64 @test_cttz_i64(i64 %a) nounwind { ; RV32I-LABEL: test_cttz_i64: ; RV32I: # %bb.0: -; RV32I-NEXT: addi sp, sp, -48 -; RV32I-NEXT: sw ra, 44(sp) -; RV32I-NEXT: sw s1, 40(sp) -; RV32I-NEXT: sw s2, 36(sp) -; RV32I-NEXT: sw s3, 32(sp) -; RV32I-NEXT: sw s4, 28(sp) -; RV32I-NEXT: sw s5, 24(sp) -; RV32I-NEXT: sw s6, 20(sp) -; RV32I-NEXT: sw s7, 16(sp) -; RV32I-NEXT: sw s8, 12(sp) +; RV32I-NEXT: addi sp, sp, -32 +; RV32I-NEXT: sw ra, 28(sp) +; RV32I-NEXT: sw s1, 24(sp) +; RV32I-NEXT: sw s2, 20(sp) +; RV32I-NEXT: sw s3, 16(sp) +; RV32I-NEXT: sw s4, 12(sp) +; RV32I-NEXT: sw s5, 8(sp) +; RV32I-NEXT: sw s6, 4(sp) +; RV32I-NEXT: sw s7, 0(sp) ; RV32I-NEXT: mv s2, a1 ; RV32I-NEXT: mv s3, a0 ; RV32I-NEXT: addi a0, a0, -1 @@ -296,13 +287,11 @@ ; RV32I-NEXT: add a0, a0, a1 ; RV32I-NEXT: lui a1, 4112 ; RV32I-NEXT: addi s4, a1, 257 -; RV32I-NEXT: lui a1, %hi(__mulsi3) -; RV32I-NEXT: addi s7, a1, %lo(__mulsi3) ; RV32I-NEXT: lui a1, 61681 -; RV32I-NEXT: addi s8, a1, -241 -; RV32I-NEXT: and a0, a0, s8 +; RV32I-NEXT: addi s7, a1, -241 +; RV32I-NEXT: and a0, a0, s7 ; RV32I-NEXT: mv a1, s4 -; RV32I-NEXT: jalr s7 +; RV32I-NEXT: call __mulsi3 ; RV32I-NEXT: mv s1, a0 ; RV32I-NEXT: addi a0, s2, -1 ; RV32I-NEXT: not a1, s2 @@ -316,9 +305,9 @@ ; RV32I-NEXT: add a0, a1, a0 ; RV32I-NEXT: srli a1, a0, 4 ; RV32I-NEXT: add a0, a0, a1 -; RV32I-NEXT: and a0, a0, s8 +; RV32I-NEXT: and a0, a0, s7 ; RV32I-NEXT: mv a1, s4 -; RV32I-NEXT: jalr s7 +; RV32I-NEXT: call __mulsi3 ; RV32I-NEXT: bnez s3, .LBB7_2 ; RV32I-NEXT: # %bb.1: ; RV32I-NEXT: srli a0, a0, 24 @@ -328,16 +317,15 @@ ; RV32I-NEXT: srli a0, s1, 24 ; RV32I-NEXT: .LBB7_3: ; RV32I-NEXT: mv a1, zero -; RV32I-NEXT: lw s8, 12(sp) -; RV32I-NEXT: lw s7, 16(sp) -; RV32I-NEXT: lw s6, 20(sp) -; RV32I-NEXT: lw s5, 24(sp) -; RV32I-NEXT: lw s4, 28(sp) -; RV32I-NEXT: lw s3, 32(sp) -; RV32I-NEXT: lw s2, 36(sp) -; RV32I-NEXT: lw s1, 40(sp) -; RV32I-NEXT: lw ra, 44(sp) -; RV32I-NEXT: addi sp, sp, 48 +; RV32I-NEXT: lw s7, 0(sp) +; RV32I-NEXT: lw s6, 4(sp) +; RV32I-NEXT: lw s5, 8(sp) +; RV32I-NEXT: lw s4, 12(sp) +; RV32I-NEXT: lw s3, 16(sp) +; RV32I-NEXT: lw s2, 20(sp) +; RV32I-NEXT: lw s1, 24(sp) +; RV32I-NEXT: lw ra, 28(sp) +; RV32I-NEXT: addi sp, sp, 32 ; RV32I-NEXT: ret %tmp = call i64 @llvm.cttz.i64(i64 %a, i1 false) ret i64 %tmp @@ -369,9 +357,7 @@ ; RV32I-NEXT: and a0, a0, a1 ; RV32I-NEXT: lui a1, 4112 ; RV32I-NEXT: addi a1, a1, 257 -; RV32I-NEXT: lui a2, %hi(__mulsi3) -; RV32I-NEXT: addi a2, a2, %lo(__mulsi3) -; RV32I-NEXT: jalr a2 +; RV32I-NEXT: call __mulsi3 ; RV32I-NEXT: srli a0, a0, 24 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 @@ -406,9 +392,7 @@ ; RV32I-NEXT: and a0, a0, a1 ; RV32I-NEXT: lui a1, 4112 ; RV32I-NEXT: addi a1, a1, 257 -; RV32I-NEXT: lui a2, %hi(__mulsi3) -; RV32I-NEXT: addi a2, a2, %lo(__mulsi3) -; RV32I-NEXT: jalr a2 +; RV32I-NEXT: call __mulsi3 ; RV32I-NEXT: srli a0, a0, 24 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 @@ -443,9 +427,7 @@ ; RV32I-NEXT: and a0, a0, a1 ; RV32I-NEXT: lui a1, 4112 ; RV32I-NEXT: addi a1, a1, 257 -; RV32I-NEXT: lui a2, %hi(__mulsi3) -; RV32I-NEXT: addi a2, a2, %lo(__mulsi3) -; RV32I-NEXT: jalr a2 +; RV32I-NEXT: call __mulsi3 ; RV32I-NEXT: srli a0, a0, 24 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 @@ -457,16 +439,15 @@ define i64 @test_cttz_i64_zero_undef(i64 %a) nounwind { ; RV32I-LABEL: test_cttz_i64_zero_undef: ; RV32I: # %bb.0: -; RV32I-NEXT: addi sp, sp, -48 -; RV32I-NEXT: sw ra, 44(sp) -; RV32I-NEXT: sw s1, 40(sp) -; RV32I-NEXT: sw s2, 36(sp) -; RV32I-NEXT: sw s3, 32(sp) -; RV32I-NEXT: sw s4, 28(sp) -; RV32I-NEXT: sw s5, 24(sp) -; RV32I-NEXT: sw s6, 20(sp) -; RV32I-NEXT: sw s7, 16(sp) -; RV32I-NEXT: sw s8, 12(sp) +; RV32I-NEXT: addi sp, sp, -32 +; RV32I-NEXT: sw ra, 28(sp) +; RV32I-NEXT: sw s1, 24(sp) +; RV32I-NEXT: sw s2, 20(sp) +; RV32I-NEXT: sw s3, 16(sp) +; RV32I-NEXT: sw s4, 12(sp) +; RV32I-NEXT: sw s5, 8(sp) +; RV32I-NEXT: sw s6, 4(sp) +; RV32I-NEXT: sw s7, 0(sp) ; RV32I-NEXT: mv s2, a1 ; RV32I-NEXT: mv s3, a0 ; RV32I-NEXT: addi a0, a0, -1 @@ -487,13 +468,11 @@ ; RV32I-NEXT: add a0, a0, a1 ; RV32I-NEXT: lui a1, 4112 ; RV32I-NEXT: addi s4, a1, 257 -; RV32I-NEXT: lui a1, %hi(__mulsi3) -; RV32I-NEXT: addi s7, a1, %lo(__mulsi3) ; RV32I-NEXT: lui a1, 61681 -; RV32I-NEXT: addi s8, a1, -241 -; RV32I-NEXT: and a0, a0, s8 +; RV32I-NEXT: addi s7, a1, -241 +; RV32I-NEXT: and a0, a0, s7 ; RV32I-NEXT: mv a1, s4 -; RV32I-NEXT: jalr s7 +; RV32I-NEXT: call __mulsi3 ; RV32I-NEXT: mv s1, a0 ; RV32I-NEXT: addi a0, s2, -1 ; RV32I-NEXT: not a1, s2 @@ -507,9 +486,9 @@ ; RV32I-NEXT: add a0, a1, a0 ; RV32I-NEXT: srli a1, a0, 4 ; RV32I-NEXT: add a0, a0, a1 -; RV32I-NEXT: and a0, a0, s8 +; RV32I-NEXT: and a0, a0, s7 ; RV32I-NEXT: mv a1, s4 -; RV32I-NEXT: jalr s7 +; RV32I-NEXT: call __mulsi3 ; RV32I-NEXT: bnez s3, .LBB11_2 ; RV32I-NEXT: # %bb.1: ; RV32I-NEXT: srli a0, a0, 24 @@ -519,16 +498,15 @@ ; RV32I-NEXT: srli a0, s1, 24 ; RV32I-NEXT: .LBB11_3: ; RV32I-NEXT: mv a1, zero -; RV32I-NEXT: lw s8, 12(sp) -; RV32I-NEXT: lw s7, 16(sp) -; RV32I-NEXT: lw s6, 20(sp) -; RV32I-NEXT: lw s5, 24(sp) -; RV32I-NEXT: lw s4, 28(sp) -; RV32I-NEXT: lw s3, 32(sp) -; RV32I-NEXT: lw s2, 36(sp) -; RV32I-NEXT: lw s1, 40(sp) -; RV32I-NEXT: lw ra, 44(sp) -; RV32I-NEXT: addi sp, sp, 48 +; RV32I-NEXT: lw s7, 0(sp) +; RV32I-NEXT: lw s6, 4(sp) +; RV32I-NEXT: lw s5, 8(sp) +; RV32I-NEXT: lw s4, 12(sp) +; RV32I-NEXT: lw s3, 16(sp) +; RV32I-NEXT: lw s2, 20(sp) +; RV32I-NEXT: lw s1, 24(sp) +; RV32I-NEXT: lw ra, 28(sp) +; RV32I-NEXT: addi sp, sp, 32 ; RV32I-NEXT: ret %tmp = call i64 @llvm.cttz.i64(i64 %a, i1 true) ret i64 %tmp @@ -557,9 +535,7 @@ ; RV32I-NEXT: and a0, a0, a1 ; RV32I-NEXT: lui a1, 4112 ; RV32I-NEXT: addi a1, a1, 257 -; RV32I-NEXT: lui a2, %hi(__mulsi3) -; RV32I-NEXT: addi a2, a2, %lo(__mulsi3) -; RV32I-NEXT: jalr a2 +; RV32I-NEXT: call __mulsi3 ; RV32I-NEXT: srli a0, a0, 24 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 Index: test/CodeGen/RISCV/byval.ll =================================================================== --- test/CodeGen/RISCV/byval.ll +++ test/CodeGen/RISCV/byval.ll @@ -34,10 +34,8 @@ ; RV32I-NEXT: lui a0, %hi(foo) ; RV32I-NEXT: lw a0, %lo(foo)(a0) ; RV32I-NEXT: sw a0, 12(sp) -; RV32I-NEXT: lui a0, %hi(callee) -; RV32I-NEXT: addi a1, a0, %lo(callee) ; RV32I-NEXT: addi a0, sp, 12 -; RV32I-NEXT: jalr a1 +; RV32I-NEXT: call callee ; RV32I-NEXT: lw ra, 28(sp) ; RV32I-NEXT: addi sp, sp, 32 ; RV32I-NEXT: ret Index: test/CodeGen/RISCV/calling-conv-sext-zext.ll =================================================================== --- test/CodeGen/RISCV/calling-conv-sext-zext.ll +++ test/CodeGen/RISCV/calling-conv-sext-zext.ll @@ -16,9 +16,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a1, %hi(receive_uint8) -; RV32I-NEXT: addi a1, a1, %lo(receive_uint8) -; RV32I-NEXT: jalr a1 +; RV32I-NEXT: call receive_uint8 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -33,9 +31,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a0, %hi(return_uint8) -; RV32I-NEXT: addi a0, a0, %lo(return_uint8) -; RV32I-NEXT: jalr a0 +; RV32I-NEXT: call return_uint8 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -59,11 +55,9 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a1, %hi(receive_sint8) -; RV32I-NEXT: addi a1, a1, %lo(receive_sint8) ; RV32I-NEXT: slli a0, a0, 24 ; RV32I-NEXT: srai a0, a0, 24 -; RV32I-NEXT: jalr a1 +; RV32I-NEXT: call receive_sint8 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -77,9 +71,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a0, %hi(return_uint8) -; RV32I-NEXT: addi a0, a0, %lo(return_uint8) -; RV32I-NEXT: jalr a0 +; RV32I-NEXT: call return_uint8 ; RV32I-NEXT: slli a0, a0, 24 ; RV32I-NEXT: srai a0, a0, 24 ; RV32I-NEXT: lw ra, 12(sp) @@ -104,9 +96,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a1, %hi(receive_anyint32) -; RV32I-NEXT: addi a1, a1, %lo(receive_anyint32) -; RV32I-NEXT: jalr a1 +; RV32I-NEXT: call receive_anyint32 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -120,9 +110,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a0, %hi(return_uint8) -; RV32I-NEXT: addi a0, a0, %lo(return_uint8) -; RV32I-NEXT: jalr a0 +; RV32I-NEXT: call return_uint8 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -145,9 +133,7 @@ ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) ; RV32I-NEXT: andi a0, a0, 255 -; RV32I-NEXT: lui a1, %hi(receive_uint8) -; RV32I-NEXT: addi a1, a1, %lo(receive_uint8) -; RV32I-NEXT: jalr a1 +; RV32I-NEXT: call receive_uint8 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -162,9 +148,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a0, %hi(return_sint8) -; RV32I-NEXT: addi a0, a0, %lo(return_sint8) -; RV32I-NEXT: jalr a0 +; RV32I-NEXT: call return_sint8 ; RV32I-NEXT: andi a0, a0, 255 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 @@ -185,9 +169,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a1, %hi(receive_sint8) -; RV32I-NEXT: addi a1, a1, %lo(receive_sint8) -; RV32I-NEXT: jalr a1 +; RV32I-NEXT: call receive_sint8 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -200,9 +182,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a0, %hi(return_sint8) -; RV32I-NEXT: addi a0, a0, %lo(return_sint8) -; RV32I-NEXT: jalr a0 +; RV32I-NEXT: call return_sint8 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -223,9 +203,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a1, %hi(receive_anyint32) -; RV32I-NEXT: addi a1, a1, %lo(receive_anyint32) -; RV32I-NEXT: jalr a1 +; RV32I-NEXT: call receive_anyint32 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -239,9 +217,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a0, %hi(return_sint8) -; RV32I-NEXT: addi a0, a0, %lo(return_sint8) -; RV32I-NEXT: jalr a0 +; RV32I-NEXT: call return_sint8 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -265,9 +241,7 @@ ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) ; RV32I-NEXT: andi a0, a0, 255 -; RV32I-NEXT: lui a1, %hi(receive_uint8) -; RV32I-NEXT: addi a1, a1, %lo(receive_uint8) -; RV32I-NEXT: jalr a1 +; RV32I-NEXT: call receive_uint8 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -283,9 +257,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a0, %hi(return_anyint32) -; RV32I-NEXT: addi a0, a0, %lo(return_anyint32) -; RV32I-NEXT: jalr a0 +; RV32I-NEXT: call return_anyint32 ; RV32I-NEXT: andi a0, a0, 255 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 @@ -310,11 +282,9 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a1, %hi(receive_sint8) -; RV32I-NEXT: addi a1, a1, %lo(receive_sint8) ; RV32I-NEXT: slli a0, a0, 24 ; RV32I-NEXT: srai a0, a0, 24 -; RV32I-NEXT: jalr a1 +; RV32I-NEXT: call receive_sint8 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -328,9 +298,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a0, %hi(return_anyint32) -; RV32I-NEXT: addi a0, a0, %lo(return_anyint32) -; RV32I-NEXT: jalr a0 +; RV32I-NEXT: call return_anyint32 ; RV32I-NEXT: slli a0, a0, 24 ; RV32I-NEXT: srai a0, a0, 24 ; RV32I-NEXT: lw ra, 12(sp) @@ -353,9 +321,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a1, %hi(receive_anyint32) -; RV32I-NEXT: addi a1, a1, %lo(receive_anyint32) -; RV32I-NEXT: jalr a1 +; RV32I-NEXT: call receive_anyint32 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -368,9 +334,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a0, %hi(return_anyint32) -; RV32I-NEXT: addi a0, a0, %lo(return_anyint32) -; RV32I-NEXT: jalr a0 +; RV32I-NEXT: call return_anyint32 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret Index: test/CodeGen/RISCV/calling-conv.ll =================================================================== --- test/CodeGen/RISCV/calling-conv.ll +++ test/CodeGen/RISCV/calling-conv.ll @@ -23,11 +23,9 @@ ; RV32I-FPELIM-NEXT: mv s2, a3 ; RV32I-FPELIM-NEXT: mv s3, a1 ; RV32I-FPELIM-NEXT: mv s4, a0 -; RV32I-FPELIM-NEXT: lui a0, %hi(__fixdfsi) -; RV32I-FPELIM-NEXT: addi a2, a0, %lo(__fixdfsi) ; RV32I-FPELIM-NEXT: mv a0, a5 ; RV32I-FPELIM-NEXT: mv a1, a6 -; RV32I-FPELIM-NEXT: jalr a2 +; RV32I-FPELIM-NEXT: call __fixdfsi ; RV32I-FPELIM-NEXT: add a1, s4, s3 ; RV32I-FPELIM-NEXT: add a1, a1, s2 ; RV32I-FPELIM-NEXT: add a1, a1, s1 @@ -54,11 +52,9 @@ ; RV32I-WITHFP-NEXT: mv s2, a3 ; RV32I-WITHFP-NEXT: mv s3, a1 ; RV32I-WITHFP-NEXT: mv s4, a0 -; RV32I-WITHFP-NEXT: lui a0, %hi(__fixdfsi) -; RV32I-WITHFP-NEXT: addi a2, a0, %lo(__fixdfsi) ; RV32I-WITHFP-NEXT: mv a0, a5 ; RV32I-WITHFP-NEXT: mv a1, a6 -; RV32I-WITHFP-NEXT: jalr a2 +; RV32I-WITHFP-NEXT: call __fixdfsi ; RV32I-WITHFP-NEXT: add a1, s4, s3 ; RV32I-WITHFP-NEXT: add a1, a1, s2 ; RV32I-WITHFP-NEXT: add a1, a1, s1 @@ -87,15 +83,13 @@ ; RV32I-FPELIM-NEXT: sw ra, 12(sp) ; RV32I-FPELIM-NEXT: lui a0, 262464 ; RV32I-FPELIM-NEXT: mv a6, a0 -; RV32I-FPELIM-NEXT: lui a0, %hi(callee_scalars) -; RV32I-FPELIM-NEXT: addi a7, a0, %lo(callee_scalars) ; RV32I-FPELIM-NEXT: addi a0, zero, 1 ; RV32I-FPELIM-NEXT: addi a1, zero, 2 ; RV32I-FPELIM-NEXT: addi a3, zero, 3 ; RV32I-FPELIM-NEXT: addi a4, zero, 4 ; RV32I-FPELIM-NEXT: mv a2, zero ; RV32I-FPELIM-NEXT: mv a5, zero -; RV32I-FPELIM-NEXT: jalr a7 +; RV32I-FPELIM-NEXT: call callee_scalars ; RV32I-FPELIM-NEXT: lw ra, 12(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 16 ; RV32I-FPELIM-NEXT: ret @@ -108,15 +102,13 @@ ; RV32I-WITHFP-NEXT: addi s0, sp, 16 ; RV32I-WITHFP-NEXT: lui a0, 262464 ; RV32I-WITHFP-NEXT: mv a6, a0 -; RV32I-WITHFP-NEXT: lui a0, %hi(callee_scalars) -; RV32I-WITHFP-NEXT: addi a7, a0, %lo(callee_scalars) ; RV32I-WITHFP-NEXT: addi a0, zero, 1 ; RV32I-WITHFP-NEXT: addi a1, zero, 2 ; RV32I-WITHFP-NEXT: addi a3, zero, 3 ; RV32I-WITHFP-NEXT: addi a4, zero, 4 ; RV32I-WITHFP-NEXT: mv a2, zero ; RV32I-WITHFP-NEXT: mv a5, zero -; RV32I-WITHFP-NEXT: jalr a7 +; RV32I-WITHFP-NEXT: call callee_scalars ; RV32I-WITHFP-NEXT: lw s0, 8(sp) ; RV32I-WITHFP-NEXT: lw ra, 12(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 16 @@ -198,11 +190,9 @@ ; RV32I-FPELIM-NEXT: lui a0, 524272 ; RV32I-FPELIM-NEXT: mv a0, a0 ; RV32I-FPELIM-NEXT: sw a0, 12(sp) -; RV32I-FPELIM-NEXT: lui a0, %hi(callee_large_scalars) -; RV32I-FPELIM-NEXT: addi a2, a0, %lo(callee_large_scalars) ; RV32I-FPELIM-NEXT: addi a0, sp, 24 ; RV32I-FPELIM-NEXT: mv a1, sp -; RV32I-FPELIM-NEXT: jalr a2 +; RV32I-FPELIM-NEXT: call callee_large_scalars ; RV32I-FPELIM-NEXT: lw ra, 44(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 48 ; RV32I-FPELIM-NEXT: ret @@ -224,11 +214,9 @@ ; RV32I-WITHFP-NEXT: lui a0, 524272 ; RV32I-WITHFP-NEXT: mv a0, a0 ; RV32I-WITHFP-NEXT: sw a0, -36(s0) -; RV32I-WITHFP-NEXT: lui a0, %hi(callee_large_scalars) -; RV32I-WITHFP-NEXT: addi a2, a0, %lo(callee_large_scalars) ; RV32I-WITHFP-NEXT: addi a0, s0, -24 ; RV32I-WITHFP-NEXT: addi a1, s0, -48 -; RV32I-WITHFP-NEXT: jalr a2 +; RV32I-WITHFP-NEXT: call callee_large_scalars ; RV32I-WITHFP-NEXT: lw s0, 40(sp) ; RV32I-WITHFP-NEXT: lw ra, 44(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 48 @@ -317,8 +305,6 @@ ; RV32I-FPELIM-NEXT: lui a0, 524272 ; RV32I-FPELIM-NEXT: mv a0, a0 ; RV32I-FPELIM-NEXT: sw a0, 28(sp) -; RV32I-FPELIM-NEXT: lui a0, %hi(callee_large_scalars_exhausted_regs) -; RV32I-FPELIM-NEXT: addi t0, a0, %lo(callee_large_scalars_exhausted_regs) ; RV32I-FPELIM-NEXT: addi a0, zero, 1 ; RV32I-FPELIM-NEXT: addi a1, zero, 2 ; RV32I-FPELIM-NEXT: addi a2, zero, 3 @@ -327,7 +313,7 @@ ; RV32I-FPELIM-NEXT: addi a5, zero, 6 ; RV32I-FPELIM-NEXT: addi a6, zero, 7 ; RV32I-FPELIM-NEXT: addi a7, sp, 40 -; RV32I-FPELIM-NEXT: jalr t0 +; RV32I-FPELIM-NEXT: call callee_large_scalars_exhausted_regs ; RV32I-FPELIM-NEXT: lw ra, 60(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 64 ; RV32I-FPELIM-NEXT: ret @@ -353,8 +339,6 @@ ; RV32I-WITHFP-NEXT: lui a0, 524272 ; RV32I-WITHFP-NEXT: mv a0, a0 ; RV32I-WITHFP-NEXT: sw a0, -36(s0) -; RV32I-WITHFP-NEXT: lui a0, %hi(callee_large_scalars_exhausted_regs) -; RV32I-WITHFP-NEXT: addi t0, a0, %lo(callee_large_scalars_exhausted_regs) ; RV32I-WITHFP-NEXT: addi a0, zero, 1 ; RV32I-WITHFP-NEXT: addi a1, zero, 2 ; RV32I-WITHFP-NEXT: addi a2, zero, 3 @@ -363,7 +347,7 @@ ; RV32I-WITHFP-NEXT: addi a5, zero, 6 ; RV32I-WITHFP-NEXT: addi a6, zero, 7 ; RV32I-WITHFP-NEXT: addi a7, s0, -24 -; RV32I-WITHFP-NEXT: jalr t0 +; RV32I-WITHFP-NEXT: call callee_large_scalars_exhausted_regs ; RV32I-WITHFP-NEXT: lw s0, 56(sp) ; RV32I-WITHFP-NEXT: lw ra, 60(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 64 @@ -383,10 +367,8 @@ ; RV32I-FPELIM-NEXT: sw ra, 28(sp) ; RV32I-FPELIM-NEXT: mv a2, a1 ; RV32I-FPELIM-NEXT: mv a1, a0 -; RV32I-FPELIM-NEXT: lui a0, %hi(__floatditf) -; RV32I-FPELIM-NEXT: addi a3, a0, %lo(__floatditf) ; RV32I-FPELIM-NEXT: addi a0, sp, 8 -; RV32I-FPELIM-NEXT: jalr a3 +; RV32I-FPELIM-NEXT: call __floatditf ; RV32I-FPELIM-NEXT: lw a0, 8(sp) ; RV32I-FPELIM-NEXT: lw ra, 28(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 32 @@ -400,10 +382,8 @@ ; RV32I-WITHFP-NEXT: addi s0, sp, 32 ; RV32I-WITHFP-NEXT: mv a2, a1 ; RV32I-WITHFP-NEXT: mv a1, a0 -; RV32I-WITHFP-NEXT: lui a0, %hi(__floatditf) -; RV32I-WITHFP-NEXT: addi a3, a0, %lo(__floatditf) ; RV32I-WITHFP-NEXT: addi a0, s0, -24 -; RV32I-WITHFP-NEXT: jalr a3 +; RV32I-WITHFP-NEXT: call __floatditf ; RV32I-WITHFP-NEXT: lw a0, -24(s0) ; RV32I-WITHFP-NEXT: lw s0, 24(sp) ; RV32I-WITHFP-NEXT: lw ra, 28(sp) @@ -487,8 +467,6 @@ ; RV32I-FPELIM-NEXT: addi a0, zero, 8 ; RV32I-FPELIM-NEXT: sw a0, 4(sp) ; RV32I-FPELIM-NEXT: sw zero, 0(sp) -; RV32I-FPELIM-NEXT: lui a0, %hi(callee_many_scalars) -; RV32I-FPELIM-NEXT: addi t0, a0, %lo(callee_many_scalars) ; RV32I-FPELIM-NEXT: addi a0, zero, 1 ; RV32I-FPELIM-NEXT: addi a1, zero, 2 ; RV32I-FPELIM-NEXT: addi a2, zero, 3 @@ -497,7 +475,7 @@ ; RV32I-FPELIM-NEXT: addi a6, zero, 6 ; RV32I-FPELIM-NEXT: addi a7, zero, 7 ; RV32I-FPELIM-NEXT: mv a4, zero -; RV32I-FPELIM-NEXT: jalr t0 +; RV32I-FPELIM-NEXT: call callee_many_scalars ; RV32I-FPELIM-NEXT: lw ra, 12(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 16 ; RV32I-FPELIM-NEXT: ret @@ -511,8 +489,6 @@ ; RV32I-WITHFP-NEXT: addi a0, zero, 8 ; RV32I-WITHFP-NEXT: sw a0, 4(sp) ; RV32I-WITHFP-NEXT: sw zero, 0(sp) -; RV32I-WITHFP-NEXT: lui a0, %hi(callee_many_scalars) -; RV32I-WITHFP-NEXT: addi t0, a0, %lo(callee_many_scalars) ; RV32I-WITHFP-NEXT: addi a0, zero, 1 ; RV32I-WITHFP-NEXT: addi a1, zero, 2 ; RV32I-WITHFP-NEXT: addi a2, zero, 3 @@ -521,7 +497,7 @@ ; RV32I-WITHFP-NEXT: addi a6, zero, 6 ; RV32I-WITHFP-NEXT: addi a7, zero, 7 ; RV32I-WITHFP-NEXT: mv a4, zero -; RV32I-WITHFP-NEXT: jalr t0 +; RV32I-WITHFP-NEXT: call callee_many_scalars ; RV32I-WITHFP-NEXT: lw s0, 8(sp) ; RV32I-WITHFP-NEXT: lw ra, 12(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 16 @@ -565,11 +541,9 @@ ; RV32I-FPELIM: # %bb.0: ; RV32I-FPELIM-NEXT: addi sp, sp, -16 ; RV32I-FPELIM-NEXT: sw ra, 12(sp) -; RV32I-FPELIM-NEXT: lui a0, %hi(callee_small_coerced_struct) -; RV32I-FPELIM-NEXT: addi a2, a0, %lo(callee_small_coerced_struct) ; RV32I-FPELIM-NEXT: addi a0, zero, 1 ; RV32I-FPELIM-NEXT: addi a1, zero, 2 -; RV32I-FPELIM-NEXT: jalr a2 +; RV32I-FPELIM-NEXT: call callee_small_coerced_struct ; RV32I-FPELIM-NEXT: lw ra, 12(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 16 ; RV32I-FPELIM-NEXT: ret @@ -580,11 +554,9 @@ ; RV32I-WITHFP-NEXT: sw ra, 12(sp) ; RV32I-WITHFP-NEXT: sw s0, 8(sp) ; RV32I-WITHFP-NEXT: addi s0, sp, 16 -; RV32I-WITHFP-NEXT: lui a0, %hi(callee_small_coerced_struct) -; RV32I-WITHFP-NEXT: addi a2, a0, %lo(callee_small_coerced_struct) ; RV32I-WITHFP-NEXT: addi a0, zero, 1 ; RV32I-WITHFP-NEXT: addi a1, zero, 2 -; RV32I-WITHFP-NEXT: jalr a2 +; RV32I-WITHFP-NEXT: call callee_small_coerced_struct ; RV32I-WITHFP-NEXT: lw s0, 8(sp) ; RV32I-WITHFP-NEXT: lw ra, 12(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 16 @@ -643,10 +615,8 @@ ; RV32I-FPELIM-NEXT: addi a0, zero, 4 ; RV32I-FPELIM-NEXT: sw a0, 36(sp) ; RV32I-FPELIM-NEXT: sw a0, 20(sp) -; RV32I-FPELIM-NEXT: lui a0, %hi(callee_large_struct) -; RV32I-FPELIM-NEXT: addi a1, a0, %lo(callee_large_struct) ; RV32I-FPELIM-NEXT: addi a0, sp, 8 -; RV32I-FPELIM-NEXT: jalr a1 +; RV32I-FPELIM-NEXT: call callee_large_struct ; RV32I-FPELIM-NEXT: lw ra, 44(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 48 ; RV32I-FPELIM-NEXT: ret @@ -669,10 +639,8 @@ ; RV32I-WITHFP-NEXT: addi a0, zero, 4 ; RV32I-WITHFP-NEXT: sw a0, -12(s0) ; RV32I-WITHFP-NEXT: sw a0, -28(s0) -; RV32I-WITHFP-NEXT: lui a0, %hi(callee_large_struct) -; RV32I-WITHFP-NEXT: addi a1, a0, %lo(callee_large_struct) ; RV32I-WITHFP-NEXT: addi a0, s0, -40 -; RV32I-WITHFP-NEXT: jalr a1 +; RV32I-WITHFP-NEXT: call callee_large_struct ; RV32I-WITHFP-NEXT: lw s0, 40(sp) ; RV32I-WITHFP-NEXT: lw ra, 44(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 48 @@ -778,8 +746,6 @@ ; RV32I-FPELIM-NEXT: sw a0, 32(sp) ; RV32I-FPELIM-NEXT: lui a0, 688509 ; RV32I-FPELIM-NEXT: addi a5, a0, -2048 -; RV32I-FPELIM-NEXT: lui a0, %hi(callee_aligned_stack) -; RV32I-FPELIM-NEXT: addi t0, a0, %lo(callee_aligned_stack) ; RV32I-FPELIM-NEXT: addi a0, zero, 1 ; RV32I-FPELIM-NEXT: addi a1, zero, 11 ; RV32I-FPELIM-NEXT: addi a2, sp, 32 @@ -787,7 +753,7 @@ ; RV32I-FPELIM-NEXT: addi a4, zero, 13 ; RV32I-FPELIM-NEXT: addi a6, zero, 4 ; RV32I-FPELIM-NEXT: addi a7, zero, 14 -; RV32I-FPELIM-NEXT: jalr t0 +; RV32I-FPELIM-NEXT: call callee_aligned_stack ; RV32I-FPELIM-NEXT: lw ra, 60(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 64 ; RV32I-FPELIM-NEXT: ret @@ -826,8 +792,6 @@ ; RV32I-WITHFP-NEXT: sw a0, -32(s0) ; RV32I-WITHFP-NEXT: lui a0, 688509 ; RV32I-WITHFP-NEXT: addi a5, a0, -2048 -; RV32I-WITHFP-NEXT: lui a0, %hi(callee_aligned_stack) -; RV32I-WITHFP-NEXT: addi t0, a0, %lo(callee_aligned_stack) ; RV32I-WITHFP-NEXT: addi a0, zero, 1 ; RV32I-WITHFP-NEXT: addi a1, zero, 11 ; RV32I-WITHFP-NEXT: addi a2, s0, -32 @@ -835,7 +799,7 @@ ; RV32I-WITHFP-NEXT: addi a4, zero, 13 ; RV32I-WITHFP-NEXT: addi a6, zero, 4 ; RV32I-WITHFP-NEXT: addi a7, zero, 14 -; RV32I-WITHFP-NEXT: jalr t0 +; RV32I-WITHFP-NEXT: call callee_aligned_stack ; RV32I-WITHFP-NEXT: lw s0, 56(sp) ; RV32I-WITHFP-NEXT: lw ra, 60(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 64 @@ -878,18 +842,18 @@ ; RV32I-FPELIM: # %bb.0: ; RV32I-FPELIM-NEXT: addi sp, sp, -16 ; RV32I-FPELIM-NEXT: sw ra, 12(sp) -; RV32I-FPELIM-NEXT: lui a0, %hi(callee_small_scalar_ret) -; RV32I-FPELIM-NEXT: addi a0, a0, %lo(callee_small_scalar_ret) -; RV32I-FPELIM-NEXT: jalr a0 -; RV32I-FPELIM-NEXT: lui a2, 56 -; RV32I-FPELIM-NEXT: addi a2, a2, 580 -; RV32I-FPELIM-NEXT: xor a1, a1, a2 +; RV32I-FPELIM-NEXT: sw s1, 8(sp) +; RV32I-FPELIM-NEXT: lui a0, 56 +; RV32I-FPELIM-NEXT: addi s1, a0, 580 +; RV32I-FPELIM-NEXT: call callee_small_scalar_ret +; RV32I-FPELIM-NEXT: xor a1, a1, s1 ; RV32I-FPELIM-NEXT: lui a2, 200614 ; RV32I-FPELIM-NEXT: addi a2, a2, 647 ; RV32I-FPELIM-NEXT: xor a0, a0, a2 ; RV32I-FPELIM-NEXT: or a0, a0, a1 ; RV32I-FPELIM-NEXT: xor a0, a0, zero ; RV32I-FPELIM-NEXT: seqz a0, a0 +; RV32I-FPELIM-NEXT: lw s1, 8(sp) ; RV32I-FPELIM-NEXT: lw ra, 12(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 16 ; RV32I-FPELIM-NEXT: ret @@ -899,19 +863,19 @@ ; RV32I-WITHFP-NEXT: addi sp, sp, -16 ; RV32I-WITHFP-NEXT: sw ra, 12(sp) ; RV32I-WITHFP-NEXT: sw s0, 8(sp) +; RV32I-WITHFP-NEXT: sw s1, 4(sp) ; RV32I-WITHFP-NEXT: addi s0, sp, 16 -; RV32I-WITHFP-NEXT: lui a0, %hi(callee_small_scalar_ret) -; RV32I-WITHFP-NEXT: addi a0, a0, %lo(callee_small_scalar_ret) -; RV32I-WITHFP-NEXT: jalr a0 -; RV32I-WITHFP-NEXT: lui a2, 56 -; RV32I-WITHFP-NEXT: addi a2, a2, 580 -; RV32I-WITHFP-NEXT: xor a1, a1, a2 +; RV32I-WITHFP-NEXT: lui a0, 56 +; RV32I-WITHFP-NEXT: addi s1, a0, 580 +; RV32I-WITHFP-NEXT: call callee_small_scalar_ret +; RV32I-WITHFP-NEXT: xor a1, a1, s1 ; RV32I-WITHFP-NEXT: lui a2, 200614 ; RV32I-WITHFP-NEXT: addi a2, a2, 647 ; RV32I-WITHFP-NEXT: xor a0, a0, a2 ; RV32I-WITHFP-NEXT: or a0, a0, a1 ; RV32I-WITHFP-NEXT: xor a0, a0, zero ; RV32I-WITHFP-NEXT: seqz a0, a0 +; RV32I-WITHFP-NEXT: lw s1, 4(sp) ; RV32I-WITHFP-NEXT: lw s0, 8(sp) ; RV32I-WITHFP-NEXT: lw ra, 12(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 16 @@ -951,9 +915,7 @@ ; RV32I-FPELIM: # %bb.0: ; RV32I-FPELIM-NEXT: addi sp, sp, -16 ; RV32I-FPELIM-NEXT: sw ra, 12(sp) -; RV32I-FPELIM-NEXT: lui a0, %hi(callee_small_struct_ret) -; RV32I-FPELIM-NEXT: addi a0, a0, %lo(callee_small_struct_ret) -; RV32I-FPELIM-NEXT: jalr a0 +; RV32I-FPELIM-NEXT: call callee_small_struct_ret ; RV32I-FPELIM-NEXT: add a0, a0, a1 ; RV32I-FPELIM-NEXT: lw ra, 12(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 16 @@ -965,9 +927,7 @@ ; RV32I-WITHFP-NEXT: sw ra, 12(sp) ; RV32I-WITHFP-NEXT: sw s0, 8(sp) ; RV32I-WITHFP-NEXT: addi s0, sp, 16 -; RV32I-WITHFP-NEXT: lui a0, %hi(callee_small_struct_ret) -; RV32I-WITHFP-NEXT: addi a0, a0, %lo(callee_small_struct_ret) -; RV32I-WITHFP-NEXT: jalr a0 +; RV32I-WITHFP-NEXT: call callee_small_struct_ret ; RV32I-WITHFP-NEXT: add a0, a0, a1 ; RV32I-WITHFP-NEXT: lw s0, 8(sp) ; RV32I-WITHFP-NEXT: lw ra, 12(sp) @@ -1018,10 +978,8 @@ ; RV32I-FPELIM: # %bb.0: ; RV32I-FPELIM-NEXT: addi sp, sp, -32 ; RV32I-FPELIM-NEXT: sw ra, 28(sp) -; RV32I-FPELIM-NEXT: lui a0, %hi(callee_large_scalar_ret) -; RV32I-FPELIM-NEXT: addi a1, a0, %lo(callee_large_scalar_ret) ; RV32I-FPELIM-NEXT: mv a0, sp -; RV32I-FPELIM-NEXT: jalr a1 +; RV32I-FPELIM-NEXT: call callee_large_scalar_ret ; RV32I-FPELIM-NEXT: lw ra, 28(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 32 ; RV32I-FPELIM-NEXT: ret @@ -1032,10 +990,8 @@ ; RV32I-WITHFP-NEXT: sw ra, 28(sp) ; RV32I-WITHFP-NEXT: sw s0, 24(sp) ; RV32I-WITHFP-NEXT: addi s0, sp, 32 -; RV32I-WITHFP-NEXT: lui a0, %hi(callee_large_scalar_ret) -; RV32I-WITHFP-NEXT: addi a1, a0, %lo(callee_large_scalar_ret) ; RV32I-WITHFP-NEXT: addi a0, s0, -32 -; RV32I-WITHFP-NEXT: jalr a1 +; RV32I-WITHFP-NEXT: call callee_large_scalar_ret ; RV32I-WITHFP-NEXT: lw s0, 24(sp) ; RV32I-WITHFP-NEXT: lw ra, 28(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 32 @@ -1093,10 +1049,8 @@ ; RV32I-FPELIM: # %bb.0: ; RV32I-FPELIM-NEXT: addi sp, sp, -32 ; RV32I-FPELIM-NEXT: sw ra, 28(sp) -; RV32I-FPELIM-NEXT: lui a0, %hi(callee_large_struct_ret) -; RV32I-FPELIM-NEXT: addi a1, a0, %lo(callee_large_struct_ret) ; RV32I-FPELIM-NEXT: addi a0, sp, 8 -; RV32I-FPELIM-NEXT: jalr a1 +; RV32I-FPELIM-NEXT: call callee_large_struct_ret ; RV32I-FPELIM-NEXT: lw a0, 20(sp) ; RV32I-FPELIM-NEXT: lw a1, 8(sp) ; RV32I-FPELIM-NEXT: add a0, a1, a0 @@ -1110,10 +1064,8 @@ ; RV32I-WITHFP-NEXT: sw ra, 28(sp) ; RV32I-WITHFP-NEXT: sw s0, 24(sp) ; RV32I-WITHFP-NEXT: addi s0, sp, 32 -; RV32I-WITHFP-NEXT: lui a0, %hi(callee_large_struct_ret) -; RV32I-WITHFP-NEXT: addi a1, a0, %lo(callee_large_struct_ret) ; RV32I-WITHFP-NEXT: addi a0, s0, -24 -; RV32I-WITHFP-NEXT: jalr a1 +; RV32I-WITHFP-NEXT: call callee_large_struct_ret ; RV32I-WITHFP-NEXT: lw a0, -12(s0) ; RV32I-WITHFP-NEXT: lw a1, -24(s0) ; RV32I-WITHFP-NEXT: add a0, a1, a0 Index: test/CodeGen/RISCV/calls.ll =================================================================== --- test/CodeGen/RISCV/calls.ll +++ test/CodeGen/RISCV/calls.ll @@ -9,9 +9,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a1, %hi(external_function) -; RV32I-NEXT: addi a1, a1, %lo(external_function) -; RV32I-NEXT: jalr a1 +; RV32I-NEXT: call external_function ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -33,9 +31,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a1, %hi(defined_function) -; RV32I-NEXT: addi a1, a1, %lo(defined_function) -; RV32I-NEXT: jalr a1 +; RV32I-NEXT: call defined_function ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -77,10 +73,7 @@ ; RV32I-NEXT: sw ra, 12(sp) ; RV32I-NEXT: sw s1, 8(sp) ; RV32I-NEXT: mv s1, a0 -; RV32I-NEXT: lui a0, %hi(fastcc_function) -; RV32I-NEXT: addi a2, a0, %lo(fastcc_function) -; RV32I-NEXT: mv a0, s1 -; RV32I-NEXT: jalr a2 +; RV32I-NEXT: call fastcc_function ; RV32I-NEXT: mv a0, s1 ; RV32I-NEXT: lw s1, 8(sp) ; RV32I-NEXT: lw ra, 12(sp) @@ -101,17 +94,14 @@ ; RV32I-NEXT: mv s1, a0 ; RV32I-NEXT: sw a0, 4(sp) ; RV32I-NEXT: sw a0, 0(sp) -; RV32I-NEXT: lui a0, %hi(external_many_args) -; RV32I-NEXT: addi t0, a0, %lo(external_many_args) -; RV32I-NEXT: mv a0, s1 -; RV32I-NEXT: mv a1, s1 -; RV32I-NEXT: mv a2, s1 -; RV32I-NEXT: mv a3, s1 -; RV32I-NEXT: mv a4, s1 -; RV32I-NEXT: mv a5, s1 -; RV32I-NEXT: mv a6, s1 -; RV32I-NEXT: mv a7, s1 -; RV32I-NEXT: jalr t0 +; RV32I-NEXT: mv a1, a0 +; RV32I-NEXT: mv a2, a0 +; RV32I-NEXT: mv a3, a0 +; RV32I-NEXT: mv a4, a0 +; RV32I-NEXT: mv a5, a0 +; RV32I-NEXT: mv a6, a0 +; RV32I-NEXT: mv a7, a0 +; RV32I-NEXT: call external_many_args ; RV32I-NEXT: mv a0, s1 ; RV32I-NEXT: lw s1, 8(sp) ; RV32I-NEXT: lw ra, 12(sp) @@ -139,8 +129,6 @@ ; RV32I-NEXT: sw ra, 12(sp) ; RV32I-NEXT: sw a0, 4(sp) ; RV32I-NEXT: sw a0, 0(sp) -; RV32I-NEXT: lui a1, %hi(defined_many_args) -; RV32I-NEXT: addi t0, a1, %lo(defined_many_args) ; RV32I-NEXT: mv a1, a0 ; RV32I-NEXT: mv a2, a0 ; RV32I-NEXT: mv a3, a0 @@ -148,7 +136,7 @@ ; RV32I-NEXT: mv a5, a0 ; RV32I-NEXT: mv a6, a0 ; RV32I-NEXT: mv a7, a0 -; RV32I-NEXT: jalr t0 +; RV32I-NEXT: call defined_many_args ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret Index: test/CodeGen/RISCV/div.ll =================================================================== --- test/CodeGen/RISCV/div.ll +++ test/CodeGen/RISCV/div.ll @@ -9,9 +9,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a2, %hi(__udivsi3) -; RV32I-NEXT: addi a2, a2, %lo(__udivsi3) -; RV32I-NEXT: jalr a2 +; RV32I-NEXT: call __udivsi3 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -29,10 +27,8 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a1, %hi(__udivsi3) -; RV32I-NEXT: addi a2, a1, %lo(__udivsi3) ; RV32I-NEXT: addi a1, zero, 5 -; RV32I-NEXT: jalr a2 +; RV32I-NEXT: call __udivsi3 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -67,9 +63,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a4, %hi(__udivdi3) -; RV32I-NEXT: addi a4, a4, %lo(__udivdi3) -; RV32I-NEXT: jalr a4 +; RV32I-NEXT: call __udivdi3 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -78,9 +72,7 @@ ; RV32IM: # %bb.0: ; RV32IM-NEXT: addi sp, sp, -16 ; RV32IM-NEXT: sw ra, 12(sp) -; RV32IM-NEXT: lui a4, %hi(__udivdi3) -; RV32IM-NEXT: addi a4, a4, %lo(__udivdi3) -; RV32IM-NEXT: jalr a4 +; RV32IM-NEXT: call __udivdi3 ; RV32IM-NEXT: lw ra, 12(sp) ; RV32IM-NEXT: addi sp, sp, 16 ; RV32IM-NEXT: ret @@ -93,11 +85,9 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a2, %hi(__udivdi3) -; RV32I-NEXT: addi a4, a2, %lo(__udivdi3) ; RV32I-NEXT: addi a2, zero, 5 ; RV32I-NEXT: mv a3, zero -; RV32I-NEXT: jalr a4 +; RV32I-NEXT: call __udivdi3 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -106,11 +96,9 @@ ; RV32IM: # %bb.0: ; RV32IM-NEXT: addi sp, sp, -16 ; RV32IM-NEXT: sw ra, 12(sp) -; RV32IM-NEXT: lui a2, %hi(__udivdi3) -; RV32IM-NEXT: addi a4, a2, %lo(__udivdi3) ; RV32IM-NEXT: addi a2, zero, 5 ; RV32IM-NEXT: mv a3, zero -; RV32IM-NEXT: jalr a4 +; RV32IM-NEXT: call __udivdi3 ; RV32IM-NEXT: lw ra, 12(sp) ; RV32IM-NEXT: addi sp, sp, 16 ; RV32IM-NEXT: ret @@ -123,9 +111,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a2, %hi(__divsi3) -; RV32I-NEXT: addi a2, a2, %lo(__divsi3) -; RV32I-NEXT: jalr a2 +; RV32I-NEXT: call __divsi3 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -143,10 +129,8 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a1, %hi(__divsi3) -; RV32I-NEXT: addi a2, a1, %lo(__divsi3) ; RV32I-NEXT: addi a1, zero, 5 -; RV32I-NEXT: jalr a2 +; RV32I-NEXT: call __divsi3 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -189,9 +173,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a4, %hi(__divdi3) -; RV32I-NEXT: addi a4, a4, %lo(__divdi3) -; RV32I-NEXT: jalr a4 +; RV32I-NEXT: call __divdi3 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -200,9 +182,7 @@ ; RV32IM: # %bb.0: ; RV32IM-NEXT: addi sp, sp, -16 ; RV32IM-NEXT: sw ra, 12(sp) -; RV32IM-NEXT: lui a4, %hi(__divdi3) -; RV32IM-NEXT: addi a4, a4, %lo(__divdi3) -; RV32IM-NEXT: jalr a4 +; RV32IM-NEXT: call __divdi3 ; RV32IM-NEXT: lw ra, 12(sp) ; RV32IM-NEXT: addi sp, sp, 16 ; RV32IM-NEXT: ret @@ -215,11 +195,9 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a2, %hi(__divdi3) -; RV32I-NEXT: addi a4, a2, %lo(__divdi3) ; RV32I-NEXT: addi a2, zero, 5 ; RV32I-NEXT: mv a3, zero -; RV32I-NEXT: jalr a4 +; RV32I-NEXT: call __divdi3 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -228,11 +206,9 @@ ; RV32IM: # %bb.0: ; RV32IM-NEXT: addi sp, sp, -16 ; RV32IM-NEXT: sw ra, 12(sp) -; RV32IM-NEXT: lui a2, %hi(__divdi3) -; RV32IM-NEXT: addi a4, a2, %lo(__divdi3) ; RV32IM-NEXT: addi a2, zero, 5 ; RV32IM-NEXT: mv a3, zero -; RV32IM-NEXT: jalr a4 +; RV32IM-NEXT: call __divdi3 ; RV32IM-NEXT: lw ra, 12(sp) ; RV32IM-NEXT: addi sp, sp, 16 ; RV32IM-NEXT: ret Index: test/CodeGen/RISCV/float-br-fcmp.ll =================================================================== --- test/CodeGen/RISCV/float-br-fcmp.ll +++ test/CodeGen/RISCV/float-br-fcmp.ll @@ -18,9 +18,7 @@ ; RV32IF-NEXT: addi sp, sp, 16 ; RV32IF-NEXT: ret ; RV32IF-NEXT: .LBB0_2: # %if.else -; RV32IF-NEXT: lui a0, %hi(abort) -; RV32IF-NEXT: addi a0, a0, %lo(abort) -; RV32IF-NEXT: jalr a0 +; RV32IF-NEXT: call abort %1 = fcmp false float %a, %b br i1 %1, label %if.then, label %if.else if.then: @@ -44,9 +42,7 @@ ; RV32IF-NEXT: addi sp, sp, 16 ; RV32IF-NEXT: ret ; RV32IF-NEXT: .LBB1_2: # %if.then -; RV32IF-NEXT: lui a0, %hi(abort) -; RV32IF-NEXT: addi a0, a0, %lo(abort) -; RV32IF-NEXT: jalr a0 +; RV32IF-NEXT: call abort %1 = fcmp oeq float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -74,9 +70,7 @@ ; RV32IF-NEXT: addi sp, sp, 16 ; RV32IF-NEXT: ret ; RV32IF-NEXT: .LBB2_2: # %if.then -; RV32IF-NEXT: lui a0, %hi(abort) -; RV32IF-NEXT: addi a0, a0, %lo(abort) -; RV32IF-NEXT: jalr a0 +; RV32IF-NEXT: call abort %1 = fcmp oeq float %a, %b br i1 %1, label %if.then, label %if.else if.then: @@ -100,9 +94,7 @@ ; RV32IF-NEXT: addi sp, sp, 16 ; RV32IF-NEXT: ret ; RV32IF-NEXT: .LBB3_2: # %if.then -; RV32IF-NEXT: lui a0, %hi(abort) -; RV32IF-NEXT: addi a0, a0, %lo(abort) -; RV32IF-NEXT: jalr a0 +; RV32IF-NEXT: call abort %1 = fcmp ogt float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -126,9 +118,7 @@ ; RV32IF-NEXT: addi sp, sp, 16 ; RV32IF-NEXT: ret ; RV32IF-NEXT: .LBB4_2: # %if.then -; RV32IF-NEXT: lui a0, %hi(abort) -; RV32IF-NEXT: addi a0, a0, %lo(abort) -; RV32IF-NEXT: jalr a0 +; RV32IF-NEXT: call abort %1 = fcmp oge float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -152,9 +142,7 @@ ; RV32IF-NEXT: addi sp, sp, 16 ; RV32IF-NEXT: ret ; RV32IF-NEXT: .LBB5_2: # %if.then -; RV32IF-NEXT: lui a0, %hi(abort) -; RV32IF-NEXT: addi a0, a0, %lo(abort) -; RV32IF-NEXT: jalr a0 +; RV32IF-NEXT: call abort %1 = fcmp olt float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -178,9 +166,7 @@ ; RV32IF-NEXT: addi sp, sp, 16 ; RV32IF-NEXT: ret ; RV32IF-NEXT: .LBB6_2: # %if.then -; RV32IF-NEXT: lui a0, %hi(abort) -; RV32IF-NEXT: addi a0, a0, %lo(abort) -; RV32IF-NEXT: jalr a0 +; RV32IF-NEXT: call abort %1 = fcmp ole float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -212,9 +198,7 @@ ; RV32IF-NEXT: addi sp, sp, 16 ; RV32IF-NEXT: ret ; RV32IF-NEXT: .LBB7_2: # %if.then -; RV32IF-NEXT: lui a0, %hi(abort) -; RV32IF-NEXT: addi a0, a0, %lo(abort) -; RV32IF-NEXT: jalr a0 +; RV32IF-NEXT: call abort %1 = fcmp one float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -242,9 +226,7 @@ ; RV32IF-NEXT: addi sp, sp, 16 ; RV32IF-NEXT: ret ; RV32IF-NEXT: .LBB8_2: # %if.then -; RV32IF-NEXT: lui a0, %hi(abort) -; RV32IF-NEXT: addi a0, a0, %lo(abort) -; RV32IF-NEXT: jalr a0 +; RV32IF-NEXT: call abort %1 = fcmp ord float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -273,9 +255,7 @@ ; RV32IF-NEXT: addi sp, sp, 16 ; RV32IF-NEXT: ret ; RV32IF-NEXT: .LBB9_2: # %if.then -; RV32IF-NEXT: lui a0, %hi(abort) -; RV32IF-NEXT: addi a0, a0, %lo(abort) -; RV32IF-NEXT: jalr a0 +; RV32IF-NEXT: call abort %1 = fcmp ueq float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -300,9 +280,7 @@ ; RV32IF-NEXT: addi sp, sp, 16 ; RV32IF-NEXT: ret ; RV32IF-NEXT: .LBB10_2: # %if.then -; RV32IF-NEXT: lui a0, %hi(abort) -; RV32IF-NEXT: addi a0, a0, %lo(abort) -; RV32IF-NEXT: jalr a0 +; RV32IF-NEXT: call abort %1 = fcmp ugt float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -327,9 +305,7 @@ ; RV32IF-NEXT: addi sp, sp, 16 ; RV32IF-NEXT: ret ; RV32IF-NEXT: .LBB11_2: # %if.then -; RV32IF-NEXT: lui a0, %hi(abort) -; RV32IF-NEXT: addi a0, a0, %lo(abort) -; RV32IF-NEXT: jalr a0 +; RV32IF-NEXT: call abort %1 = fcmp uge float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -354,9 +330,7 @@ ; RV32IF-NEXT: addi sp, sp, 16 ; RV32IF-NEXT: ret ; RV32IF-NEXT: .LBB12_2: # %if.then -; RV32IF-NEXT: lui a0, %hi(abort) -; RV32IF-NEXT: addi a0, a0, %lo(abort) -; RV32IF-NEXT: jalr a0 +; RV32IF-NEXT: call abort %1 = fcmp ult float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -381,9 +355,7 @@ ; RV32IF-NEXT: addi sp, sp, 16 ; RV32IF-NEXT: ret ; RV32IF-NEXT: .LBB13_2: # %if.then -; RV32IF-NEXT: lui a0, %hi(abort) -; RV32IF-NEXT: addi a0, a0, %lo(abort) -; RV32IF-NEXT: jalr a0 +; RV32IF-NEXT: call abort %1 = fcmp ule float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -408,9 +380,7 @@ ; RV32IF-NEXT: addi sp, sp, 16 ; RV32IF-NEXT: ret ; RV32IF-NEXT: .LBB14_2: # %if.then -; RV32IF-NEXT: lui a0, %hi(abort) -; RV32IF-NEXT: addi a0, a0, %lo(abort) -; RV32IF-NEXT: jalr a0 +; RV32IF-NEXT: call abort %1 = fcmp une float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -438,9 +408,7 @@ ; RV32IF-NEXT: addi sp, sp, 16 ; RV32IF-NEXT: ret ; RV32IF-NEXT: .LBB15_2: # %if.then -; RV32IF-NEXT: lui a0, %hi(abort) -; RV32IF-NEXT: addi a0, a0, %lo(abort) -; RV32IF-NEXT: jalr a0 +; RV32IF-NEXT: call abort %1 = fcmp uno float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -462,9 +430,7 @@ ; RV32IF-NEXT: addi sp, sp, 16 ; RV32IF-NEXT: ret ; RV32IF-NEXT: .LBB16_2: # %if.then -; RV32IF-NEXT: lui a0, %hi(abort) -; RV32IF-NEXT: addi a0, a0, %lo(abort) -; RV32IF-NEXT: jalr a0 +; RV32IF-NEXT: call abort %1 = fcmp true float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -482,35 +448,29 @@ ; RV32IF: # %bb.0: # %entry ; RV32IF-NEXT: addi sp, sp, -16 ; RV32IF-NEXT: sw ra, 12(sp) -; RV32IF-NEXT: sw s1, 8(sp) -; RV32IF-NEXT: lui a0, %hi(dummy) -; RV32IF-NEXT: addi s1, a0, %lo(dummy) ; RV32IF-NEXT: mv a0, zero -; RV32IF-NEXT: jalr s1 +; RV32IF-NEXT: call dummy +; RV32IF-NEXT: lui a1, %hi(.LCPI17_0) +; RV32IF-NEXT: addi a1, a1, %lo(.LCPI17_0) +; RV32IF-NEXT: flw ft1, 0(a1) ; RV32IF-NEXT: fmv.w.x ft0, a0 -; RV32IF-NEXT: lui a0, %hi(.LCPI17_0) -; RV32IF-NEXT: addi a0, a0, %lo(.LCPI17_0) -; RV32IF-NEXT: flw ft1, 0(a0) -; RV32IF-NEXT: fsw ft1, 4(sp) +; RV32IF-NEXT: fsw ft1, 8(sp) ; RV32IF-NEXT: feq.s a0, ft0, ft1 ; RV32IF-NEXT: beqz a0, .LBB17_3 ; RV32IF-NEXT: # %bb.1: # %if.end ; RV32IF-NEXT: mv a0, zero -; RV32IF-NEXT: jalr s1 +; RV32IF-NEXT: call dummy ; RV32IF-NEXT: fmv.w.x ft0, a0 -; RV32IF-NEXT: flw ft1, 4(sp) +; RV32IF-NEXT: flw ft1, 8(sp) ; RV32IF-NEXT: feq.s a0, ft0, ft1 ; RV32IF-NEXT: beqz a0, .LBB17_3 ; RV32IF-NEXT: # %bb.2: # %if.end4 ; RV32IF-NEXT: mv a0, zero -; RV32IF-NEXT: lw s1, 8(sp) ; RV32IF-NEXT: lw ra, 12(sp) ; RV32IF-NEXT: addi sp, sp, 16 ; RV32IF-NEXT: ret ; RV32IF-NEXT: .LBB17_3: # %if.then -; RV32IF-NEXT: lui a0, %hi(abort) -; RV32IF-NEXT: addi a0, a0, %lo(abort) -; RV32IF-NEXT: jalr a0 +; RV32IF-NEXT: call abort entry: %call = call float @dummy(float 0.000000e+00) %cmp = fcmp une float %call, 0.000000e+00 Index: test/CodeGen/RISCV/float-mem.ll =================================================================== --- test/CodeGen/RISCV/float-mem.ll +++ test/CodeGen/RISCV/float-mem.ll @@ -92,10 +92,8 @@ ; RV32IF-NEXT: sw ra, 12(sp) ; RV32IF-NEXT: sw s1, 8(sp) ; RV32IF-NEXT: mv s1, a0 -; RV32IF-NEXT: lui a0, %hi(notdead) -; RV32IF-NEXT: addi a1, a0, %lo(notdead) ; RV32IF-NEXT: addi a0, sp, 4 -; RV32IF-NEXT: jalr a1 +; RV32IF-NEXT: call notdead ; RV32IF-NEXT: fmv.w.x ft0, s1 ; RV32IF-NEXT: flw ft1, 4(sp) ; RV32IF-NEXT: fadd.s ft0, ft1, ft0 @@ -121,10 +119,8 @@ ; RV32IF-NEXT: fmv.w.x ft1, a0 ; RV32IF-NEXT: fadd.s ft0, ft1, ft0 ; RV32IF-NEXT: fsw ft0, 8(sp) -; RV32IF-NEXT: lui a0, %hi(notdead) -; RV32IF-NEXT: addi a1, a0, %lo(notdead) ; RV32IF-NEXT: addi a0, sp, 8 -; RV32IF-NEXT: jalr a1 +; RV32IF-NEXT: call notdead ; RV32IF-NEXT: lw ra, 12(sp) ; RV32IF-NEXT: addi sp, sp, 16 ; RV32IF-NEXT: ret Index: test/CodeGen/RISCV/fp128.ll =================================================================== --- test/CodeGen/RISCV/fp128.ll +++ test/CodeGen/RISCV/fp128.ll @@ -37,11 +37,9 @@ ; RV32I-NEXT: lui a0, %hi(x) ; RV32I-NEXT: lw a0, %lo(x)(a0) ; RV32I-NEXT: sw a0, 24(sp) -; RV32I-NEXT: lui a0, %hi(__netf2) -; RV32I-NEXT: addi a2, a0, %lo(__netf2) ; RV32I-NEXT: addi a0, sp, 24 ; RV32I-NEXT: addi a1, sp, 8 -; RV32I-NEXT: jalr a2 +; RV32I-NEXT: call __netf2 ; RV32I-NEXT: xor a0, a0, zero ; RV32I-NEXT: snez a0, a0 ; RV32I-NEXT: lw ra, 44(sp) @@ -83,12 +81,10 @@ ; RV32I-NEXT: lui a0, %hi(x) ; RV32I-NEXT: lw a0, %lo(x)(a0) ; RV32I-NEXT: sw a0, 40(sp) -; RV32I-NEXT: lui a0, %hi(__addtf3) -; RV32I-NEXT: addi a3, a0, %lo(__addtf3) ; RV32I-NEXT: addi a0, sp, 56 ; RV32I-NEXT: addi a1, sp, 40 ; RV32I-NEXT: addi a2, sp, 24 -; RV32I-NEXT: jalr a3 +; RV32I-NEXT: call __addtf3 ; RV32I-NEXT: lw a0, 68(sp) ; RV32I-NEXT: sw a0, 20(sp) ; RV32I-NEXT: lw a0, 64(sp) @@ -97,10 +93,8 @@ ; RV32I-NEXT: sw a0, 12(sp) ; RV32I-NEXT: lw a0, 56(sp) ; RV32I-NEXT: sw a0, 8(sp) -; RV32I-NEXT: lui a0, %hi(__fixtfsi) -; RV32I-NEXT: addi a1, a0, %lo(__fixtfsi) ; RV32I-NEXT: addi a0, sp, 8 -; RV32I-NEXT: jalr a1 +; RV32I-NEXT: call __fixtfsi ; RV32I-NEXT: lw ra, 76(sp) ; RV32I-NEXT: addi sp, sp, 80 ; RV32I-NEXT: ret Index: test/CodeGen/RISCV/frame.ll =================================================================== --- test/CodeGen/RISCV/frame.ll +++ test/CodeGen/RISCV/frame.ll @@ -16,10 +16,8 @@ ; RV32I-FPELIM-NEXT: sw zero, 16(sp) ; RV32I-FPELIM-NEXT: sw zero, 12(sp) ; RV32I-FPELIM-NEXT: sw zero, 8(sp) -; RV32I-FPELIM-NEXT: lui a0, %hi(test1) -; RV32I-FPELIM-NEXT: addi a1, a0, %lo(test1) ; RV32I-FPELIM-NEXT: addi a0, sp, 12 -; RV32I-FPELIM-NEXT: jalr a1 +; RV32I-FPELIM-NEXT: call test1 ; RV32I-FPELIM-NEXT: mv a0, zero ; RV32I-FPELIM-NEXT: lw ra, 28(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 32 @@ -36,10 +34,8 @@ ; RV32I-WITHFP-NEXT: sw zero, -24(s0) ; RV32I-WITHFP-NEXT: sw zero, -28(s0) ; RV32I-WITHFP-NEXT: sw zero, -32(s0) -; RV32I-WITHFP-NEXT: lui a0, %hi(test1) -; RV32I-WITHFP-NEXT: addi a1, a0, %lo(test1) ; RV32I-WITHFP-NEXT: addi a0, s0, -28 -; RV32I-WITHFP-NEXT: jalr a1 +; RV32I-WITHFP-NEXT: call test1 ; RV32I-WITHFP-NEXT: mv a0, zero ; RV32I-WITHFP-NEXT: lw s0, 24(sp) ; RV32I-WITHFP-NEXT: lw ra, 28(sp) Index: test/CodeGen/RISCV/frameaddr-returnaddr.ll =================================================================== --- test/CodeGen/RISCV/frameaddr-returnaddr.ll +++ test/CodeGen/RISCV/frameaddr-returnaddr.ll @@ -46,10 +46,8 @@ ; RV32I-NEXT: sw ra, 108(sp) ; RV32I-NEXT: sw s0, 104(sp) ; RV32I-NEXT: addi s0, sp, 112 -; RV32I-NEXT: lui a0, %hi(notdead) -; RV32I-NEXT: addi a1, a0, %lo(notdead) ; RV32I-NEXT: addi a0, s0, -108 -; RV32I-NEXT: jalr a1 +; RV32I-NEXT: call notdead ; RV32I-NEXT: lw a0, -8(s0) ; RV32I-NEXT: lw a0, -8(a0) ; RV32I-NEXT: lw a0, -8(a0) Index: test/CodeGen/RISCV/mul.ll =================================================================== --- test/CodeGen/RISCV/mul.ll +++ test/CodeGen/RISCV/mul.ll @@ -9,10 +9,8 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a1, %hi(__mulsi3) -; RV32I-NEXT: addi a2, a1, %lo(__mulsi3) ; RV32I-NEXT: mv a1, a0 -; RV32I-NEXT: jalr a2 +; RV32I-NEXT: call __mulsi3 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -30,9 +28,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a2, %hi(__mulsi3) -; RV32I-NEXT: addi a2, a2, %lo(__mulsi3) -; RV32I-NEXT: jalr a2 +; RV32I-NEXT: call __mulsi3 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -50,10 +46,8 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a1, %hi(__mulsi3) -; RV32I-NEXT: addi a2, a1, %lo(__mulsi3) ; RV32I-NEXT: addi a1, zero, 5 -; RV32I-NEXT: jalr a2 +; RV32I-NEXT: call __mulsi3 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -86,9 +80,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a4, %hi(__muldi3) -; RV32I-NEXT: addi a4, a4, %lo(__muldi3) -; RV32I-NEXT: jalr a4 +; RV32I-NEXT: call __muldi3 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -111,11 +103,9 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a2, %hi(__muldi3) -; RV32I-NEXT: addi a4, a2, %lo(__muldi3) ; RV32I-NEXT: addi a2, zero, 5 ; RV32I-NEXT: mv a3, zero -; RV32I-NEXT: jalr a4 +; RV32I-NEXT: call __muldi3 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -138,11 +128,9 @@ ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) ; RV32I-NEXT: mv a2, a1 -; RV32I-NEXT: lui a1, %hi(__muldi3) -; RV32I-NEXT: addi a4, a1, %lo(__muldi3) ; RV32I-NEXT: srai a1, a0, 31 ; RV32I-NEXT: srai a3, a2, 31 -; RV32I-NEXT: jalr a4 +; RV32I-NEXT: call __muldi3 ; RV32I-NEXT: mv a0, a1 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 @@ -166,11 +154,9 @@ ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) ; RV32I-NEXT: mv a2, a1 -; RV32I-NEXT: lui a1, %hi(__muldi3) -; RV32I-NEXT: addi a4, a1, %lo(__muldi3) ; RV32I-NEXT: mv a1, zero ; RV32I-NEXT: mv a3, zero -; RV32I-NEXT: jalr a4 +; RV32I-NEXT: call __muldi3 ; RV32I-NEXT: mv a0, a1 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 Index: test/CodeGen/RISCV/rem.ll =================================================================== --- test/CodeGen/RISCV/rem.ll +++ test/CodeGen/RISCV/rem.ll @@ -9,9 +9,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a2, %hi(__umodsi3) -; RV32I-NEXT: addi a2, a2, %lo(__umodsi3) -; RV32I-NEXT: jalr a2 +; RV32I-NEXT: call __umodsi3 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -29,9 +27,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a2, %hi(__modsi3) -; RV32I-NEXT: addi a2, a2, %lo(__modsi3) -; RV32I-NEXT: jalr a2 +; RV32I-NEXT: call __modsi3 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret Index: test/CodeGen/RISCV/shifts.ll =================================================================== --- test/CodeGen/RISCV/shifts.ll +++ test/CodeGen/RISCV/shifts.ll @@ -10,9 +10,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a3, %hi(__lshrdi3) -; RV32I-NEXT: addi a3, a3, %lo(__lshrdi3) -; RV32I-NEXT: jalr a3 +; RV32I-NEXT: call __lshrdi3 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -25,9 +23,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a3, %hi(__ashrdi3) -; RV32I-NEXT: addi a3, a3, %lo(__ashrdi3) -; RV32I-NEXT: jalr a3 +; RV32I-NEXT: call __ashrdi3 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -40,9 +36,7 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: addi sp, sp, -16 ; RV32I-NEXT: sw ra, 12(sp) -; RV32I-NEXT: lui a3, %hi(__ashldi3) -; RV32I-NEXT: addi a3, a3, %lo(__ashldi3) -; RV32I-NEXT: jalr a3 +; RV32I-NEXT: call __ashldi3 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret Index: test/CodeGen/RISCV/vararg.ll =================================================================== --- test/CodeGen/RISCV/vararg.ll +++ test/CodeGen/RISCV/vararg.ll @@ -192,9 +192,7 @@ ; RV32I-FPELIM-NEXT: andi a0, a0, -16 ; RV32I-FPELIM-NEXT: sub a0, sp, a0 ; RV32I-FPELIM-NEXT: mv sp, a0 -; RV32I-FPELIM-NEXT: lui a1, %hi(notdead) -; RV32I-FPELIM-NEXT: addi a1, a1, %lo(notdead) -; RV32I-FPELIM-NEXT: jalr a1 +; RV32I-FPELIM-NEXT: call notdead ; RV32I-FPELIM-NEXT: mv a0, s1 ; RV32I-FPELIM-NEXT: addi sp, s0, -16 ; RV32I-FPELIM-NEXT: lw s1, 4(sp) @@ -224,9 +222,7 @@ ; RV32I-WITHFP-NEXT: andi a0, a0, -16 ; RV32I-WITHFP-NEXT: sub a0, sp, a0 ; RV32I-WITHFP-NEXT: mv sp, a0 -; RV32I-WITHFP-NEXT: lui a1, %hi(notdead) -; RV32I-WITHFP-NEXT: addi a1, a1, %lo(notdead) -; RV32I-WITHFP-NEXT: jalr a1 +; RV32I-WITHFP-NEXT: call notdead ; RV32I-WITHFP-NEXT: mv a0, s1 ; RV32I-WITHFP-NEXT: addi sp, s0, -16 ; RV32I-WITHFP-NEXT: lw s1, 4(sp) @@ -266,11 +262,9 @@ ; RV32I-FPELIM-NEXT: sw ra, 12(sp) ; RV32I-FPELIM-NEXT: lui a0, 261888 ; RV32I-FPELIM-NEXT: mv a3, a0 -; RV32I-FPELIM-NEXT: lui a0, %hi(va1) -; RV32I-FPELIM-NEXT: addi a0, a0, %lo(va1) ; RV32I-FPELIM-NEXT: addi a4, zero, 2 ; RV32I-FPELIM-NEXT: mv a2, zero -; RV32I-FPELIM-NEXT: jalr a0 +; RV32I-FPELIM-NEXT: call va1 ; RV32I-FPELIM-NEXT: lw ra, 12(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 16 ; RV32I-FPELIM-NEXT: ret @@ -283,11 +277,9 @@ ; RV32I-WITHFP-NEXT: addi s0, sp, 16 ; RV32I-WITHFP-NEXT: lui a0, 261888 ; RV32I-WITHFP-NEXT: mv a3, a0 -; RV32I-WITHFP-NEXT: lui a0, %hi(va1) -; RV32I-WITHFP-NEXT: addi a0, a0, %lo(va1) ; RV32I-WITHFP-NEXT: addi a4, zero, 2 ; RV32I-WITHFP-NEXT: mv a2, zero -; RV32I-WITHFP-NEXT: jalr a0 +; RV32I-WITHFP-NEXT: call va1 ; RV32I-WITHFP-NEXT: lw s0, 8(sp) ; RV32I-WITHFP-NEXT: lw ra, 12(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 16 @@ -474,10 +466,8 @@ ; RV32I-FPELIM-NEXT: sw ra, 12(sp) ; RV32I-FPELIM-NEXT: lui a0, 261888 ; RV32I-FPELIM-NEXT: mv a3, a0 -; RV32I-FPELIM-NEXT: lui a0, %hi(va2) -; RV32I-FPELIM-NEXT: addi a0, a0, %lo(va2) ; RV32I-FPELIM-NEXT: mv a2, zero -; RV32I-FPELIM-NEXT: jalr a0 +; RV32I-FPELIM-NEXT: call va2 ; RV32I-FPELIM-NEXT: lw ra, 12(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 16 ; RV32I-FPELIM-NEXT: ret @@ -490,10 +480,8 @@ ; RV32I-WITHFP-NEXT: addi s0, sp, 16 ; RV32I-WITHFP-NEXT: lui a0, 261888 ; RV32I-WITHFP-NEXT: mv a3, a0 -; RV32I-WITHFP-NEXT: lui a0, %hi(va2) -; RV32I-WITHFP-NEXT: addi a0, a0, %lo(va2) ; RV32I-WITHFP-NEXT: mv a2, zero -; RV32I-WITHFP-NEXT: jalr a0 +; RV32I-WITHFP-NEXT: call va2 ; RV32I-WITHFP-NEXT: lw s0, 8(sp) ; RV32I-WITHFP-NEXT: lw ra, 12(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 16 @@ -542,8 +530,6 @@ ; RV32I-FPELIM-NEXT: sw a3, 12(sp) ; RV32I-FPELIM-NEXT: addi a0, sp, 27 ; RV32I-FPELIM-NEXT: sw a0, 0(sp) -; RV32I-FPELIM-NEXT: lui a0, %hi(__adddf3) -; RV32I-FPELIM-NEXT: addi a5, a0, %lo(__adddf3) ; RV32I-FPELIM-NEXT: addi a0, sp, 19 ; RV32I-FPELIM-NEXT: andi a0, a0, -8 ; RV32I-FPELIM-NEXT: lw a4, 0(a0) @@ -552,7 +538,7 @@ ; RV32I-FPELIM-NEXT: mv a0, a1 ; RV32I-FPELIM-NEXT: mv a1, a2 ; RV32I-FPELIM-NEXT: mv a2, a4 -; RV32I-FPELIM-NEXT: jalr a5 +; RV32I-FPELIM-NEXT: call __adddf3 ; RV32I-FPELIM-NEXT: lw ra, 4(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 32 ; RV32I-FPELIM-NEXT: ret @@ -570,8 +556,6 @@ ; RV32I-WITHFP-NEXT: sw a3, 4(s0) ; RV32I-WITHFP-NEXT: addi a0, s0, 19 ; RV32I-WITHFP-NEXT: sw a0, -12(s0) -; RV32I-WITHFP-NEXT: lui a0, %hi(__adddf3) -; RV32I-WITHFP-NEXT: addi a5, a0, %lo(__adddf3) ; RV32I-WITHFP-NEXT: addi a0, s0, 11 ; RV32I-WITHFP-NEXT: andi a0, a0, -8 ; RV32I-WITHFP-NEXT: lw a4, 0(a0) @@ -580,7 +564,7 @@ ; RV32I-WITHFP-NEXT: mv a0, a1 ; RV32I-WITHFP-NEXT: mv a1, a2 ; RV32I-WITHFP-NEXT: mv a2, a4 -; RV32I-WITHFP-NEXT: jalr a5 +; RV32I-WITHFP-NEXT: call __adddf3 ; RV32I-WITHFP-NEXT: lw s0, 16(sp) ; RV32I-WITHFP-NEXT: lw ra, 20(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 48 @@ -645,13 +629,11 @@ ; RV32I-FPELIM-NEXT: lw a4, 0(a0) ; RV32I-FPELIM-NEXT: addi a0, a3, 4 ; RV32I-FPELIM-NEXT: sw a0, 0(sp) -; RV32I-FPELIM-NEXT: lui a0, %hi(__adddf3) -; RV32I-FPELIM-NEXT: addi a5, a0, %lo(__adddf3) ; RV32I-FPELIM-NEXT: lw a3, 0(a3) ; RV32I-FPELIM-NEXT: mv a0, a1 ; RV32I-FPELIM-NEXT: mv a1, a2 ; RV32I-FPELIM-NEXT: mv a2, a4 -; RV32I-FPELIM-NEXT: jalr a5 +; RV32I-FPELIM-NEXT: call __adddf3 ; RV32I-FPELIM-NEXT: lw ra, 4(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 32 ; RV32I-FPELIM-NEXT: ret @@ -674,13 +656,11 @@ ; RV32I-WITHFP-NEXT: lw a4, 0(a0) ; RV32I-WITHFP-NEXT: addi a0, a3, 4 ; RV32I-WITHFP-NEXT: sw a0, -12(s0) -; RV32I-WITHFP-NEXT: lui a0, %hi(__adddf3) -; RV32I-WITHFP-NEXT: addi a5, a0, %lo(__adddf3) ; RV32I-WITHFP-NEXT: lw a3, 0(a3) ; RV32I-WITHFP-NEXT: mv a0, a1 ; RV32I-WITHFP-NEXT: mv a1, a2 ; RV32I-WITHFP-NEXT: mv a2, a4 -; RV32I-WITHFP-NEXT: jalr a5 +; RV32I-WITHFP-NEXT: call __adddf3 ; RV32I-WITHFP-NEXT: lw s0, 16(sp) ; RV32I-WITHFP-NEXT: lw ra, 20(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 48 @@ -720,12 +700,10 @@ ; RV32I-FPELIM-NEXT: mv a2, a0 ; RV32I-FPELIM-NEXT: lui a0, 262144 ; RV32I-FPELIM-NEXT: mv a5, a0 -; RV32I-FPELIM-NEXT: lui a0, %hi(va3) -; RV32I-FPELIM-NEXT: addi a3, a0, %lo(va3) ; RV32I-FPELIM-NEXT: addi a0, zero, 2 ; RV32I-FPELIM-NEXT: mv a1, zero ; RV32I-FPELIM-NEXT: mv a4, zero -; RV32I-FPELIM-NEXT: jalr a3 +; RV32I-FPELIM-NEXT: call va3 ; RV32I-FPELIM-NEXT: lw ra, 12(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 16 ; RV32I-FPELIM-NEXT: ret @@ -740,12 +718,10 @@ ; RV32I-WITHFP-NEXT: mv a2, a0 ; RV32I-WITHFP-NEXT: lui a0, 262144 ; RV32I-WITHFP-NEXT: mv a5, a0 -; RV32I-WITHFP-NEXT: lui a0, %hi(va3) -; RV32I-WITHFP-NEXT: addi a3, a0, %lo(va3) ; RV32I-WITHFP-NEXT: addi a0, zero, 2 ; RV32I-WITHFP-NEXT: mv a1, zero ; RV32I-WITHFP-NEXT: mv a4, zero -; RV32I-WITHFP-NEXT: jalr a3 +; RV32I-WITHFP-NEXT: call va3 ; RV32I-WITHFP-NEXT: lw s0, 8(sp) ; RV32I-WITHFP-NEXT: lw ra, 12(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 16 @@ -815,9 +791,7 @@ ; RV32I-FPELIM-NEXT: sw a0, 4(sp) ; RV32I-FPELIM-NEXT: sw a0, 0(sp) ; RV32I-FPELIM-NEXT: lw s1, 20(sp) -; RV32I-FPELIM-NEXT: lui a1, %hi(notdead) -; RV32I-FPELIM-NEXT: addi a1, a1, %lo(notdead) -; RV32I-FPELIM-NEXT: jalr a1 +; RV32I-FPELIM-NEXT: call notdead ; RV32I-FPELIM-NEXT: lw a0, 4(sp) ; RV32I-FPELIM-NEXT: addi a0, a0, 3 ; RV32I-FPELIM-NEXT: andi a0, a0, -4 @@ -860,9 +834,7 @@ ; RV32I-WITHFP-NEXT: sw a0, -16(s0) ; RV32I-WITHFP-NEXT: sw a0, -20(s0) ; RV32I-WITHFP-NEXT: lw s1, 4(s0) -; RV32I-WITHFP-NEXT: lui a1, %hi(notdead) -; RV32I-WITHFP-NEXT: addi a1, a1, %lo(notdead) -; RV32I-WITHFP-NEXT: jalr a1 +; RV32I-WITHFP-NEXT: call notdead ; RV32I-WITHFP-NEXT: lw a0, -16(s0) ; RV32I-WITHFP-NEXT: addi a0, a0, 3 ; RV32I-WITHFP-NEXT: andi a0, a0, -4 @@ -1037,15 +1009,13 @@ ; RV32I-FPELIM-NEXT: sw a0, 32(sp) ; RV32I-FPELIM-NEXT: lui a0, 688509 ; RV32I-FPELIM-NEXT: addi a6, a0, -2048 -; RV32I-FPELIM-NEXT: lui a0, %hi(va5_aligned_stack_callee) -; RV32I-FPELIM-NEXT: addi a5, a0, %lo(va5_aligned_stack_callee) ; RV32I-FPELIM-NEXT: addi a0, zero, 1 ; RV32I-FPELIM-NEXT: addi a1, zero, 11 ; RV32I-FPELIM-NEXT: addi a2, sp, 32 ; RV32I-FPELIM-NEXT: addi a3, zero, 12 ; RV32I-FPELIM-NEXT: addi a4, zero, 13 ; RV32I-FPELIM-NEXT: addi a7, zero, 4 -; RV32I-FPELIM-NEXT: jalr a5 +; RV32I-FPELIM-NEXT: call va5_aligned_stack_callee ; RV32I-FPELIM-NEXT: lw ra, 60(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 64 ; RV32I-FPELIM-NEXT: ret @@ -1084,15 +1054,13 @@ ; RV32I-WITHFP-NEXT: sw a0, -32(s0) ; RV32I-WITHFP-NEXT: lui a0, 688509 ; RV32I-WITHFP-NEXT: addi a6, a0, -2048 -; RV32I-WITHFP-NEXT: lui a0, %hi(va5_aligned_stack_callee) -; RV32I-WITHFP-NEXT: addi a5, a0, %lo(va5_aligned_stack_callee) ; RV32I-WITHFP-NEXT: addi a0, zero, 1 ; RV32I-WITHFP-NEXT: addi a1, zero, 11 ; RV32I-WITHFP-NEXT: addi a2, s0, -32 ; RV32I-WITHFP-NEXT: addi a3, zero, 12 ; RV32I-WITHFP-NEXT: addi a4, zero, 13 ; RV32I-WITHFP-NEXT: addi a7, zero, 4 -; RV32I-WITHFP-NEXT: jalr a5 +; RV32I-WITHFP-NEXT: call va5_aligned_stack_callee ; RV32I-WITHFP-NEXT: lw s0, 56(sp) ; RV32I-WITHFP-NEXT: lw ra, 60(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 64