Skip to content

Commit 87e8c31

Browse files
committed
[LoongArch] Override hooks to enable sink-and-fold support in MachineSink
1 parent 066c52f commit 87e8c31

File tree

5 files changed

+98
-12
lines changed

5 files changed

+98
-12
lines changed

llvm/lib/Target/LoongArch/LoongArchInstrInfo.cpp

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -756,6 +756,83 @@ LoongArchInstrInfo::getSerializableBitmaskMachineOperandTargetFlags() const {
756756
return ArrayRef(TargetFlags);
757757
}
758758

759+
bool LoongArchInstrInfo::canFoldIntoAddrMode(const MachineInstr &MemI,
760+
Register Reg,
761+
const MachineInstr &AddrI,
762+
ExtAddrMode &AM) const {
763+
unsigned OffsetWidth = 0;
764+
switch (MemI.getOpcode()) {
765+
default:
766+
return false;
767+
case LoongArch::LD_B:
768+
case LoongArch::LD_H:
769+
case LoongArch::LD_W:
770+
case LoongArch::LD_D:
771+
case LoongArch::LD_BU:
772+
case LoongArch::LD_HU:
773+
case LoongArch::LD_WU:
774+
case LoongArch::ST_B:
775+
case LoongArch::ST_H:
776+
case LoongArch::ST_W:
777+
case LoongArch::ST_D:
778+
case LoongArch::FLD_S:
779+
case LoongArch::FLD_D:
780+
case LoongArch::FST_S:
781+
case LoongArch::FST_D:
782+
OffsetWidth = 12;
783+
break;
784+
case LoongArch::LDPTR_W:
785+
case LoongArch::LDPTR_D:
786+
case LoongArch::STPTR_W:
787+
case LoongArch::STPTR_D:
788+
OffsetWidth = 14;
789+
break;
790+
}
791+
792+
if (MemI.getOperand(0).getReg() == Reg)
793+
return false;
794+
795+
if ((AddrI.getOpcode() != LoongArch::ADDI_W &&
796+
AddrI.getOpcode() != LoongArch::ADDI_D) ||
797+
!AddrI.getOperand(1).isReg() || !AddrI.getOperand(2).isImm())
798+
return false;
799+
800+
int64_t OldOffset = MemI.getOperand(2).getImm();
801+
int64_t Disp = AddrI.getOperand(2).getImm();
802+
int64_t NewOffset = OldOffset + Disp;
803+
if (!STI.is64Bit())
804+
NewOffset = SignExtend64<32>(NewOffset);
805+
806+
if (!(OffsetWidth == 12 && isInt<12>(NewOffset)) &&
807+
!(OffsetWidth == 14 && isShiftedInt<14, 2>(NewOffset) && STI.hasUAL()))
808+
return false;
809+
810+
AM.BaseReg = AddrI.getOperand(1).getReg();
811+
AM.ScaledReg = 0;
812+
AM.Scale = 0;
813+
AM.Displacement = NewOffset;
814+
AM.Form = ExtAddrMode::Formula::Basic;
815+
return true;
816+
}
817+
818+
MachineInstr *
819+
LoongArchInstrInfo::emitLdStWithAddr(MachineInstr &MemI,
820+
const ExtAddrMode &AM) const {
821+
const DebugLoc &DL = MemI.getDebugLoc();
822+
MachineBasicBlock &MBB = *MemI.getParent();
823+
824+
assert(AM.ScaledReg == 0 && AM.Scale == 0 &&
825+
"Addressing mode not supported for folding");
826+
827+
return BuildMI(MBB, MemI, DL, get(MemI.getOpcode()))
828+
.addReg(MemI.getOperand(0).getReg(),
829+
MemI.mayLoad() ? RegState::Define : 0)
830+
.addReg(AM.BaseReg)
831+
.addImm(AM.Displacement)
832+
.setMemRefs(MemI.memoperands())
833+
.setMIFlags(MemI.getFlags());
834+
}
835+
759836
// Returns true if this is the sext.w pattern, addi.w rd, rs, 0.
760837
bool LoongArch::isSEXT_W(const MachineInstr &MI) {
761838
return MI.getOpcode() == LoongArch::ADDI_W && MI.getOperand(1).isReg() &&

llvm/lib/Target/LoongArch/LoongArchInstrInfo.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,12 @@ class LoongArchInstrInfo : public LoongArchGenInstrInfo {
9393
ArrayRef<std::pair<unsigned, const char *>>
9494
getSerializableBitmaskMachineOperandTargetFlags() const override;
9595

96+
bool canFoldIntoAddrMode(const MachineInstr &MemI, Register Reg,
97+
const MachineInstr &AddrI,
98+
ExtAddrMode &AM) const override;
99+
MachineInstr *emitLdStWithAddr(MachineInstr &MemI,
100+
const ExtAddrMode &AM) const override;
101+
96102
protected:
97103
const LoongArchSubtarget &STI;
98104
};

llvm/lib/Target/LoongArch/LoongArchTargetMachine.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ static cl::opt<bool>
6262
cl::desc("Enable the merge base offset pass"),
6363
cl::init(true), cl::Hidden);
6464

