diff options
| author | Jonas Paulsson <paulsson@linux.vnet.ibm.com> | 2019-12-17 10:17:59 -0800 |
|---|---|---|
| committer | Jonas Paulsson <paulsson@linux.vnet.ibm.com> | 2019-12-20 10:44:58 -0800 |
| commit | 9fcebad5e5c1530d6d63a2b3d137dd1473b3b615 (patch) | |
| tree | 757a609e880f1652fc88d869073f4a6438eb5544 /llvm/lib/Target/SystemZ | |
| parent | a805e0fb18ca3b85712a587b72e5048e78d8f1da (diff) | |
| download | bcm5719-llvm-9fcebad5e5c1530d6d63a2b3d137dd1473b3b615.tar.gz bcm5719-llvm-9fcebad5e5c1530d6d63a2b3d137dd1473b3b615.zip | |
[SystemZ] Add a mapping from "select register" to "load on condition" (2-addr).
The SELR(Mux) instructions can be converted to two-address form as LOCR(Mux)
instructions whenever one of the sources are the same reg as dest. By adding
this mapping in getTwoOperandOpcode(), we get:
- Two-address hints in getRegAllocationHints() for select register
instructions.
- No need anymore for special handling in SystemZShortenInst.cpp -
shortenSelect() removed.
The two-address hints are now added before the GRX32 hints, which should be
preferred.
Review: Ulrich Weigand
https://reviews.llvm.org/D68870
Diffstat (limited to 'llvm/lib/Target/SystemZ')
| -rw-r--r-- | llvm/lib/Target/SystemZ/SystemZInstrFormats.td | 15 | ||||
| -rw-r--r-- | llvm/lib/Target/SystemZ/SystemZInstrInfo.td | 4 | ||||
| -rw-r--r-- | llvm/lib/Target/SystemZ/SystemZRegisterInfo.cpp | 92 | ||||
| -rw-r--r-- | llvm/lib/Target/SystemZ/SystemZShortenInst.cpp | 30 |
4 files changed, 60 insertions, 81 deletions
diff --git a/llvm/lib/Target/SystemZ/SystemZInstrFormats.td b/llvm/lib/Target/SystemZ/SystemZInstrFormats.td index ba87ddb20f9..f064d33ac2f 100644 --- a/llvm/lib/Target/SystemZ/SystemZInstrFormats.td +++ b/llvm/lib/Target/SystemZ/SystemZInstrFormats.td @@ -3209,6 +3209,8 @@ class CondBinaryRRF<string mnemonic, bits<16> opcode, RegisterOperand cls1, let Constraints = "$R1 = $R1src"; let DisableEncoding = "$R1src"; let CCMaskLast = 1; + let NumOpsKey = !subst("loc", "sel", mnemonic); + let NumOpsValue = "2"; } // Like CondBinaryRRF, but used for the raw assembly form. The condition-code @@ -3248,6 +3250,8 @@ class CondBinaryRRFa<string mnemonic, bits<16> opcode, RegisterOperand cls1, [(set cls1:$R1, (z_select_ccmask cls2:$R2, cls3:$R3, cond4:$valid, cond4:$M4))]> { let CCMaskLast = 1; + let NumOpsKey = mnemonic; + let NumOpsValue = "3"; } // Like CondBinaryRRFa, but used for the raw assembly form. The condition-code @@ -4798,7 +4802,8 @@ class TestBinarySILPseudo<SDPatternOperator operator, ImmOpWithPattern imm> // Like CondBinaryRRF, but expanded after RA depending on the choice of // register. -class CondBinaryRRFPseudo<RegisterOperand cls1, RegisterOperand cls2> +class CondBinaryRRFPseudo<string mnemonic, RegisterOperand cls1, + RegisterOperand cls2> : Pseudo<(outs cls1:$R1), (ins cls1:$R1src, cls2:$R2, cond4:$valid, cond4:$M3), [(set cls1:$R1, (z_select_ccmask cls2:$R2, cls1:$R1src, @@ -4806,17 +4811,21 @@ class CondBinaryRRFPseudo<RegisterOperand cls1, RegisterOperand cls2> let Constraints = "$R1 = $R1src"; let DisableEncoding = "$R1src"; let CCMaskLast = 1; + let NumOpsKey = !subst("loc", "sel", mnemonic); + let NumOpsValue = "2"; } // Like CondBinaryRRFa, but expanded after RA depending on the choice of // register. -class CondBinaryRRFaPseudo<RegisterOperand cls1, RegisterOperand cls2, - RegisterOperand cls3> +class CondBinaryRRFaPseudo<string mnemonic, RegisterOperand cls1, + RegisterOperand cls2, RegisterOperand cls3> : Pseudo<(outs cls1:$R1), (ins cls3:$R3, cls2:$R2, cond4:$valid, cond4:$M4), [(set cls1:$R1, (z_select_ccmask cls2:$R2, cls3:$R3, cond4:$valid, cond4:$M4))]> { let CCMaskLast = 1; + let NumOpsKey = mnemonic; + let NumOpsValue = "3"; } // Like CondBinaryRIE, but expanded after RA depending on the choice of diff --git a/llvm/lib/Target/SystemZ/SystemZInstrInfo.td b/llvm/lib/Target/SystemZ/SystemZInstrInfo.td index aa981e718b5..9579dcc0d1b 100644 --- a/llvm/lib/Target/SystemZ/SystemZInstrInfo.td +++ b/llvm/lib/Target/SystemZ/SystemZInstrInfo.td @@ -492,7 +492,7 @@ let Predicates = [FeatureMiscellaneousExtensions3], Uses = [CC] in { let isCommutable = 1 in { // Expands to SELR or SELFHR or a branch-and-move sequence, // depending on the choice of registers. - def SELRMux : CondBinaryRRFaPseudo<GRX32, GRX32, GRX32>; + def SELRMux : CondBinaryRRFaPseudo<"selrmux", GRX32, GRX32, GRX32>; defm SELFHR : CondBinaryRRFaPair<"selfhr", 0xB9C0, GRH32, GRH32, GRH32>; defm SELR : CondBinaryRRFaPair<"selr", 0xB9F0, GR32, GR32, GR32>; defm SELGR : CondBinaryRRFaPair<"selgr", 0xB9E3, GR64, GR64, GR64>; @@ -525,7 +525,7 @@ let Predicates = [FeatureLoadStoreOnCond2], Uses = [CC] in { let isCommutable = 1 in { // Expands to LOCR or LOCFHR or a branch-and-move sequence, // depending on the choice of registers. - def LOCRMux : CondBinaryRRFPseudo<GRX32, GRX32>; + def LOCRMux : CondBinaryRRFPseudo<"locrmux", GRX32, GRX32>; defm LOCFHR : CondBinaryRRFPair<"locfhr", 0xB9E0, GRH32, GRH32>; } diff --git a/llvm/lib/Target/SystemZ/SystemZRegisterInfo.cpp b/llvm/lib/Target/SystemZ/SystemZRegisterInfo.cpp index cbcfc07f2b1..0d5e7af9252 100644 --- a/llvm/lib/Target/SystemZ/SystemZRegisterInfo.cpp +++ b/llvm/lib/Target/SystemZ/SystemZRegisterInfo.cpp @@ -87,6 +87,52 @@ SystemZRegisterInfo::getRegAllocationHints(unsigned VirtReg, bool BaseImplRetVal = TargetRegisterInfo::getRegAllocationHints( VirtReg, Order, Hints, MF, VRM, Matrix); + if (VRM != nullptr) { + // Add any two address hints after any copy hints. + SmallSet<unsigned, 4> TwoAddrHints; + for (auto &Use : MRI->reg_nodbg_instructions(VirtReg)) + if (SystemZ::getTwoOperandOpcode(Use.getOpcode()) != -1) { + const MachineOperand *VRRegMO = nullptr; + const MachineOperand *OtherMO = nullptr; + const MachineOperand *CommuMO = nullptr; + if (VirtReg == Use.getOperand(0).getReg()) { + VRRegMO = &Use.getOperand(0); + OtherMO = &Use.getOperand(1); + if (Use.isCommutable()) + CommuMO = &Use.getOperand(2); + } else if (VirtReg == Use.getOperand(1).getReg()) { + VRRegMO = &Use.getOperand(1); + OtherMO = &Use.getOperand(0); + } else if (VirtReg == Use.getOperand(2).getReg() && + Use.isCommutable()) { + VRRegMO = &Use.getOperand(2); + OtherMO = &Use.getOperand(0); + } else + continue; + + auto tryAddHint = [&](const MachineOperand *MO) -> void { + Register Reg = MO->getReg(); + Register PhysReg = + Register::isPhysicalRegister(Reg) ? Reg : VRM->getPhys(Reg); + if (PhysReg) { + if (MO->getSubReg()) + PhysReg = getSubReg(PhysReg, MO->getSubReg()); + if (VRRegMO->getSubReg()) + PhysReg = getMatchingSuperReg(PhysReg, VRRegMO->getSubReg(), + MRI->getRegClass(VirtReg)); + if (!MRI->isReserved(PhysReg) && !is_contained(Hints, PhysReg)) + TwoAddrHints.insert(PhysReg); + } + }; + tryAddHint(OtherMO); + if (CommuMO) + tryAddHint(CommuMO); + } + for (MCPhysReg OrderReg : Order) + if (TwoAddrHints.count(OrderReg)) + Hints.push_back(OrderReg); + } + if (MRI->getRegClass(VirtReg) == &SystemZ::GRX32BitRegClass) { SmallVector<unsigned, 8> Worklist; SmallSet<unsigned, 4> DoneRegs; @@ -143,52 +189,6 @@ SystemZRegisterInfo::getRegAllocationHints(unsigned VirtReg, } } - if (VRM == nullptr) - return BaseImplRetVal; - - // Add any two address hints after any copy hints. - SmallSet<unsigned, 4> TwoAddrHints; - for (auto &Use : MRI->reg_nodbg_instructions(VirtReg)) - if (SystemZ::getTwoOperandOpcode(Use.getOpcode()) != -1) { - const MachineOperand *VRRegMO = nullptr; - const MachineOperand *OtherMO = nullptr; - const MachineOperand *CommuMO = nullptr; - if (VirtReg == Use.getOperand(0).getReg()) { - VRRegMO = &Use.getOperand(0); - OtherMO = &Use.getOperand(1); - if (Use.isCommutable()) - CommuMO = &Use.getOperand(2); - } else if (VirtReg == Use.getOperand(1).getReg()) { - VRRegMO = &Use.getOperand(1); - OtherMO = &Use.getOperand(0); - } else if (VirtReg == Use.getOperand(2).getReg() && Use.isCommutable()) { - VRRegMO = &Use.getOperand(2); - OtherMO = &Use.getOperand(0); - } else - continue; - - auto tryAddHint = [&](const MachineOperand *MO) -> void { - Register Reg = MO->getReg(); - Register PhysReg = - Register::isPhysicalRegister(Reg) ? Reg : VRM->getPhys(Reg); - if (PhysReg) { - if (MO->getSubReg()) - PhysReg = getSubReg(PhysReg, MO->getSubReg()); - if (VRRegMO->getSubReg()) - PhysReg = getMatchingSuperReg(PhysReg, VRRegMO->getSubReg(), - MRI->getRegClass(VirtReg)); - if (!MRI->isReserved(PhysReg) && !is_contained(Hints, PhysReg)) - TwoAddrHints.insert(PhysReg); - } - }; - tryAddHint(OtherMO); - if (CommuMO) - tryAddHint(CommuMO); - } - for (MCPhysReg OrderReg : Order) - if (TwoAddrHints.count(OrderReg)) - Hints.push_back(OrderReg); - return BaseImplRetVal; } diff --git a/llvm/lib/Target/SystemZ/SystemZShortenInst.cpp b/llvm/lib/Target/SystemZ/SystemZShortenInst.cpp index 1b9c8ea2759..f6184cec795 100644 --- a/llvm/lib/Target/SystemZ/SystemZShortenInst.cpp +++ b/llvm/lib/Target/SystemZ/SystemZShortenInst.cpp @@ -46,7 +46,6 @@ private: bool shortenOn001(MachineInstr &MI, unsigned Opcode); bool shortenOn001AddCC(MachineInstr &MI, unsigned Opcode); bool shortenFPConv(MachineInstr &MI, unsigned Opcode); - bool shortenSelect(MachineInstr &MI, unsigned Opcode); const SystemZInstrInfo *TII; const TargetRegisterInfo *TRI; @@ -176,23 +175,6 @@ bool SystemZShortenInst::shortenFPConv(MachineInstr &MI, unsigned Opcode) { return false; } -// MI is a three-operand select instruction. If one of the sources match -// the destination, convert to the equivalent load-on-condition. -bool SystemZShortenInst::shortenSelect(MachineInstr &MI, unsigned Opcode) { - if (MI.getOperand(0).getReg() == MI.getOperand(1).getReg()) { - MI.setDesc(TII->get(Opcode)); - MI.tieOperands(0, 1); - return true; - } - if (MI.getOperand(0).getReg() == MI.getOperand(2).getReg()) { - TII->commuteInstruction(MI, false, 1, 2); - MI.setDesc(TII->get(Opcode)); - MI.tieOperands(0, 1); - return true; - } - return false; -} - // Process all instructions in MBB. Return true if something changed. bool SystemZShortenInst::processBlock(MachineBasicBlock &MBB) { bool Changed = false; @@ -213,18 +195,6 @@ bool SystemZShortenInst::processBlock(MachineBasicBlock &MBB) { Changed |= shortenIIF(MI, SystemZ::LLIHL, SystemZ::LLIHH); break; - case SystemZ::SELR: - Changed |= shortenSelect(MI, SystemZ::LOCR); - break; - - case SystemZ::SELFHR: - Changed |= shortenSelect(MI, SystemZ::LOCFHR); - break; - - case SystemZ::SELGR: - Changed |= shortenSelect(MI, SystemZ::LOCGR); - break; - case SystemZ::WFADB: Changed |= shortenOn001AddCC(MI, SystemZ::ADBR); break; |

