@@ -55,9 +55,16 @@ class RISCVExpandPseudo : public MachineFunctionPass {
55
55
bool expandAtomicCmpXchg (MachineBasicBlock &MBB,
56
56
MachineBasicBlock::iterator MBBI, bool IsMasked,
57
57
int Width, MachineBasicBlock::iterator &NextMBBI);
58
+ bool expandAuipcInstPair (MachineBasicBlock &MBB,
59
+ MachineBasicBlock::iterator MBBI,
60
+ MachineBasicBlock::iterator &NextMBBI,
61
+ unsigned FlagsHi, unsigned SecondOpcode);
58
62
bool expandLoadLocalAddress (MachineBasicBlock &MBB,
59
63
MachineBasicBlock::iterator MBBI,
60
64
MachineBasicBlock::iterator &NextMBBI);
65
+ bool expandLoadAddress (MachineBasicBlock &MBB,
66
+ MachineBasicBlock::iterator MBBI,
67
+ MachineBasicBlock::iterator &NextMBBI);
61
68
};
62
69
63
70
char RISCVExpandPseudo::ID = 0 ;
@@ -123,6 +130,8 @@ bool RISCVExpandPseudo::expandMI(MachineBasicBlock &MBB,
123
130
return expandAtomicCmpXchg (MBB, MBBI, true , 32 , NextMBBI);
124
131
case RISCV::PseudoLLA:
125
132
return expandLoadLocalAddress (MBB, MBBI, NextMBBI);
133
+ case RISCV::PseudoLA:
134
+ return expandLoadAddress (MBB, MBBI, NextMBBI);
126
135
}
127
136
128
137
return false ;
@@ -603,9 +612,10 @@ bool RISCVExpandPseudo::expandAtomicCmpXchg(
603
612
return true ;
604
613
}
605
614
606
- bool RISCVExpandPseudo::expandLoadLocalAddress (
615
+ bool RISCVExpandPseudo::expandAuipcInstPair (
607
616
MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
608
- MachineBasicBlock::iterator &NextMBBI) {
617
+ MachineBasicBlock::iterator &NextMBBI, unsigned FlagsHi,
618
+ unsigned SecondOpcode) {
609
619
MachineFunction *MF = MBB.getParent ();
610
620
MachineInstr &MI = *MBBI;
611
621
DebugLoc DL = MI.getDebugLoc ();
@@ -622,8 +632,8 @@ bool RISCVExpandPseudo::expandLoadLocalAddress(
622
632
MF->insert (++MBB.getIterator (), NewMBB);
623
633
624
634
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)
627
637
.addReg (DestReg)
628
638
.addMBB (NewMBB, RISCVII::MO_PCREL_LO);
629
639
@@ -643,6 +653,31 @@ bool RISCVExpandPseudo::expandLoadLocalAddress(
643
653
return true ;
644
654
}
645
655
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
+
646
681
} // end of anonymous namespace
647
682
648
683
INITIALIZE_PASS (RISCVExpandPseudo, " riscv-expand-pseudo" ,
0 commit comments