1 //===- HexagonGenMux.cpp --------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // During instruction selection, MUX instructions are generated for
10 // conditional assignments. Since such assignments often present an
11 // opportunity to predicate instructions, HexagonExpandCondsets
12 // expands MUXes into pairs of conditional transfers, and then proceeds
13 // with predication of the producers/consumers of the registers involved.
14 // This happens after exiting from the SSA form, but before the machine
15 // instruction scheduler. After the scheduler and after the register
16 // allocation there can be cases of pairs of conditional transfers
17 // resulting from a MUX where neither of them was further predicated. If
18 // these transfers are now placed far enough from the instruction defining
19 // the predicate register, they cannot use the .new form. In such cases it
20 // is better to collapse them back to a single MUX instruction.
22 #define DEBUG_TYPE "hexmux"
24 #include "HexagonInstrInfo.h"
25 #include "HexagonRegisterInfo.h"
26 #include "HexagonSubtarget.h"
27 #include "llvm/ADT/BitVector.h"
28 #include "llvm/ADT/DenseMap.h"
29 #include "llvm/ADT/SmallVector.h"
30 #include "llvm/ADT/StringRef.h"
31 #include "llvm/CodeGen/LivePhysRegs.h"
32 #include "llvm/CodeGen/MachineBasicBlock.h"
33 #include "llvm/CodeGen/MachineFunction.h"
34 #include "llvm/CodeGen/MachineFunctionPass.h"
35 #include "llvm/CodeGen/MachineInstr.h"
36 #include "llvm/CodeGen/MachineInstrBuilder.h"
37 #include "llvm/CodeGen/MachineOperand.h"
38 #include "llvm/IR/DebugLoc.h"
39 #include "llvm/MC/MCInstrDesc.h"
40 #include "llvm/MC/MCRegisterInfo.h"
41 #include "llvm/Pass.h"
42 #include "llvm/Support/CommandLine.h"
43 #include "llvm/Support/MathExtras.h"
54 FunctionPass
*createHexagonGenMux();
55 void initializeHexagonGenMuxPass(PassRegistry
& Registry
);
57 } // end namespace llvm
59 // Initialize this to 0 to always prefer generating mux by default.
60 static cl::opt
<unsigned> MinPredDist("hexagon-gen-mux-threshold", cl::Hidden
,
61 cl::init(0), cl::desc("Minimum distance between predicate definition and "
62 "farther of the two predicated uses"));
66 class HexagonGenMux
: public MachineFunctionPass
{
70 HexagonGenMux() : MachineFunctionPass(ID
) {}
72 StringRef
getPassName() const override
{
73 return "Hexagon generate mux instructions";
76 void getAnalysisUsage(AnalysisUsage
&AU
) const override
{
77 MachineFunctionPass::getAnalysisUsage(AU
);
80 bool runOnMachineFunction(MachineFunction
&MF
) override
;
82 MachineFunctionProperties
getRequiredProperties() const override
{
83 return MachineFunctionProperties().set(
84 MachineFunctionProperties::Property::NoVRegs
);
88 const HexagonInstrInfo
*HII
= nullptr;
89 const HexagonRegisterInfo
*HRI
= nullptr;
93 unsigned TrueX
= std::numeric_limits
<unsigned>::max();
94 unsigned FalseX
= std::numeric_limits
<unsigned>::max();
96 CondsetInfo() = default;
100 BitVector Defs
, Uses
;
102 DefUseInfo() = default;
103 DefUseInfo(const BitVector
&D
, const BitVector
&U
) : Defs(D
), Uses(U
) {}
107 MachineBasicBlock::iterator At
;
108 unsigned DefR
, PredR
;
109 MachineOperand
*SrcT
, *SrcF
;
110 MachineInstr
*Def1
, *Def2
;
112 MuxInfo(MachineBasicBlock::iterator It
, unsigned DR
, unsigned PR
,
113 MachineOperand
*TOp
, MachineOperand
*FOp
, MachineInstr
&D1
,
115 : At(It
), DefR(DR
), PredR(PR
), SrcT(TOp
), SrcF(FOp
), Def1(&D1
),
119 using InstrIndexMap
= DenseMap
<MachineInstr
*, unsigned>;
120 using DefUseInfoMap
= DenseMap
<unsigned, DefUseInfo
>;
121 using MuxInfoList
= SmallVector
<MuxInfo
, 4>;
123 bool isRegPair(unsigned Reg
) const {
124 return Hexagon::DoubleRegsRegClass
.contains(Reg
);
127 void getSubRegs(unsigned Reg
, BitVector
&SRs
) const;
128 void expandReg(unsigned Reg
, BitVector
&Set
) const;
129 void getDefsUses(const MachineInstr
*MI
, BitVector
&Defs
,
130 BitVector
&Uses
) const;
131 void buildMaps(MachineBasicBlock
&B
, InstrIndexMap
&I2X
,
133 bool isCondTransfer(unsigned Opc
) const;
134 unsigned getMuxOpcode(const MachineOperand
&Src1
,
135 const MachineOperand
&Src2
) const;
136 bool genMuxInBlock(MachineBasicBlock
&B
);
139 } // end anonymous namespace
141 char HexagonGenMux::ID
= 0;
143 INITIALIZE_PASS(HexagonGenMux
, "hexagon-gen-mux",
144 "Hexagon generate mux instructions", false, false)
146 void HexagonGenMux::getSubRegs(unsigned Reg
, BitVector
&SRs
) const {
147 for (MCSubRegIterator
I(Reg
, HRI
); I
.isValid(); ++I
)
151 void HexagonGenMux::expandReg(unsigned Reg
, BitVector
&Set
) const {
153 getSubRegs(Reg
, Set
);
158 void HexagonGenMux::getDefsUses(const MachineInstr
*MI
, BitVector
&Defs
,
159 BitVector
&Uses
) const {
160 // First, get the implicit defs and uses for this instruction.
161 unsigned Opc
= MI
->getOpcode();
162 const MCInstrDesc
&D
= HII
->get(Opc
);
163 if (const MCPhysReg
*R
= D
.ImplicitDefs
)
165 expandReg(*R
++, Defs
);
166 if (const MCPhysReg
*R
= D
.ImplicitUses
)
168 expandReg(*R
++, Uses
);
170 // Look over all operands, and collect explicit defs and uses.
171 for (const MachineOperand
&MO
: MI
->operands()) {
172 if (!MO
.isReg() || MO
.isImplicit())
174 Register R
= MO
.getReg();
175 BitVector
&Set
= MO
.isDef() ? Defs
: Uses
;
180 void HexagonGenMux::buildMaps(MachineBasicBlock
&B
, InstrIndexMap
&I2X
,
181 DefUseInfoMap
&DUM
) {
183 unsigned NR
= HRI
->getNumRegs();
184 BitVector
Defs(NR
), Uses(NR
);
186 for (MachineBasicBlock::iterator I
= B
.begin(), E
= B
.end(); I
!= E
; ++I
) {
187 MachineInstr
*MI
= &*I
;
188 I2X
.insert(std::make_pair(MI
, Index
));
191 getDefsUses(MI
, Defs
, Uses
);
192 DUM
.insert(std::make_pair(Index
, DefUseInfo(Defs
, Uses
)));
197 bool HexagonGenMux::isCondTransfer(unsigned Opc
) const {
199 case Hexagon::A2_tfrt
:
200 case Hexagon::A2_tfrf
:
201 case Hexagon::C2_cmoveit
:
202 case Hexagon::C2_cmoveif
:
208 unsigned HexagonGenMux::getMuxOpcode(const MachineOperand
&Src1
,
209 const MachineOperand
&Src2
) const {
210 bool IsReg1
= Src1
.isReg(), IsReg2
= Src2
.isReg();
212 return IsReg2
? Hexagon::C2_mux
: Hexagon::C2_muxir
;
214 return Hexagon::C2_muxri
;
216 // Neither is a register. The first source is extendable, but the second
218 if (Src2
.isImm() && isInt
<8>(Src2
.getImm()))
219 return Hexagon::C2_muxii
;
224 bool HexagonGenMux::genMuxInBlock(MachineBasicBlock
&B
) {
225 bool Changed
= false;
228 buildMaps(B
, I2X
, DUM
);
230 using CondsetMap
= DenseMap
<unsigned, CondsetInfo
>;
235 MachineBasicBlock::iterator NextI
, End
= B
.end();
236 for (MachineBasicBlock::iterator I
= B
.begin(); I
!= End
; I
= NextI
) {
237 MachineInstr
*MI
= &*I
;
238 NextI
= std::next(I
);
239 unsigned Opc
= MI
->getOpcode();
240 if (!isCondTransfer(Opc
))
242 Register DR
= MI
->getOperand(0).getReg();
245 MachineOperand
&PredOp
= MI
->getOperand(1);
246 if (PredOp
.isUndef())
249 Register PR
= PredOp
.getReg();
250 unsigned Idx
= I2X
.lookup(MI
);
251 CondsetMap::iterator F
= CM
.find(DR
);
252 bool IfTrue
= HII
->isPredicatedTrue(Opc
);
254 // If there is no record of a conditional transfer for this register,
255 // or the predicate register differs, create a new record for it.
256 if (F
!= CM
.end() && F
->second
.PredR
!= PR
) {
261 auto It
= CM
.insert(std::make_pair(DR
, CondsetInfo()));
263 F
->second
.PredR
= PR
;
265 CondsetInfo
&CI
= F
->second
;
270 if (CI
.TrueX
== std::numeric_limits
<unsigned>::max() ||
271 CI
.FalseX
== std::numeric_limits
<unsigned>::max())
274 // There is now a complete definition of DR, i.e. we have the predicate
275 // register, the definition if-true, and definition if-false.
277 // First, check if the definitions are far enough from the definition
278 // of the predicate register.
279 unsigned MinX
= std::min(CI
.TrueX
, CI
.FalseX
);
280 unsigned MaxX
= std::max(CI
.TrueX
, CI
.FalseX
);
281 // Specifically, check if the predicate definition is within a prescribed
282 // distance from the farther of the two predicated instructions.
283 unsigned SearchX
= (MaxX
>= MinPredDist
) ? MaxX
-MinPredDist
: 0;
284 bool NearDef
= false;
285 for (unsigned X
= SearchX
; X
< MaxX
; ++X
) {
286 const DefUseInfo
&DU
= DUM
.lookup(X
);
295 // The predicate register is not defined in the last few instructions.
296 // Check if the conversion to MUX is possible (either "up", i.e. at the
297 // place of the earlier partial definition, or "down", where the later
298 // definition is located). Examine all defs and uses between these two
300 // SR1, SR2 - source registers from the first and the second definition.
301 MachineBasicBlock::iterator It1
= B
.begin(), It2
= B
.begin();
302 std::advance(It1
, MinX
);
303 std::advance(It2
, MaxX
);
304 MachineInstr
&Def1
= *It1
, &Def2
= *It2
;
305 MachineOperand
*Src1
= &Def1
.getOperand(2), *Src2
= &Def2
.getOperand(2);
306 Register SR1
= Src1
->isReg() ? Src1
->getReg() : Register();
307 Register SR2
= Src2
->isReg() ? Src2
->getReg() : Register();
308 bool Failure
= false, CanUp
= true, CanDown
= true;
309 for (unsigned X
= MinX
+1; X
< MaxX
; X
++) {
310 const DefUseInfo
&DU
= DUM
.lookup(X
);
311 if (DU
.Defs
[PR
] || DU
.Defs
[DR
] || DU
.Uses
[DR
]) {
315 if (CanDown
&& DU
.Defs
[SR1
])
317 if (CanUp
&& DU
.Defs
[SR2
])
320 if (Failure
|| (!CanUp
&& !CanDown
))
323 MachineOperand
*SrcT
= (MinX
== CI
.TrueX
) ? Src1
: Src2
;
324 MachineOperand
*SrcF
= (MinX
== CI
.FalseX
) ? Src1
: Src2
;
325 // Prefer "down", since this will move the MUX farther away from the
326 // predicate definition.
327 MachineBasicBlock::iterator At
= CanDown
? Def2
: Def1
;
328 ML
.push_back(MuxInfo(At
, DR
, PR
, SrcT
, SrcF
, Def1
, Def2
));
331 for (MuxInfo
&MX
: ML
) {
332 unsigned MxOpc
= getMuxOpcode(*MX
.SrcT
, *MX
.SrcF
);
335 MachineBasicBlock
&B
= *MX
.At
->getParent();
336 const DebugLoc
&DL
= B
.findDebugLoc(MX
.At
);
337 auto NewMux
= BuildMI(B
, MX
.At
, DL
, HII
->get(MxOpc
), MX
.DefR
)
341 NewMux
->clearKillInfo();
347 // Fix up kill flags.
349 LivePhysRegs
LPR(*HRI
);
351 auto IsLive
= [&LPR
,this] (unsigned Reg
) -> bool {
352 for (MCSubRegIterator
S(Reg
, HRI
, true); S
.isValid(); ++S
)
353 if (LPR
.contains(*S
))
357 for (auto I
= B
.rbegin(), E
= B
.rend(); I
!= E
; ++I
) {
358 if (I
->isDebugInstr())
360 // This isn't 100% accurate, but it's safe.
361 // It won't detect (as a kill) a case like this
362 // r0 = add r0, 1 <-- r0 should be "killed"
364 for (MachineOperand
&Op
: I
->operands()) {
365 if (!Op
.isReg() || !Op
.isUse())
367 assert(Op
.getSubReg() == 0 && "Should have physical registers only");
368 bool Live
= IsLive(Op
.getReg());
371 LPR
.stepBackward(*I
);
377 bool HexagonGenMux::runOnMachineFunction(MachineFunction
&MF
) {
378 if (skipFunction(MF
.getFunction()))
380 HII
= MF
.getSubtarget
<HexagonSubtarget
>().getInstrInfo();
381 HRI
= MF
.getSubtarget
<HexagonSubtarget
>().getRegisterInfo();
382 bool Changed
= false;
384 Changed
|= genMuxInBlock(I
);
388 FunctionPass
*llvm::createHexagonGenMux() {
389 return new HexagonGenMux();