65+
static cl::opt<bool>
66+
EnableSinkFold("loongarch-enable-sink-fold",
67+
cl::desc("Enable sinking and folding of instruction copies"),
68+
cl::init(true), cl::Hidden);
69+
6570
static Reloc::Model getEffectiveRelocModel(const Triple &TT,
6671
std::optional<Reloc::Model> RM) {
6772
return RM.value_or(Reloc::Static);
@@ -147,7 +152,9 @@ namespace {
147152
class LoongArchPassConfig : public TargetPassConfig {
148153
public:
149154
LoongArchPassConfig(LoongArchTargetMachine &TM, PassManagerBase &PM)
150-
: TargetPassConfig(TM, PM) {}
155+
: TargetPassConfig(TM, PM) {
156+
setEnableSinkAndFold(EnableSinkFold);
157+
}
151158

152159
LoongArchTargetMachine &getLoongArchTargetMachine() const {
153160
return getTM<LoongArchTargetMachine>();

llvm/test/CodeGen/LoongArch/ldptr.ll

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ define signext i32 @ldptr_w(ptr %p) nounwind {
2424
; LA32-LABEL: ldptr_w:
2525
; LA32: # %bb.0: # %entry
2626
; LA32-NEXT: addi.w $a0, $a0, 2047
27-
; LA32-NEXT: addi.w $a0, $a0, 1
28-
; LA32-NEXT: ld.w $a0, $a0, 0
27+
; LA32-NEXT: ld.w $a0, $a0, 1
2928
; LA32-NEXT: ret
3029
;
3130
; LA64-LABEL: ldptr_w:
@@ -81,10 +80,9 @@ entry:
8180
define i64 @ldptr_d(ptr %p) nounwind {
8281
; LA32-LABEL: ldptr_d:
8382
; LA32: # %bb.0: # %entry
84-
; LA32-NEXT: addi.w $a0, $a0, 2047
85-
; LA32-NEXT: addi.w $a1, $a0, 1
86-
; LA32-NEXT: ld.w $a0, $a1, 0
87-
; LA32-NEXT: ld.w $a1, $a1, 4
83+
; LA32-NEXT: addi.w $a1, $a0, 2047
84+
; LA32-NEXT: ld.w $a0, $a1, 1
85+
; LA32-NEXT: ld.w $a1, $a1, 5
8886
; LA32-NEXT: ret
8987
;
9088
; LA64-LABEL: ldptr_d:

llvm/test/CodeGen/LoongArch/stptr.ll

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ define void @stptr_w(ptr %p, i32 signext %val) nounwind {
2323
; LA32-LABEL: stptr_w:
2424
; LA32: # %bb.0:
2525
; LA32-NEXT: addi.w $a0, $a0, 2047
26-
; LA32-NEXT: addi.w $a0, $a0, 1
27-
; LA32-NEXT: st.w $a1, $a0, 0
26+
; LA32-NEXT: st.w $a1, $a0, 1
2827
; LA32-NEXT: ret
2928
;
3029
; LA64-LABEL: stptr_w:
@@ -77,9 +76,8 @@ define void @stptr_d(ptr %p, i64 %val) nounwind {
7776
; LA32-LABEL: stptr_d:
7877
; LA32: # %bb.0:
7978
; LA32-NEXT: addi.w $a0, $a0, 2047
80-
; LA32-NEXT: addi.w $a0, $a0, 1
81-
; LA32-NEXT: st.w $a2, $a0, 4
82-
; LA32-NEXT: st.w $a1, $a0, 0
79+
; LA32-NEXT: st.w $a2, $a0, 5
80+
; LA32-NEXT: st.w $a1, $a0, 1
8381
; LA32-NEXT: ret
8482
;
8583
; LA64-LABEL: stptr_d:

0 commit comments

Comments
 (0)