@@ -55,9 +55,16 @@ class RISCVExpandPseudo : public MachineFunctionPass {
5555 bool expandAtomicCmpXchg (MachineBasicBlock &MBB,
5656 MachineBasicBlock::iterator MBBI, bool IsMasked,
5757 int Width, MachineBasicBlock::iterator &NextMBBI);
58+ bool expandAuipcInstPair (MachineBasicBlock &MBB,
59+ MachineBasicBlock::iterator MBBI,
60+ MachineBasicBlock::iterator &NextMBBI,
61+ unsigned FlagsHi, unsigned SecondOpcode);
5862 bool expandLoadLocalAddress (MachineBasicBlock &MBB,
5963 MachineBasicBlock::iterator MBBI,
6064 MachineBasicBlock::iterator &NextMBBI);
65+ bool expandLoadAddress (MachineBasicBlock &MBB,
66+ MachineBasicBlock::iterator MBBI,
67+ MachineBasicBlock::iterator &NextMBBI);
6168};
6269
6370char RISCVExpandPseudo::ID = 0 ;
@@ -123,6 +130,8 @@ bool RISCVExpandPseudo::expandMI(MachineBasicBlock &MBB,
123130 return expandAtomicCmpXchg (MBB, MBBI, true , 32 , NextMBBI);
124131 case RISCV::PseudoLLA:
125132 return expandLoadLocalAddress (MBB, MBBI, NextMBBI);
133+ case RISCV::PseudoLA:
134+ return expandLoadAddress (MBB, MBBI, NextMBBI);
126135 }
127136
128137 return false ;
@@ -603,9 +612,10 @@ bool RISCVExpandPseudo::expandAtomicCmpXchg(
603612 return true ;
604613}
605614
606- bool RISCVExpandPseudo::expandLoadLocalAddress (
615+ bool RISCVExpandPseudo::expandAuipcInstPair (
607616 MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
608- MachineBasicBlock::iterator &NextMBBI) {
617+ MachineBasicBlock::iterator &NextMBBI, unsigned FlagsHi,
618+ unsigned SecondOpcode) {
609619 MachineFunction *MF = MBB.getParent ();
610620 MachineInstr &MI = *MBBI;
611621 DebugLoc DL = MI.getDebugLoc ();
@@ -622,8 +632,8 @@ bool RISCVExpandPseudo::expandLoadLocalAddress(
622632 MF->insert (++MBB.getIterator (), NewMBB);
623633
624634 BuildMI (NewMBB, DL, TII->get (RISCV::AUIPC), DestReg)
625- .addDisp (Symbol, 0 , RISCVII::MO_PCREL_HI );
626- BuildMI (NewMBB, DL, TII->get (RISCV::ADDI ), DestReg)
635+ .addDisp (Symbol, 0 , FlagsHi );
636+ BuildMI (NewMBB, DL, TII->get (SecondOpcode ), DestReg)
627637 .addReg (DestReg)
628638 .addMBB (NewMBB, RISCVII::MO_PCREL_LO);
629639
@@ -643,6 +653,31 @@ bool RISCVExpandPseudo::expandLoadLocalAddress(
643653 return true ;
644654}
645655
656+ bool RISCVExpandPseudo::expandLoadLocalAddress (
657+ MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
658+ MachineBasicBlock::iterator &NextMBBI) {
659+ return expandAuipcInstPair (MBB, MBBI, NextMBBI, RISCVII::MO_PCREL_HI,
660+ RISCV::ADDI);
661+ }
662+
663+ bool RISCVExpandPseudo::expandLoadAddress (
664+ MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
665+ MachineBasicBlock::iterator &NextMBBI) {
666+ MachineFunction *MF = MBB.getParent ();
667+
668+ unsigned SecondOpcode;
669+ unsigned FlagsHi;
670+ if (MF->getTarget ().isPositionIndependent ()) {
671+ const auto &STI = MF->getSubtarget <RISCVSubtarget>();
672+ SecondOpcode = STI.is64Bit () ? RISCV::LD : RISCV::LW;
673+ FlagsHi = RISCVII::MO_GOT_HI;
674+ } else {
675+ SecondOpcode = RISCV::ADDI;
676+ FlagsHi = RISCVII::MO_PCREL_HI;
677+ }
678+ return expandAuipcInstPair (MBB, MBBI, NextMBBI, FlagsHi, SecondOpcode);
679+ }
680+
646681} // end of anonymous namespace
647682
648683INITIALIZE_PASS (RISCVExpandPseudo, " riscv-expand-pseudo" ,
0 commit comments