Skip to content

Commit fbae346

Browse files
committed
[GlobalISel] Add combine for PTR_ADD with regbanks
Combine two G_PTR_ADDs, but keep the register bank of the constant. That way, the combine can be used in post-regbank-select combines. Introduce two helper methods in CombinerHelper, getRegBank and setRegBank that get and set an optional register bank to a register. That way, they can be used before and after register bank selection. Differential Revision: https://reviews.llvm.org/D103326
1 parent fc5495c commit fbae346

File tree

6 files changed

+732
-685
lines changed

6 files changed

+732
-685
lines changed

llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ class GISelKnownBits;
3636
class MachineDominatorTree;
3737
class LegalizerInfo;
3838
struct LegalityQuery;
39+
class RegisterBank;
40+
class RegisterBankInfo;
3941
class TargetLowering;
42+
class TargetRegisterInfo;
4043

4144
struct PreferredTuple {
4245
LLT Ty; // The result type of the extend.
@@ -54,6 +57,7 @@ struct IndexedLoadStoreMatchInfo {
5457
struct PtrAddChain {
5558
int64_t Imm;
5659
Register Base;
60+
const RegisterBank *Bank;
5761
};
5862

5963
struct RegisterImmPair {
@@ -95,6 +99,8 @@ class CombinerHelper {
9599
GISelKnownBits *KB;
96100
MachineDominatorTree *MDT;
97101
const LegalizerInfo *LI;
102+
const RegisterBankInfo *RBI;
103+
const TargetRegisterInfo *TRI;
98104

99105
public:
100106
CombinerHelper(GISelChangeObserver &Observer, MachineIRBuilder &B,
@@ -120,6 +126,18 @@ class CombinerHelper {
120126
void replaceRegOpWith(MachineRegisterInfo &MRI, MachineOperand &FromRegOp,
121127
Register ToReg) const;
122128

129+
/// Get the register bank of \p Reg.
130+
/// If Reg has not been assigned a register, a register class,
131+
/// or a register bank, then this returns nullptr.
132+
///
133+
/// \pre Reg.isValid()
134+
const RegisterBank *getRegBank(Register Reg) const;
135+
136+
/// Set the register bank of \p Reg.
137+
/// Does nothing if the RegBank is null.
138+
/// This is the counterpart to getRegBank.
139+
void setRegBank(Register Reg, const RegisterBank *RegBank);
140+
123141
/// If \p MI is COPY, try to combine it.
124142
/// Returns true if MI changed.
125143
bool tryCombineCopy(MachineInstr &MI);

llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
1616
#include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"
1717
#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
18+
#include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h"
1819
#include "llvm/CodeGen/GlobalISel/Utils.h"
1920
#include "llvm/CodeGen/LowLevelType.h"
2021
#include "llvm/CodeGen/MachineBasicBlock.h"
@@ -46,8 +47,9 @@ CombinerHelper::CombinerHelper(GISelChangeObserver &Observer,
4647
MachineIRBuilder &B, GISelKnownBits *KB,
4748
MachineDominatorTree *MDT,
4849
const LegalizerInfo *LI)
49-
: Builder(B), MRI(Builder.getMF().getRegInfo()), Observer(Observer),
50-
KB(KB), MDT(MDT), LI(LI) {
50+
: Builder(B), MRI(Builder.getMF().getRegInfo()), Observer(Observer), KB(KB),
51+
MDT(MDT), LI(LI), RBI(Builder.getMF().getSubtarget().getRegBankInfo()),
52+
TRI(Builder.getMF().getSubtarget().getRegisterInfo()) {
5153
(void)this->KB;
5254
}
5355

@@ -143,6 +145,15 @@ void CombinerHelper::replaceRegOpWith(MachineRegisterInfo &MRI,
143145
Observer.changedInstr(*FromRegOp.getParent());
144146
}
145147

148+
const RegisterBank *CombinerHelper::getRegBank(Register Reg) const {
149+
return RBI->getRegBank(Reg, MRI, *TRI);
150+
}
151+
152+
void CombinerHelper::setRegBank(Register Reg, const RegisterBank *RegBank) {
153+
if (RegBank)
154+
MRI.setRegBank(Reg, *RegBank);
155+
}
156+
146157
bool CombinerHelper::tryCombineCopy(MachineInstr &MI) {
147158
if (matchCombineCopy(MI)) {
148159
applyCombineCopy(MI);
@@ -1407,7 +1418,6 @@ bool CombinerHelper::optimizeMemcpy(MachineInstr &MI, Register Dst,
14071418

14081419
// Don't promote to an alignment that would require dynamic stack
14091420
// realignment.
1410-
const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
14111421
if (!TRI->hasStackRealignment(MF))
14121422
while (NewAlign > Alignment && DL.exceedsNaturalStackAlignment(NewAlign))
14131423
NewAlign = NewAlign / 2;
@@ -1512,7 +1522,6 @@ bool CombinerHelper::optimizeMemmove(MachineInstr &MI, Register Dst,
15121522

15131523
// Don't promote to an alignment that would require dynamic stack
15141524
// realignment.
1515-
const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
15161525
if (!TRI->hasStackRealignment(MF))
15171526
while (NewAlign > Alignment && DL.exceedsNaturalStackAlignment(NewAlign))
15181527
NewAlign = NewAlign / 2;
@@ -1710,7 +1719,7 @@ bool CombinerHelper::matchPtrAddImmedChain(MachineInstr &MI,
17101719
if (!MaybeImmVal)
17111720
return false;
17121721

1713-
MachineInstr *Add2Def = MRI.getUniqueVRegDef(Add2);
1722+
MachineInstr *Add2Def = MRI.getVRegDef(Add2);
17141723
if (!Add2Def || Add2Def->getOpcode() != TargetOpcode::G_PTR_ADD)
17151724
return false;
17161725

@@ -1751,6 +1760,7 @@ bool CombinerHelper::matchPtrAddImmedChain(MachineInstr &MI,
17511760
// Pass the combined immediate to the apply function.
17521761
MatchInfo.Imm = AMNew.BaseOffs;
17531762
MatchInfo.Base = Base;
1763+
MatchInfo.Bank = getRegBank(Imm2);
17541764
return true;
17551765
}
17561766

@@ -1760,6 +1770,7 @@ void CombinerHelper::applyPtrAddImmedChain(MachineInstr &MI,
17601770
MachineIRBuilder MIB(MI);
17611771
LLT OffsetTy = MRI.getType(MI.getOperand(2).getReg());
17621772
auto NewOffset = MIB.buildConstant(OffsetTy, MatchInfo.Imm);
1773+
setRegBank(NewOffset.getReg(0), MatchInfo.Bank);
17631774
Observer.changingInstr(MI);
17641775
MI.getOperand(1).setReg(MatchInfo.Base);
17651776
MI.getOperand(2).setReg(NewOffset.getReg(0));

llvm/lib/Target/AMDGPU/AMDGPUCombine.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ def AMDGPUPostLegalizerCombinerHelper: GICombinerHelper<
8383
}
8484

8585
def AMDGPURegBankCombinerHelper : GICombinerHelper<
86-
"AMDGPUGenRegBankCombinerHelper", [zext_trunc_fold, int_minmax_to_med3]> {
86+
"AMDGPUGenRegBankCombinerHelper", [zext_trunc_fold, int_minmax_to_med3, ptr_add_immed_chain]> {
8787
let DisableRuleOption = "amdgpuregbankcombiner-disable-rule";
8888
let StateClass = "AMDGPURegBankCombinerHelperState";
8989
let AdditionalArguments = [];

0 commit comments

Comments
 (0)