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