@@ -54,9 +54,16 @@ class RISCVExpandPseudo : public MachineFunctionPass {
5454 bool expandAtomicCmpXchg (MachineBasicBlock &MBB,
5555 MachineBasicBlock::iterator MBBI, bool IsMasked,
5656 int Width, MachineBasicBlock::iterator &NextMBBI);
57+ bool expandAuipcInstPair (MachineBasicBlock &MBB,
58+ MachineBasicBlock::iterator MBBI,
59+ MachineBasicBlock::iterator &NextMBBI,
60+ unsigned FlagsHi, unsigned SecondOpcode);
5761 bool expandLoadLocalAddress (MachineBasicBlock &MBB,
5862 MachineBasicBlock::iterator MBBI,
5963 MachineBasicBlock::iterator &NextMBBI);
64+ bool expandLoadAddress (MachineBasicBlock &MBB,
65+ MachineBasicBlock::iterator MBBI,
66+ MachineBasicBlock::iterator &NextMBBI);
6067};
6168
6269char RISCVExpandPseudo::ID = 0 ;
@@ -122,6 +129,8 @@ bool RISCVExpandPseudo::expandMI(MachineBasicBlock &MBB,
122129 return expandAtomicCmpXchg (MBB, MBBI, true , 32 , NextMBBI);
123130 case RISCV::PseudoLLA:
124131 return expandLoadLocalAddress (MBB, MBBI, NextMBBI);
132+ case RISCV::PseudoLA:
133+ return expandLoadAddress (MBB, MBBI, NextMBBI);
125134 }
126135
127136 return false ;
@@ -602,9 +611,10 @@ bool RISCVExpandPseudo::expandAtomicCmpXchg(
602611 return true ;
603612}
604613
605- bool RISCVExpandPseudo::expandLoadLocalAddress (
614+ bool RISCVExpandPseudo::expandAuipcInstPair (
606615 MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
607- MachineBasicBlock::iterator &NextMBBI) {
616+ MachineBasicBlock::iterator &NextMBBI, unsigned FlagsHi,
617+ unsigned SecondOpcode) {
608618 MachineFunction *MF = MBB.getParent ();
609619 MachineInstr &MI = *MBBI;
610620 DebugLoc DL = MI.getDebugLoc ();
@@ -621,8 +631,8 @@ bool RISCVExpandPseudo::expandLoadLocalAddress(
621631 MF->insert (++MBB.getIterator (), NewMBB);
622632
623633 BuildMI (NewMBB, DL, TII->get (RISCV::AUIPC), DestReg)
624- .addDisp (Symbol, 0 , RISCVII::MO_PCREL_HI );
625- BuildMI (NewMBB, DL, TII->get (RISCV::ADDI ), DestReg)
634+ .addDisp (Symbol, 0 , FlagsHi );
635+ BuildMI (NewMBB, DL, TII->get (SecondOpcode ), DestReg)
626636 .addReg (DestReg)
627637 .addMBB (NewMBB, RISCVII::MO_PCREL_LO);
628638
@@ -642,6 +652,31 @@ bool RISCVExpandPseudo::expandLoadLocalAddress(
642652 return true ;
643653}
644654
655+ bool RISCVExpandPseudo::expandLoadLocalAddress (
656+ MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
657+ MachineBasicBlock::iterator &NextMBBI) {
658+ return expandAuipcInstPair (MBB, MBBI, NextMBBI, RISCVII::MO_PCREL_HI,
659+ RISCV::ADDI);
660+ }
661+
662+ bool RISCVExpandPseudo::expandLoadAddress (
663+ MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
664+ MachineBasicBlock::iterator &NextMBBI) {
665+ MachineFunction *MF = MBB.getParent ();
666+
667+ unsigned SecondOpcode;
668+ unsigned FlagsHi;
669+ if (MF->getTarget ().isPositionIndependent ()) {
670+ const auto &STI = MF->getSubtarget <RISCVSubtarget>();
671+ SecondOpcode = STI.is64Bit () ? RISCV::LD : RISCV::LW;
672+ FlagsHi = RISCVII::MO_GOT_HI;
673+ } else {
674+ SecondOpcode = RISCV::ADDI;
675+ FlagsHi = RISCVII::MO_PCREL_HI;
676+ }
677+ return expandAuipcInstPair (MBB, MBBI, NextMBBI, FlagsHi, SecondOpcode);
678+ }
679+
645680} // end of anonymous namespace
646681
647682INITIALIZE_PASS (RISCVExpandPseudo, " riscv-expand-pseudo" ,
0 commit comments