Index: lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp =================================================================== --- lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp +++ lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp @@ -43,6 +43,26 @@ std::unique_ptr createObjectWriter(raw_pwrite_stream &OS) const override; + bool shouldForceRelocation(const MCAssembler &Asm, const MCFixup &Fixup, + const MCValue &Target) override { + const unsigned FixupKind = Fixup.getKind(); + // It's hard to fix fixup_riscv_pcrel_lo12_i by assembler, so we preserve + // relocation types and let linker to resolve it. + // + //.Ltmp3: + // auipc ra, %pcrel_hi(foo) + // jalr ra, ra, %pcrel_lo(.Ltmp3) + // + // For R_RISCV_PCREL_LO12_I, linker will + // 1. Find high part instruction(auipc) by .Ltmp3 + // 2. Find symbol(foo) in auipc's relocation type + // 3. Resolve offset by symbol(foo) + if (FixupKind == RISCV::fixup_riscv_pcrel_lo12_i || + FixupKind == RISCV::fixup_riscv_pcrel_hi20) + return true; + return false; + } + bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value, const MCRelaxableFragment *DF, const MCAsmLayout &Layout) const override; Index: lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp =================================================================== --- lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp +++ lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp @@ -23,6 +23,12 @@ ~RISCVELFObjectWriter() override; + // Linker need relocation type with symbol to resolve offset. + bool needsRelocateWithSymbol(const MCSymbol &Sym, + unsigned Type) const override { + return true; + } + protected: unsigned getRelocType(MCContext &Ctx, const MCValue &Target, const MCFixup &Fixup, bool IsPCRel) const override; Index: lib/Target/RISCV/RISCVAsmPrinter.cpp =================================================================== --- lib/Target/RISCV/RISCVAsmPrinter.cpp +++ lib/Target/RISCV/RISCVAsmPrinter.cpp @@ -14,6 +14,7 @@ #include "RISCV.h" #include "InstPrinter/RISCVInstPrinter.h" +#include "MCTargetDesc/RISCVMCExpr.h" #include "RISCVTargetMachine.h" #include "llvm/CodeGen/AsmPrinter.h" #include "llvm/CodeGen/MachineConstantPool.h" @@ -22,6 +23,7 @@ #include "llvm/CodeGen/MachineModuleInfo.h" #include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCInst.h" +#include "llvm/MC/MCInstBuilder.h" #include "llvm/MC/MCStreamer.h" #include "llvm/MC/MCSymbol.h" #include "llvm/Support/TargetRegistry.h" @@ -48,6 +50,8 @@ unsigned AsmVariant, const char *ExtraCode, raw_ostream &OS) override; + void expandFunctionCall(const MachineInstr *MI); + bool emitPseudoExpansionLowering(MCStreamer &OutStreamer, const MachineInstr *MI); @@ -62,11 +66,57 @@ // instructions) auto-generated. #include "RISCVGenMCPseudoLowering.inc" +void RISCVAsmPrinter::expandFunctionCall(const MachineInstr *MI) { + MCInst TmpInst; + MachineOperand Func = MI->getOperand(0); + MCSymbol *Sym = nullptr; + unsigned Ra = RISCV::X1; + + assert(Func.isGlobal() || Func.isSymbol()); + + if (Func.isGlobal()) + Sym = getSymbol(Func.getGlobal()); + else if (Func.isSymbol()) + Sym = GetExternalSymbolSymbol(Func.getSymbolName()); + + const MCExpr *Expr; + + // Create high part expression HiExpr for AUIPC. + Expr = MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, OutContext); + const MCExpr *HiExpr = + RISCVMCExpr::create(Expr, RISCVMCExpr::VK_RISCV_PCREL_HI, OutContext); + + // Create low part expression LoExpr for JALR. + auto HiLabel = OutContext.createTempSymbol(); + Expr = MCSymbolRefExpr::create(HiLabel, MCSymbolRefExpr::VK_None, OutContext); + const MCExpr *LoExpr = + RISCVMCExpr::create(Expr, RISCVMCExpr::VK_RISCV_PCREL_LO, OutContext); + + // Emit .LtmpX: + OutStreamer->EmitLabel(HiLabel); + + // Emit AUPIC Ra, %pcrel_hi(Func) + TmpInst = MCInstBuilder(RISCV::AUIPC) + .addReg(Ra) + .addOperand(MCOperand::createExpr(HiExpr)); + EmitToStreamer(*OutStreamer, TmpInst); + + // Emit JALR Ra, Ra, %pcrel_lo(.LtmpX) + TmpInst = MCInstBuilder(RISCV::JALR) + .addReg(Ra) + .addReg(Ra) + .addOperand(MCOperand::createExpr(LoExpr)); + EmitToStreamer(*OutStreamer, TmpInst); +} + void RISCVAsmPrinter::EmitInstruction(const MachineInstr *MI) { // Do any auto-generated pseudo lowerings. if (emitPseudoExpansionLowering(*OutStreamer, MI)) return; + if (MI->getOpcode() == RISCV::PseudoCALL) + return expandFunctionCall(MI); + MCInst TmpInst; LowerRISCVMachineInstrToMCInst(MI, TmpInst, *this); EmitToStreamer(*OutStreamer, TmpInst); Index: lib/Target/RISCV/RISCVISelLowering.cpp =================================================================== --- lib/Target/RISCV/RISCVISelLowering.cpp +++ lib/Target/RISCV/RISCVISelLowering.cpp @@ -988,10 +988,16 @@ Glue = Chain.getValue(1); } + // 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 match by PseudoCALL. if (isa(Callee)) { - Callee = lowerGlobalAddress(Callee, DAG); + auto *GV = cast(Callee)->getGlobal(); + Callee = DAG.getTargetGlobalAddress(GV, DL, PtrVT, 0, 0); } else if (isa(Callee)) { - Callee = lowerExternalSymbol(Callee, DAG); + ExternalSymbolSDNode *S = dyn_cast(Callee); + const char *Sym = S->getSymbol(); + Callee = DAG.getTargetExternalSymbol(Sym, 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 @@ -121,6 +121,12 @@ let DecoderMethod = "decodeSImmOperandAndLsl1<21>"; } +def call_target : Operand { + let ParserMatchClass = SImmAsmOperand<21, "Lsb0">; + let EncoderMethod = "getImmOpValueAsr1"; + let DecoderMethod = "decodeSImmOperandAndLsl1<21>"; +} + // A parameterized register class alternative to i32imm/i64imm from Target.td. def ixlenimm : Operand; @@ -588,9 +594,17 @@ def : Pat<(brind (add GPR:$rs1, simm12:$imm12)), (PseudoBRIND GPR:$rs1, simm12:$imm12)>; +// PseudoCALL is a pseudo instruction which will eventaully expand to auipc +// and jalr. +let isCall = 1, Defs = [X1] in +def PseudoCALL : Pseudo<(outs), (ins call_target:$func), + [(Call tglobaladdr:$func)]>; + +def : Pat<(Call texternalsym:$func), (PseudoCALL texternalsym:$func)>; + let isCall = 1, Defs = [X1] in -def PseudoCALL : Pseudo<(outs), (ins GPR:$rs1), [(Call GPR:$rs1)]>, - PseudoInstExpansion<(JALR X1, GPR:$rs1, 0)>; +def PseudoCALLIndirect : Pseudo<(outs), (ins GPR:$rs1), [(Call GPR:$rs1)]>, + PseudoInstExpansion<(JALR X1, GPR:$rs1, 0)>; let isBarrier = 1, isReturn = 1, isTerminator = 1 in def PseudoRET : Pseudo<(outs), (ins), [(RetFlag)]>, Index: test/CodeGen/RISCV/alloca.ll =================================================================== --- test/CodeGen/RISCV/alloca.ll +++ test/CodeGen/RISCV/alloca.ll @@ -18,9 +18,9 @@ ; 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: .Ltmp0: +; RV32I-NEXT: auipc ra, %pcrel_hi(notdead) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp0) ; RV32I-NEXT: addi sp, s0, -16 ; RV32I-NEXT: lw s0, 8(sp) ; RV32I-NEXT: lw ra, 12(sp) @@ -47,9 +47,9 @@ ; 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: .Ltmp1: +; RV32I-NEXT: auipc ra, %pcrel_hi(notdead) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp1) ; RV32I-NEXT: mv sp, s1 ; RV32I-NEXT: addi sp, s0, -16 ; RV32I-NEXT: lw s1, 4(sp) @@ -88,8 +88,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 +95,9 @@ ; RV32I-NEXT: addi a5, zero, 6 ; RV32I-NEXT: addi a6, zero, 7 ; RV32I-NEXT: addi a7, zero, 8 -; RV32I-NEXT: jalr t0 +; RV32I-NEXT: .Ltmp2: +; RV32I-NEXT: auipc ra, %pcrel_hi(func) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp2) ; 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,17 @@ ; 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: .Ltmp0: +; RV32I-NEXT: auipc ra, %pcrel_hi(test_true) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp0) ; 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: .Ltmp1: +; RV32I-NEXT: auipc ra, %pcrel_hi(test_false) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp1) ; RV32I-NEXT: j .LBB0_2 %tst = icmp eq i32 %in, 42 br i1 %tst, label %true, label %false, !prof !0 @@ -55,16 +56,17 @@ ; 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: .Ltmp2: +; RV32I-NEXT: auipc ra, %pcrel_hi(test_false) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp2) ; 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: .Ltmp3: +; RV32I-NEXT: auipc ra, %pcrel_hi(test_true) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp3) ; 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,9 @@ ; 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: .Ltmp0: +; RV32I-NEXT: auipc ra, %pcrel_hi(__mulsi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp0) ; RV32I-NEXT: srli a0, a0, 24 ; RV32I-NEXT: j .LBB3_3 ; RV32I-NEXT: .LBB3_2: @@ -154,9 +154,9 @@ ; 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: .Ltmp1: +; RV32I-NEXT: auipc ra, %pcrel_hi(__mulsi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp1) ; RV32I-NEXT: srli a0, a0, 24 ; RV32I-NEXT: j .LBB4_3 ; RV32I-NEXT: .LBB4_2: @@ -197,9 +197,9 @@ ; 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: .Ltmp2: +; RV32I-NEXT: auipc ra, %pcrel_hi(__mulsi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp2) ; RV32I-NEXT: srli a0, a0, 24 ; RV32I-NEXT: j .LBB5_3 ; RV32I-NEXT: .LBB5_2: @@ -248,9 +248,9 @@ ; 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: .Ltmp3: +; RV32I-NEXT: auipc ra, %pcrel_hi(__mulsi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp3) ; RV32I-NEXT: srli a0, a0, 24 ; RV32I-NEXT: j .LBB6_3 ; RV32I-NEXT: .LBB6_2: @@ -266,16 +266,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 +295,13 @@ ; 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: .Ltmp4: +; RV32I-NEXT: auipc ra, %pcrel_hi(__mulsi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp4) ; RV32I-NEXT: mv s1, a0 ; RV32I-NEXT: addi a0, s2, -1 ; RV32I-NEXT: not a1, s2 @@ -316,9 +315,11 @@ ; 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: .Ltmp5: +; RV32I-NEXT: auipc ra, %pcrel_hi(__mulsi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp5) ; RV32I-NEXT: bnez s3, .LBB7_2 ; RV32I-NEXT: # %bb.1: ; RV32I-NEXT: srli a0, a0, 24 @@ -328,16 +329,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 +369,9 @@ ; 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: .Ltmp6: +; RV32I-NEXT: auipc ra, %pcrel_hi(__mulsi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp6) ; RV32I-NEXT: srli a0, a0, 24 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 @@ -406,9 +406,9 @@ ; 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: .Ltmp7: +; RV32I-NEXT: auipc ra, %pcrel_hi(__mulsi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp7) ; RV32I-NEXT: srli a0, a0, 24 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 @@ -443,9 +443,9 @@ ; 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: .Ltmp8: +; RV32I-NEXT: auipc ra, %pcrel_hi(__mulsi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp8) ; RV32I-NEXT: srli a0, a0, 24 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 @@ -457,16 +457,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 +486,13 @@ ; 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: .Ltmp9: +; RV32I-NEXT: auipc ra, %pcrel_hi(__mulsi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp9) ; RV32I-NEXT: mv s1, a0 ; RV32I-NEXT: addi a0, s2, -1 ; RV32I-NEXT: not a1, s2 @@ -507,9 +506,11 @@ ; 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: .Ltmp10: +; RV32I-NEXT: auipc ra, %pcrel_hi(__mulsi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp10) ; RV32I-NEXT: bnez s3, .LBB11_2 ; RV32I-NEXT: # %bb.1: ; RV32I-NEXT: srli a0, a0, 24 @@ -519,16 +520,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 +557,9 @@ ; 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: .Ltmp11: +; RV32I-NEXT: auipc ra, %pcrel_hi(__mulsi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp11) ; 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,10 @@ ; 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: .Ltmp0: +; RV32I-NEXT: auipc ra, %pcrel_hi(callee) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp0) ; 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,9 @@ ; 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: .Ltmp0: +; RV32I-NEXT: auipc ra, %pcrel_hi(receive_uint8) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp0) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -33,9 +33,9 @@ ; 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: .Ltmp1: +; RV32I-NEXT: auipc ra, %pcrel_hi(return_uint8) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp1) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -59,11 +59,11 @@ ; 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: .Ltmp2: +; RV32I-NEXT: auipc ra, %pcrel_hi(receive_sint8) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp2) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -77,9 +77,9 @@ ; 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: .Ltmp3: +; RV32I-NEXT: auipc ra, %pcrel_hi(return_uint8) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp3) ; RV32I-NEXT: slli a0, a0, 24 ; RV32I-NEXT: srai a0, a0, 24 ; RV32I-NEXT: lw ra, 12(sp) @@ -104,9 +104,9 @@ ; 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: .Ltmp4: +; RV32I-NEXT: auipc ra, %pcrel_hi(receive_anyint32) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp4) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -120,9 +120,9 @@ ; 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: .Ltmp5: +; RV32I-NEXT: auipc ra, %pcrel_hi(return_uint8) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp5) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -145,9 +145,9 @@ ; 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: .Ltmp6: +; RV32I-NEXT: auipc ra, %pcrel_hi(receive_uint8) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp6) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -162,9 +162,9 @@ ; 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: .Ltmp7: +; RV32I-NEXT: auipc ra, %pcrel_hi(return_sint8) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp7) ; RV32I-NEXT: andi a0, a0, 255 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 @@ -185,9 +185,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: jalr a1 +; RV32I-NEXT: .Ltmp8: +; RV32I-NEXT: auipc ra, %pcrel_hi(receive_sint8) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp8) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -200,9 +200,9 @@ ; 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: .Ltmp9: +; RV32I-NEXT: auipc ra, %pcrel_hi(return_sint8) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp9) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -223,9 +223,9 @@ ; 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: .Ltmp10: +; RV32I-NEXT: auipc ra, %pcrel_hi(receive_anyint32) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp10) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -239,9 +239,9 @@ ; 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: .Ltmp11: +; RV32I-NEXT: auipc ra, %pcrel_hi(return_sint8) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp11) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -265,9 +265,9 @@ ; 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: .Ltmp12: +; RV32I-NEXT: auipc ra, %pcrel_hi(receive_uint8) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp12) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -283,9 +283,9 @@ ; 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: .Ltmp13: +; RV32I-NEXT: auipc ra, %pcrel_hi(return_anyint32) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp13) ; RV32I-NEXT: andi a0, a0, 255 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 @@ -310,11 +310,11 @@ ; 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: .Ltmp14: +; RV32I-NEXT: auipc ra, %pcrel_hi(receive_sint8) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp14) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -328,9 +328,9 @@ ; 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: .Ltmp15: +; RV32I-NEXT: auipc ra, %pcrel_hi(return_anyint32) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp15) ; RV32I-NEXT: slli a0, a0, 24 ; RV32I-NEXT: srai a0, a0, 24 ; RV32I-NEXT: lw ra, 12(sp) @@ -353,9 +353,9 @@ ; 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: .Ltmp16: +; RV32I-NEXT: auipc ra, %pcrel_hi(receive_anyint32) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp16) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -368,9 +368,9 @@ ; 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: .Ltmp17: +; RV32I-NEXT: auipc ra, %pcrel_hi(return_anyint32) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp17) ; 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,11 @@ ; 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: .Ltmp0: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(__fixdfsi) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp0) ; RV32I-FPELIM-NEXT: add a1, s4, s3 ; RV32I-FPELIM-NEXT: add a1, a1, s2 ; RV32I-FPELIM-NEXT: add a1, a1, s1 @@ -54,11 +54,11 @@ ; 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: .Ltmp0: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(__fixdfsi) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp0) ; RV32I-WITHFP-NEXT: add a1, s4, s3 ; RV32I-WITHFP-NEXT: add a1, a1, s2 ; RV32I-WITHFP-NEXT: add a1, a1, s1 @@ -87,15 +87,15 @@ ; 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: .Ltmp1: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(callee_scalars) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp1) ; RV32I-FPELIM-NEXT: lw ra, 12(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 16 ; RV32I-FPELIM-NEXT: ret @@ -108,15 +108,15 @@ ; 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: .Ltmp1: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(callee_scalars) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp1) ; RV32I-WITHFP-NEXT: lw s0, 8(sp) ; RV32I-WITHFP-NEXT: lw ra, 12(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 16 @@ -198,11 +198,11 @@ ; 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: .Ltmp2: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(callee_large_scalars) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp2) ; RV32I-FPELIM-NEXT: lw ra, 44(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 48 ; RV32I-FPELIM-NEXT: ret @@ -224,11 +224,11 @@ ; 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: .Ltmp2: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(callee_large_scalars) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp2) ; RV32I-WITHFP-NEXT: lw s0, 40(sp) ; RV32I-WITHFP-NEXT: lw ra, 44(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 48 @@ -317,8 +317,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 +325,9 @@ ; 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: .Ltmp3: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(callee_large_scalars_exhausted_regs) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp3) ; RV32I-FPELIM-NEXT: lw ra, 60(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 64 ; RV32I-FPELIM-NEXT: ret @@ -353,8 +353,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 +361,9 @@ ; 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: .Ltmp3: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(callee_large_scalars_exhausted_regs) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp3) ; RV32I-WITHFP-NEXT: lw s0, 56(sp) ; RV32I-WITHFP-NEXT: lw ra, 60(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 64 @@ -383,10 +383,10 @@ ; 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: .Ltmp4: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(__floatditf) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp4) ; RV32I-FPELIM-NEXT: lw a0, 8(sp) ; RV32I-FPELIM-NEXT: lw ra, 28(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 32 @@ -400,10 +400,10 @@ ; 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: .Ltmp4: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(__floatditf) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp4) ; RV32I-WITHFP-NEXT: lw a0, -24(s0) ; RV32I-WITHFP-NEXT: lw s0, 24(sp) ; RV32I-WITHFP-NEXT: lw ra, 28(sp) @@ -487,8 +487,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 +495,9 @@ ; 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: .Ltmp5: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(callee_many_scalars) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp5) ; RV32I-FPELIM-NEXT: lw ra, 12(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 16 ; RV32I-FPELIM-NEXT: ret @@ -511,8 +511,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 +519,9 @@ ; 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: .Ltmp5: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(callee_many_scalars) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp5) ; RV32I-WITHFP-NEXT: lw s0, 8(sp) ; RV32I-WITHFP-NEXT: lw ra, 12(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 16 @@ -565,11 +565,11 @@ ; 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: .Ltmp6: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(callee_small_coerced_struct) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp6) ; RV32I-FPELIM-NEXT: lw ra, 12(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 16 ; RV32I-FPELIM-NEXT: ret @@ -580,11 +580,11 @@ ; 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: .Ltmp6: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(callee_small_coerced_struct) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp6) ; RV32I-WITHFP-NEXT: lw s0, 8(sp) ; RV32I-WITHFP-NEXT: lw ra, 12(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 16 @@ -643,10 +643,10 @@ ; 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: .Ltmp7: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(callee_large_struct) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp7) ; RV32I-FPELIM-NEXT: lw ra, 44(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 48 ; RV32I-FPELIM-NEXT: ret @@ -669,10 +669,10 @@ ; 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: .Ltmp7: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(callee_large_struct) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp7) ; RV32I-WITHFP-NEXT: lw s0, 40(sp) ; RV32I-WITHFP-NEXT: lw ra, 44(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 48 @@ -778,8 +778,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 +785,9 @@ ; 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: .Ltmp8: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(callee_aligned_stack) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp8) ; RV32I-FPELIM-NEXT: lw ra, 60(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 64 ; RV32I-FPELIM-NEXT: ret @@ -826,8 +826,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 +833,9 @@ ; 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: .Ltmp8: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(callee_aligned_stack) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp8) ; RV32I-WITHFP-NEXT: lw s0, 56(sp) ; RV32I-WITHFP-NEXT: lw ra, 60(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 64 @@ -878,18 +878,20 @@ ; 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: .Ltmp9: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(callee_small_scalar_ret) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp9) +; 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 +901,21 @@ ; 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: .Ltmp9: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(callee_small_scalar_ret) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp9) +; 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 +955,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_struct_ret) -; RV32I-FPELIM-NEXT: addi a0, a0, %lo(callee_small_struct_ret) -; RV32I-FPELIM-NEXT: jalr a0 +; RV32I-FPELIM-NEXT: .Ltmp10: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(callee_small_struct_ret) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp10) ; RV32I-FPELIM-NEXT: add a0, a0, a1 ; RV32I-FPELIM-NEXT: lw ra, 12(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 16 @@ -965,9 +969,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_struct_ret) -; RV32I-WITHFP-NEXT: addi a0, a0, %lo(callee_small_struct_ret) -; RV32I-WITHFP-NEXT: jalr a0 +; RV32I-WITHFP-NEXT: .Ltmp10: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(callee_small_struct_ret) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp10) ; RV32I-WITHFP-NEXT: add a0, a0, a1 ; RV32I-WITHFP-NEXT: lw s0, 8(sp) ; RV32I-WITHFP-NEXT: lw ra, 12(sp) @@ -1018,10 +1022,10 @@ ; 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: .Ltmp11: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(callee_large_scalar_ret) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp11) ; RV32I-FPELIM-NEXT: lw ra, 28(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 32 ; RV32I-FPELIM-NEXT: ret @@ -1032,10 +1036,10 @@ ; 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: .Ltmp11: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(callee_large_scalar_ret) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp11) ; RV32I-WITHFP-NEXT: lw s0, 24(sp) ; RV32I-WITHFP-NEXT: lw ra, 28(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 32 @@ -1093,10 +1097,10 @@ ; 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: .Ltmp12: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(callee_large_struct_ret) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp12) ; RV32I-FPELIM-NEXT: lw a0, 20(sp) ; RV32I-FPELIM-NEXT: lw a1, 8(sp) ; RV32I-FPELIM-NEXT: add a0, a1, a0 @@ -1110,10 +1114,10 @@ ; 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: .Ltmp12: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(callee_large_struct_ret) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp12) ; 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,9 @@ ; 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: .Ltmp0: +; RV32I-NEXT: auipc ra, %pcrel_hi(external_function) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp0) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -33,9 +33,9 @@ ; 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: .Ltmp1: +; RV32I-NEXT: auipc ra, %pcrel_hi(defined_function) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp1) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -77,10 +77,9 @@ ; 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: .Ltmp2: +; RV32I-NEXT: auipc ra, %pcrel_hi(fastcc_function) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp2) ; RV32I-NEXT: mv a0, s1 ; RV32I-NEXT: lw s1, 8(sp) ; RV32I-NEXT: lw ra, 12(sp) @@ -101,17 +100,16 @@ ; 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: .Ltmp3: +; RV32I-NEXT: auipc ra, %pcrel_hi(external_many_args) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp3) ; RV32I-NEXT: mv a0, s1 ; RV32I-NEXT: lw s1, 8(sp) ; RV32I-NEXT: lw ra, 12(sp) @@ -139,8 +137,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 +144,9 @@ ; RV32I-NEXT: mv a5, a0 ; RV32I-NEXT: mv a6, a0 ; RV32I-NEXT: mv a7, a0 -; RV32I-NEXT: jalr t0 +; RV32I-NEXT: .Ltmp4: +; RV32I-NEXT: auipc ra, %pcrel_hi(defined_many_args) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp4) ; 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,9 @@ ; 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: .Ltmp0: +; RV32I-NEXT: auipc ra, %pcrel_hi(__udivsi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp0) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -29,10 +29,10 @@ ; 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: .Ltmp1: +; RV32I-NEXT: auipc ra, %pcrel_hi(__udivsi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp1) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -67,9 +67,9 @@ ; 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: .Ltmp2: +; RV32I-NEXT: auipc ra, %pcrel_hi(__udivdi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp2) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -78,9 +78,9 @@ ; 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: .Ltmp0: +; RV32IM-NEXT: auipc ra, %pcrel_hi(__udivdi3) +; RV32IM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp0) ; RV32IM-NEXT: lw ra, 12(sp) ; RV32IM-NEXT: addi sp, sp, 16 ; RV32IM-NEXT: ret @@ -93,11 +93,11 @@ ; 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: .Ltmp3: +; RV32I-NEXT: auipc ra, %pcrel_hi(__udivdi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp3) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -106,11 +106,11 @@ ; 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: .Ltmp1: +; RV32IM-NEXT: auipc ra, %pcrel_hi(__udivdi3) +; RV32IM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp1) ; RV32IM-NEXT: lw ra, 12(sp) ; RV32IM-NEXT: addi sp, sp, 16 ; RV32IM-NEXT: ret @@ -123,9 +123,9 @@ ; 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: .Ltmp4: +; RV32I-NEXT: auipc ra, %pcrel_hi(__divsi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp4) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -143,10 +143,10 @@ ; 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: .Ltmp5: +; RV32I-NEXT: auipc ra, %pcrel_hi(__divsi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp5) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -189,9 +189,9 @@ ; 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: .Ltmp6: +; RV32I-NEXT: auipc ra, %pcrel_hi(__divdi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp6) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -200,9 +200,9 @@ ; 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: .Ltmp2: +; RV32IM-NEXT: auipc ra, %pcrel_hi(__divdi3) +; RV32IM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp2) ; RV32IM-NEXT: lw ra, 12(sp) ; RV32IM-NEXT: addi sp, sp, 16 ; RV32IM-NEXT: ret @@ -215,11 +215,11 @@ ; 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: .Ltmp7: +; RV32I-NEXT: auipc ra, %pcrel_hi(__divdi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp7) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -228,11 +228,11 @@ ; 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: .Ltmp3: +; RV32IM-NEXT: auipc ra, %pcrel_hi(__divdi3) +; RV32IM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp3) ; 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,9 @@ ; 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: .Ltmp0: +; RV32IF-NEXT: auipc ra, %pcrel_hi(abort) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp0) %1 = fcmp false float %a, %b br i1 %1, label %if.then, label %if.else if.then: @@ -44,9 +44,9 @@ ; 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: .Ltmp1: +; RV32IF-NEXT: auipc ra, %pcrel_hi(abort) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp1) %1 = fcmp oeq float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -74,9 +74,9 @@ ; 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: .Ltmp2: +; RV32IF-NEXT: auipc ra, %pcrel_hi(abort) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp2) %1 = fcmp oeq float %a, %b br i1 %1, label %if.then, label %if.else if.then: @@ -100,9 +100,9 @@ ; 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: .Ltmp3: +; RV32IF-NEXT: auipc ra, %pcrel_hi(abort) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp3) %1 = fcmp ogt float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -126,9 +126,9 @@ ; 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: .Ltmp4: +; RV32IF-NEXT: auipc ra, %pcrel_hi(abort) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp4) %1 = fcmp oge float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -152,9 +152,9 @@ ; 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: .Ltmp5: +; RV32IF-NEXT: auipc ra, %pcrel_hi(abort) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp5) %1 = fcmp olt float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -178,9 +178,9 @@ ; 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: .Ltmp6: +; RV32IF-NEXT: auipc ra, %pcrel_hi(abort) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp6) %1 = fcmp ole float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -212,9 +212,9 @@ ; 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: .Ltmp7: +; RV32IF-NEXT: auipc ra, %pcrel_hi(abort) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp7) %1 = fcmp one float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -242,9 +242,9 @@ ; 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: .Ltmp8: +; RV32IF-NEXT: auipc ra, %pcrel_hi(abort) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp8) %1 = fcmp ord float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -273,9 +273,9 @@ ; 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: .Ltmp9: +; RV32IF-NEXT: auipc ra, %pcrel_hi(abort) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp9) %1 = fcmp ueq float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -300,9 +300,9 @@ ; 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: .Ltmp10: +; RV32IF-NEXT: auipc ra, %pcrel_hi(abort) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp10) %1 = fcmp ugt float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -327,9 +327,9 @@ ; 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: .Ltmp11: +; RV32IF-NEXT: auipc ra, %pcrel_hi(abort) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp11) %1 = fcmp uge float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -354,9 +354,9 @@ ; 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: .Ltmp12: +; RV32IF-NEXT: auipc ra, %pcrel_hi(abort) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp12) %1 = fcmp ult float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -381,9 +381,9 @@ ; 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: .Ltmp13: +; RV32IF-NEXT: auipc ra, %pcrel_hi(abort) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp13) %1 = fcmp ule float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -408,9 +408,9 @@ ; 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: .Ltmp14: +; RV32IF-NEXT: auipc ra, %pcrel_hi(abort) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp14) %1 = fcmp une float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -438,9 +438,9 @@ ; 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: .Ltmp15: +; RV32IF-NEXT: auipc ra, %pcrel_hi(abort) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp15) %1 = fcmp uno float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -462,9 +462,9 @@ ; 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: .Ltmp16: +; RV32IF-NEXT: auipc ra, %pcrel_hi(abort) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp16) %1 = fcmp true float %a, %b br i1 %1, label %if.then, label %if.else if.else: @@ -482,35 +482,35 @@ ; 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: .Ltmp17: +; RV32IF-NEXT: auipc ra, %pcrel_hi(dummy) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp17) +; 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: .Ltmp18: +; RV32IF-NEXT: auipc ra, %pcrel_hi(dummy) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp18) ; 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: .Ltmp19: +; RV32IF-NEXT: auipc ra, %pcrel_hi(abort) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp19) 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,10 @@ ; 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: .Ltmp0: +; RV32IF-NEXT: auipc ra, %pcrel_hi(notdead) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp0) ; RV32IF-NEXT: fmv.w.x ft0, s1 ; RV32IF-NEXT: flw ft1, 4(sp) ; RV32IF-NEXT: fadd.s ft0, ft1, ft0 @@ -121,10 +121,10 @@ ; 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: .Ltmp1: +; RV32IF-NEXT: auipc ra, %pcrel_hi(notdead) +; RV32IF-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp1) ; 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,11 @@ ; 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: .Ltmp0: +; RV32I-NEXT: auipc ra, %pcrel_hi(__netf2) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp0) ; RV32I-NEXT: xor a0, a0, zero ; RV32I-NEXT: snez a0, a0 ; RV32I-NEXT: lw ra, 44(sp) @@ -83,12 +83,12 @@ ; 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: .Ltmp1: +; RV32I-NEXT: auipc ra, %pcrel_hi(__addtf3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp1) ; RV32I-NEXT: lw a0, 68(sp) ; RV32I-NEXT: sw a0, 20(sp) ; RV32I-NEXT: lw a0, 64(sp) @@ -97,10 +97,10 @@ ; 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: .Ltmp2: +; RV32I-NEXT: auipc ra, %pcrel_hi(__fixtfsi) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp2) ; 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,10 @@ ; 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: .Ltmp0: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(test1) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp0) ; RV32I-FPELIM-NEXT: mv a0, zero ; RV32I-FPELIM-NEXT: lw ra, 28(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 32 @@ -36,10 +36,10 @@ ; 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: .Ltmp0: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(test1) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp0) ; 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,10 @@ ; 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: .Ltmp0: +; RV32I-NEXT: auipc ra, %pcrel_hi(notdead) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp0) ; 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,10 @@ ; 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: .Ltmp0: +; RV32I-NEXT: auipc ra, %pcrel_hi(__mulsi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp0) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -30,9 +30,9 @@ ; 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: .Ltmp1: +; RV32I-NEXT: auipc ra, %pcrel_hi(__mulsi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp1) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -50,10 +50,10 @@ ; 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: .Ltmp2: +; RV32I-NEXT: auipc ra, %pcrel_hi(__mulsi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp2) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -86,9 +86,9 @@ ; 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: .Ltmp3: +; RV32I-NEXT: auipc ra, %pcrel_hi(__muldi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp3) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -111,11 +111,11 @@ ; 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: .Ltmp4: +; RV32I-NEXT: auipc ra, %pcrel_hi(__muldi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp4) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -138,11 +138,11 @@ ; 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: .Ltmp5: +; RV32I-NEXT: auipc ra, %pcrel_hi(__muldi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp5) ; RV32I-NEXT: mv a0, a1 ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 @@ -166,11 +166,11 @@ ; 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: .Ltmp6: +; RV32I-NEXT: auipc ra, %pcrel_hi(__muldi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp6) ; 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,9 @@ ; 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: .Ltmp0: +; RV32I-NEXT: auipc ra, %pcrel_hi(__umodsi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp0) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -29,9 +29,9 @@ ; 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: .Ltmp1: +; RV32I-NEXT: auipc ra, %pcrel_hi(__modsi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp1) ; 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,9 @@ ; 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: .Ltmp0: +; RV32I-NEXT: auipc ra, %pcrel_hi(__lshrdi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp0) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -25,9 +25,9 @@ ; 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: .Ltmp1: +; RV32I-NEXT: auipc ra, %pcrel_hi(__ashrdi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp1) ; RV32I-NEXT: lw ra, 12(sp) ; RV32I-NEXT: addi sp, sp, 16 ; RV32I-NEXT: ret @@ -40,9 +40,9 @@ ; 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: .Ltmp2: +; RV32I-NEXT: auipc ra, %pcrel_hi(__ashldi3) +; RV32I-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp2) ; 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,9 @@ ; 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: .Ltmp0: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(notdead) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp0) ; RV32I-FPELIM-NEXT: mv a0, s1 ; RV32I-FPELIM-NEXT: addi sp, s0, -16 ; RV32I-FPELIM-NEXT: lw s1, 4(sp) @@ -224,9 +224,9 @@ ; 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: .Ltmp0: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(notdead) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp0) ; RV32I-WITHFP-NEXT: mv a0, s1 ; RV32I-WITHFP-NEXT: addi sp, s0, -16 ; RV32I-WITHFP-NEXT: lw s1, 4(sp) @@ -266,11 +266,11 @@ ; 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: .Ltmp1: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(va1) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp1) ; RV32I-FPELIM-NEXT: lw ra, 12(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 16 ; RV32I-FPELIM-NEXT: ret @@ -283,11 +283,11 @@ ; 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: .Ltmp1: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(va1) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp1) ; RV32I-WITHFP-NEXT: lw s0, 8(sp) ; RV32I-WITHFP-NEXT: lw ra, 12(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 16 @@ -474,10 +474,10 @@ ; 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: .Ltmp2: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(va2) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp2) ; RV32I-FPELIM-NEXT: lw ra, 12(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 16 ; RV32I-FPELIM-NEXT: ret @@ -490,10 +490,10 @@ ; 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: .Ltmp2: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(va2) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp2) ; RV32I-WITHFP-NEXT: lw s0, 8(sp) ; RV32I-WITHFP-NEXT: lw ra, 12(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 16 @@ -542,8 +542,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 +550,9 @@ ; 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: .Ltmp3: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(__adddf3) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp3) ; RV32I-FPELIM-NEXT: lw ra, 4(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 32 ; RV32I-FPELIM-NEXT: ret @@ -570,8 +570,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 +578,9 @@ ; 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: .Ltmp3: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(__adddf3) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp3) ; RV32I-WITHFP-NEXT: lw s0, 16(sp) ; RV32I-WITHFP-NEXT: lw ra, 20(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 48 @@ -645,13 +645,13 @@ ; 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: .Ltmp4: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(__adddf3) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp4) ; RV32I-FPELIM-NEXT: lw ra, 4(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 32 ; RV32I-FPELIM-NEXT: ret @@ -674,13 +674,13 @@ ; 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: .Ltmp4: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(__adddf3) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp4) ; RV32I-WITHFP-NEXT: lw s0, 16(sp) ; RV32I-WITHFP-NEXT: lw ra, 20(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 48 @@ -720,12 +720,12 @@ ; 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: .Ltmp5: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(va3) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp5) ; RV32I-FPELIM-NEXT: lw ra, 12(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 16 ; RV32I-FPELIM-NEXT: ret @@ -740,12 +740,12 @@ ; 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: .Ltmp5: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(va3) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp5) ; RV32I-WITHFP-NEXT: lw s0, 8(sp) ; RV32I-WITHFP-NEXT: lw ra, 12(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 16 @@ -815,9 +815,9 @@ ; 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: .Ltmp6: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(notdead) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp6) ; RV32I-FPELIM-NEXT: lw a0, 4(sp) ; RV32I-FPELIM-NEXT: addi a0, a0, 3 ; RV32I-FPELIM-NEXT: andi a0, a0, -4 @@ -860,9 +860,9 @@ ; 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: .Ltmp6: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(notdead) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp6) ; RV32I-WITHFP-NEXT: lw a0, -16(s0) ; RV32I-WITHFP-NEXT: addi a0, a0, 3 ; RV32I-WITHFP-NEXT: andi a0, a0, -4 @@ -1037,15 +1037,15 @@ ; 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: .Ltmp7: +; RV32I-FPELIM-NEXT: auipc ra, %pcrel_hi(va5_aligned_stack_callee) +; RV32I-FPELIM-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp7) ; RV32I-FPELIM-NEXT: lw ra, 60(sp) ; RV32I-FPELIM-NEXT: addi sp, sp, 64 ; RV32I-FPELIM-NEXT: ret @@ -1084,15 +1084,15 @@ ; 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: .Ltmp7: +; RV32I-WITHFP-NEXT: auipc ra, %pcrel_hi(va5_aligned_stack_callee) +; RV32I-WITHFP-NEXT: jalr ra, ra, %pcrel_lo(.Ltmp7) ; RV32I-WITHFP-NEXT: lw s0, 56(sp) ; RV32I-WITHFP-NEXT: lw ra, 60(sp) ; RV32I-WITHFP-NEXT: addi sp, sp, 64 Index: test/MC/RISCV/relocations.s =================================================================== --- test/MC/RISCV/relocations.s +++ test/MC/RISCV/relocations.s @@ -44,11 +44,17 @@ # INSTR: sb t1, %lo(foo+4)(a2) # FIXUP: fixup A - offset: 0, value: %lo(foo+4), kind: fixup_riscv_lo12_s +.Ltmp0: auipc t1, %pcrel_hi(foo) # RELOC: R_RISCV_PCREL_HI20 foo 0x0 # INSTR: auipc t1, %pcrel_hi(foo) # FIXUP: fixup A - offset: 0, value: %pcrel_hi(foo), kind: fixup_riscv_pcrel_hi20 +jalr ra, ra, %pcrel_lo(.Ltmp0) +# RELOC: R_RISCV_PCREL_LO12_I .Ltmp0 0x0 +# INSTR: jalr ra, ra, %pcrel_lo(.Ltmp0) +# FIXUP: fixup A - offset: 0, value: %pcrel_lo(.Ltmp0), kind: fixup_riscv_pcrel_lo12_i + auipc t1, %pcrel_hi(foo+4) # RELOC: R_RISCV_PCREL_HI20 foo 0x4 # INSTR: auipc t1, %pcrel_hi(foo+4)