15
15
#include " llvm/CodeGen/GlobalISel/LegalizerInfo.h"
16
16
#include " llvm/CodeGen/GlobalISel/MIPatternMatch.h"
17
17
#include " llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
18
+ #include " llvm/CodeGen/GlobalISel/RegisterBankInfo.h"
18
19
#include " llvm/CodeGen/GlobalISel/Utils.h"
19
20
#include " llvm/CodeGen/LowLevelType.h"
20
21
#include " llvm/CodeGen/MachineBasicBlock.h"
@@ -46,8 +47,9 @@ CombinerHelper::CombinerHelper(GISelChangeObserver &Observer,
46
47
MachineIRBuilder &B, GISelKnownBits *KB,
47
48
MachineDominatorTree *MDT,
48
49
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()) {
51
53
(void )this ->KB ;
52
54
}
53
55
@@ -143,6 +145,15 @@ void CombinerHelper::replaceRegOpWith(MachineRegisterInfo &MRI,
143
145
Observer.changedInstr (*FromRegOp.getParent ());
144
146
}
145
147
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
+
146
157
bool CombinerHelper::tryCombineCopy (MachineInstr &MI) {
147
158
if (matchCombineCopy (MI)) {
148
159
applyCombineCopy (MI);
@@ -1407,7 +1418,6 @@ bool CombinerHelper::optimizeMemcpy(MachineInstr &MI, Register Dst,
1407
1418
1408
1419
// Don't promote to an alignment that would require dynamic stack
1409
1420
// realignment.
1410
- const TargetRegisterInfo *TRI = MF.getSubtarget ().getRegisterInfo ();
1411
1421
if (!TRI->hasStackRealignment (MF))
1412
1422
while (NewAlign > Alignment && DL.exceedsNaturalStackAlignment (NewAlign))
1413
1423
NewAlign = NewAlign / 2 ;
@@ -1512,7 +1522,6 @@ bool CombinerHelper::optimizeMemmove(MachineInstr &MI, Register Dst,
1512
1522
1513
1523
// Don't promote to an alignment that would require dynamic stack
1514
1524
// realignment.
1515
- const TargetRegisterInfo *TRI = MF.getSubtarget ().getRegisterInfo ();
1516
1525
if (!TRI->hasStackRealignment (MF))
1517
1526
while (NewAlign > Alignment && DL.exceedsNaturalStackAlignment (NewAlign))
1518
1527
NewAlign = NewAlign / 2 ;
@@ -1710,7 +1719,7 @@ bool CombinerHelper::matchPtrAddImmedChain(MachineInstr &MI,
1710
1719
if (!MaybeImmVal)
1711
1720
return false ;
1712
1721
1713
- MachineInstr *Add2Def = MRI.getUniqueVRegDef (Add2);
1722
+ MachineInstr *Add2Def = MRI.getVRegDef (Add2);
1714
1723
if (!Add2Def || Add2Def->getOpcode () != TargetOpcode::G_PTR_ADD)
1715
1724
return false ;
1716
1725
@@ -1751,6 +1760,7 @@ bool CombinerHelper::matchPtrAddImmedChain(MachineInstr &MI,
1751
1760
// Pass the combined immediate to the apply function.
1752
1761
MatchInfo.Imm = AMNew.BaseOffs ;
1753
1762
MatchInfo.Base = Base;
1763
+ MatchInfo.Bank = getRegBank (Imm2);
1754
1764
return true ;
1755
1765
}
1756
1766
@@ -1760,6 +1770,7 @@ void CombinerHelper::applyPtrAddImmedChain(MachineInstr &MI,
1760
1770
MachineIRBuilder MIB (MI);
1761
1771
LLT OffsetTy = MRI.getType (MI.getOperand (2 ).getReg ());
1762
1772
auto NewOffset = MIB.buildConstant (OffsetTy, MatchInfo.Imm );
1773
+ setRegBank (NewOffset.getReg (0 ), MatchInfo.Bank );
1763
1774
Observer.changingInstr (MI);
1764
1775
MI.getOperand (1 ).setReg (MatchInfo.Base );
1765
1776
MI.getOperand (2 ).setReg (NewOffset.getReg (0 ));
0 commit comments