1 //===- HexagonExpandCondsets.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 // Replace mux instructions with the corresponding legal instructions.
10 // It is meant to work post-SSA, but still on virtual registers. It was
11 // originally placed between register coalescing and machine instruction
13 // In this place in the optimization sequence, live interval analysis had
14 // been performed, and the live intervals should be preserved. A large part
15 // of the code deals with preserving the liveness information.
17 // Liveness tracking aside, the main functionality of this pass is divided
18 // into two steps. The first step is to replace an instruction
19 // %0 = C2_mux %1, %2, %3
20 // with a pair of conditional transfers
21 // %0 = A2_tfrt %1, %2
22 // %0 = A2_tfrf %1, %3
23 // It is the intention that the execution of this pass could be terminated
24 // after this step, and the code generated would be functionally correct.
26 // If the uses of the source values %1 and %2 are kills, and their
27 // definitions are predicable, then in the second step, the conditional
28 // transfers will then be rewritten as predicated instructions. E.g.
30 // %3 = A2_tfrt %99, killed %0
31 // will be rewritten as
32 // %3 = A2_port %99, %1, %2
34 // This replacement has two variants: "up" and "down". Consider this case:
36 // ... [intervening instructions] ...
37 // %3 = A2_tfrt %99, killed %0
39 // %3 = A2_port %99, %1, %2
40 // ... [intervening instructions, %0->vreg3] ...
44 // ... [intervening instructions] ...
45 // %3 = A2_port %99, %1, %2
47 // Both, one or none of these variants may be valid, and checks are made
48 // to rule out inapplicable variants.
50 // As an additional optimization, before either of the two steps above is
51 // executed, the pass attempts to coalesce the target register with one of
52 // the source registers, e.g. given an instruction
53 // %3 = C2_mux %0, %1, %2
54 // %3 will be coalesced with either %1 or %2. If this succeeds,
55 // the instruction would then be (for example)
56 // %3 = C2_mux %0, %3, %2
57 // and, under certain circumstances, this could result in only one predicated
59 // %3 = A2_tfrf %0, %2
62 // Splitting a definition of a register into two predicated transfers
63 // creates a complication in liveness tracking. Live interval computation
64 // will see both instructions as actual definitions, and will mark the
65 // first one as dead. The definition is not actually dead, and this
66 // situation will need to be fixed. For example:
67 // dead %1 = A2_tfrt ... ; marked as dead
70 // Since any of the individual predicated transfers may end up getting
71 // removed (in case it is an identity copy), some pre-existing def may
72 // be marked as dead after live interval recomputation:
73 // dead %1 = ... ; marked as dead
75 // %1 = A2_tfrf ... ; if A2_tfrt is removed
76 // This case happens if %1 was used as a source in A2_tfrt, which means
77 // that is it actually live at the A2_tfrf, and so the now dead definition
78 // of %1 will need to be updated to non-dead at some point.
80 // This issue could be remedied by adding implicit uses to the predicated
81 // transfers, but this will create a problem with subsequent predication,
82 // since the transfers will no longer be possible to reorder. To avoid
83 // that, the initial splitting will not add any implicit uses. These
84 // implicit uses will be added later, after predication. The extra price,
85 // however, is that finding the locations where the implicit uses need
86 // to be added, and updating the live ranges will be more involved.
88 #include "HexagonInstrInfo.h"
89 #include "HexagonRegisterInfo.h"
90 #include "llvm/ADT/DenseMap.h"
91 #include "llvm/ADT/SetVector.h"
92 #include "llvm/ADT/SmallVector.h"
93 #include "llvm/ADT/StringRef.h"
94 #include "llvm/CodeGen/LiveInterval.h"
95 #include "llvm/CodeGen/LiveIntervals.h"
96 #include "llvm/CodeGen/MachineBasicBlock.h"
97 #include "llvm/CodeGen/MachineDominators.h"
98 #include "llvm/CodeGen/MachineFunction.h"
99 #include "llvm/CodeGen/MachineFunctionPass.h"
100 #include "llvm/CodeGen/MachineInstr.h"
101 #include "llvm/CodeGen/MachineInstrBuilder.h"
102 #include "llvm/CodeGen/MachineOperand.h"
103 #include "llvm/CodeGen/MachineRegisterInfo.h"
104 #include "llvm/CodeGen/SlotIndexes.h"
105 #include "llvm/CodeGen/TargetRegisterInfo.h"
106 #include "llvm/CodeGen/TargetSubtargetInfo.h"
107 #include "llvm/IR/DebugLoc.h"
108 #include "llvm/IR/Function.h"
109 #include "llvm/MC/LaneBitmask.h"
110 #include "llvm/Pass.h"
111 #include "llvm/Support/CommandLine.h"
112 #include "llvm/Support/Debug.h"
113 #include "llvm/Support/ErrorHandling.h"
114 #include "llvm/Support/raw_ostream.h"
120 #define DEBUG_TYPE "expand-condsets"
122 using namespace llvm
;
124 static cl::opt
<unsigned> OptTfrLimit("expand-condsets-tfr-limit",
125 cl::init(~0U), cl::Hidden
, cl::desc("Max number of mux expansions"));
126 static cl::opt
<unsigned> OptCoaLimit("expand-condsets-coa-limit",
127 cl::init(~0U), cl::Hidden
, cl::desc("Max number of segment coalescings"));
131 void initializeHexagonExpandCondsetsPass(PassRegistry
&);
132 FunctionPass
*createHexagonExpandCondsets();
134 } // end namespace llvm
138 class HexagonExpandCondsets
: public MachineFunctionPass
{
142 HexagonExpandCondsets() : MachineFunctionPass(ID
) {
143 if (OptCoaLimit
.getPosition())
144 CoaLimitActive
= true, CoaLimit
= OptCoaLimit
;
145 if (OptTfrLimit
.getPosition())
146 TfrLimitActive
= true, TfrLimit
= OptTfrLimit
;
147 initializeHexagonExpandCondsetsPass(*PassRegistry::getPassRegistry());
150 StringRef
getPassName() const override
{ return "Hexagon Expand Condsets"; }
152 void getAnalysisUsage(AnalysisUsage
&AU
) const override
{
153 AU
.addRequired
<LiveIntervals
>();
154 AU
.addPreserved
<LiveIntervals
>();
155 AU
.addPreserved
<SlotIndexes
>();
156 AU
.addRequired
<MachineDominatorTree
>();
157 AU
.addPreserved
<MachineDominatorTree
>();
158 MachineFunctionPass::getAnalysisUsage(AU
);
161 bool runOnMachineFunction(MachineFunction
&MF
) override
;
164 const HexagonInstrInfo
*HII
= nullptr;
165 const TargetRegisterInfo
*TRI
= nullptr;
166 MachineDominatorTree
*MDT
;
167 MachineRegisterInfo
*MRI
= nullptr;
168 LiveIntervals
*LIS
= nullptr;
169 bool CoaLimitActive
= false;
170 bool TfrLimitActive
= false;
173 unsigned CoaCounter
= 0;
174 unsigned TfrCounter
= 0;
177 RegisterRef(const MachineOperand
&Op
) : Reg(Op
.getReg()),
178 Sub(Op
.getSubReg()) {}
179 RegisterRef(unsigned R
= 0, unsigned S
= 0) : Reg(R
), Sub(S
) {}
181 bool operator== (RegisterRef RR
) const {
182 return Reg
== RR
.Reg
&& Sub
== RR
.Sub
;
184 bool operator!= (RegisterRef RR
) const { return !operator==(RR
); }
185 bool operator< (RegisterRef RR
) const {
186 return Reg
< RR
.Reg
|| (Reg
== RR
.Reg
&& Sub
< RR
.Sub
);
192 using ReferenceMap
= DenseMap
<unsigned, unsigned>;
193 enum { Sub_Low
= 0x1, Sub_High
= 0x2, Sub_None
= (Sub_Low
| Sub_High
) };
194 enum { Exec_Then
= 0x10, Exec_Else
= 0x20 };
196 unsigned getMaskForSub(unsigned Sub
);
197 bool isCondset(const MachineInstr
&MI
);
198 LaneBitmask
getLaneMask(unsigned Reg
, unsigned Sub
);
200 void addRefToMap(RegisterRef RR
, ReferenceMap
&Map
, unsigned Exec
);
201 bool isRefInMap(RegisterRef
, ReferenceMap
&Map
, unsigned Exec
);
203 void updateDeadsInRange(unsigned Reg
, LaneBitmask LM
, LiveRange
&Range
);
204 void updateKillFlags(unsigned Reg
);
205 void updateDeadFlags(unsigned Reg
);
206 void recalculateLiveInterval(unsigned Reg
);
207 void removeInstr(MachineInstr
&MI
);
208 void updateLiveness(std::set
<unsigned> &RegSet
, bool Recalc
,
209 bool UpdateKills
, bool UpdateDeads
);
211 unsigned getCondTfrOpcode(const MachineOperand
&SO
, bool Cond
);
212 MachineInstr
*genCondTfrFor(MachineOperand
&SrcOp
,
213 MachineBasicBlock::iterator At
, unsigned DstR
,
214 unsigned DstSR
, const MachineOperand
&PredOp
, bool PredSense
,
215 bool ReadUndef
, bool ImpUse
);
216 bool split(MachineInstr
&MI
, std::set
<unsigned> &UpdRegs
);
218 bool isPredicable(MachineInstr
*MI
);
219 MachineInstr
*getReachingDefForPred(RegisterRef RD
,
220 MachineBasicBlock::iterator UseIt
, unsigned PredR
, bool Cond
);
221 bool canMoveOver(MachineInstr
&MI
, ReferenceMap
&Defs
, ReferenceMap
&Uses
);
222 bool canMoveMemTo(MachineInstr
&MI
, MachineInstr
&ToI
, bool IsDown
);
223 void predicateAt(const MachineOperand
&DefOp
, MachineInstr
&MI
,
224 MachineBasicBlock::iterator Where
,
225 const MachineOperand
&PredOp
, bool Cond
,
226 std::set
<unsigned> &UpdRegs
);
227 void renameInRange(RegisterRef RO
, RegisterRef RN
, unsigned PredR
,
228 bool Cond
, MachineBasicBlock::iterator First
,
229 MachineBasicBlock::iterator Last
);
230 bool predicate(MachineInstr
&TfrI
, bool Cond
, std::set
<unsigned> &UpdRegs
);
231 bool predicateInBlock(MachineBasicBlock
&B
,
232 std::set
<unsigned> &UpdRegs
);
234 bool isIntReg(RegisterRef RR
, unsigned &BW
);
235 bool isIntraBlocks(LiveInterval
&LI
);
236 bool coalesceRegisters(RegisterRef R1
, RegisterRef R2
);
237 bool coalesceSegments(const SmallVectorImpl
<MachineInstr
*> &Condsets
,
238 std::set
<unsigned> &UpdRegs
);
241 } // end anonymous namespace
243 char HexagonExpandCondsets::ID
= 0;
247 char &HexagonExpandCondsetsID
= HexagonExpandCondsets::ID
;
249 } // end namespace llvm
251 INITIALIZE_PASS_BEGIN(HexagonExpandCondsets
, "expand-condsets",
252 "Hexagon Expand Condsets", false, false)
253 INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree
)
254 INITIALIZE_PASS_DEPENDENCY(SlotIndexes
)
255 INITIALIZE_PASS_DEPENDENCY(LiveIntervals
)
256 INITIALIZE_PASS_END(HexagonExpandCondsets
, "expand-condsets",
257 "Hexagon Expand Condsets", false, false)
259 unsigned HexagonExpandCondsets::getMaskForSub(unsigned Sub
) {
261 case Hexagon::isub_lo
:
262 case Hexagon::vsub_lo
:
264 case Hexagon::isub_hi
:
265 case Hexagon::vsub_hi
:
267 case Hexagon::NoSubRegister
:
270 llvm_unreachable("Invalid subregister");
273 bool HexagonExpandCondsets::isCondset(const MachineInstr
&MI
) {
274 unsigned Opc
= MI
.getOpcode();
276 case Hexagon::C2_mux
:
277 case Hexagon::C2_muxii
:
278 case Hexagon::C2_muxir
:
279 case Hexagon::C2_muxri
:
280 case Hexagon::PS_pselect
:
287 LaneBitmask
HexagonExpandCondsets::getLaneMask(unsigned Reg
, unsigned Sub
) {
288 assert(Register::isVirtualRegister(Reg
));
289 return Sub
!= 0 ? TRI
->getSubRegIndexLaneMask(Sub
)
290 : MRI
->getMaxLaneMaskForVReg(Reg
);
293 void HexagonExpandCondsets::addRefToMap(RegisterRef RR
, ReferenceMap
&Map
,
295 unsigned Mask
= getMaskForSub(RR
.Sub
) | Exec
;
296 ReferenceMap::iterator F
= Map
.find(RR
.Reg
);
298 Map
.insert(std::make_pair(RR
.Reg
, Mask
));
303 bool HexagonExpandCondsets::isRefInMap(RegisterRef RR
, ReferenceMap
&Map
,
305 ReferenceMap::iterator F
= Map
.find(RR
.Reg
);
308 unsigned Mask
= getMaskForSub(RR
.Sub
) | Exec
;
309 if (Mask
& F
->second
)
314 void HexagonExpandCondsets::updateKillFlags(unsigned Reg
) {
315 auto KillAt
= [this,Reg
] (SlotIndex K
, LaneBitmask LM
) -> void {
316 // Set the <kill> flag on a use of Reg whose lane mask is contained in LM.
317 MachineInstr
*MI
= LIS
->getInstructionFromIndex(K
);
318 for (unsigned i
= 0, e
= MI
->getNumOperands(); i
!= e
; ++i
) {
319 MachineOperand
&Op
= MI
->getOperand(i
);
320 if (!Op
.isReg() || !Op
.isUse() || Op
.getReg() != Reg
||
321 MI
->isRegTiedToDefOperand(i
))
323 LaneBitmask SLM
= getLaneMask(Reg
, Op
.getSubReg());
324 if ((SLM
& LM
) == SLM
) {
325 // Only set the kill flag on the first encountered use of Reg in this
333 LiveInterval
&LI
= LIS
->getInterval(Reg
);
334 for (auto I
= LI
.begin(), E
= LI
.end(); I
!= E
; ++I
) {
335 if (!I
->end
.isRegister())
337 // Do not mark the end of the segment as <kill>, if the next segment
338 // starts with a predicated instruction.
339 auto NextI
= std::next(I
);
340 if (NextI
!= E
&& NextI
->start
.isRegister()) {
341 MachineInstr
*DefI
= LIS
->getInstructionFromIndex(NextI
->start
);
342 if (HII
->isPredicated(*DefI
))
345 bool WholeReg
= true;
346 if (LI
.hasSubRanges()) {
347 auto EndsAtI
= [I
] (LiveInterval::SubRange
&S
) -> bool {
348 LiveRange::iterator F
= S
.find(I
->end
);
349 return F
!= S
.end() && I
->end
== F
->end
;
351 // Check if all subranges end at I->end. If so, make sure to kill
352 // the whole register.
353 for (LiveInterval::SubRange
&S
: LI
.subranges()) {
355 KillAt(I
->end
, S
.LaneMask
);
361 KillAt(I
->end
, MRI
->getMaxLaneMaskForVReg(Reg
));
365 void HexagonExpandCondsets::updateDeadsInRange(unsigned Reg
, LaneBitmask LM
,
367 assert(Register::isVirtualRegister(Reg
));
371 // Return two booleans: { def-modifes-reg, def-covers-reg }.
372 auto IsRegDef
= [this,Reg
,LM
] (MachineOperand
&Op
) -> std::pair
<bool,bool> {
373 if (!Op
.isReg() || !Op
.isDef())
374 return { false, false };
375 Register DR
= Op
.getReg(), DSR
= Op
.getSubReg();
376 if (!Register::isVirtualRegister(DR
) || DR
!= Reg
)
377 return { false, false };
378 LaneBitmask SLM
= getLaneMask(DR
, DSR
);
379 LaneBitmask A
= SLM
& LM
;
380 return { A
.any(), A
== SLM
};
383 // The splitting step will create pairs of predicated definitions without
384 // any implicit uses (since implicit uses would interfere with predication).
385 // This can cause the reaching defs to become dead after live range
386 // recomputation, even though they are not really dead.
387 // We need to identify predicated defs that need implicit uses, and
388 // dead defs that are not really dead, and correct both problems.
390 auto Dominate
= [this] (SetVector
<MachineBasicBlock
*> &Defs
,
391 MachineBasicBlock
*Dest
) -> bool {
392 for (MachineBasicBlock
*D
: Defs
)
393 if (D
!= Dest
&& MDT
->dominates(D
, Dest
))
396 MachineBasicBlock
*Entry
= &Dest
->getParent()->front();
397 SetVector
<MachineBasicBlock
*> Work(Dest
->pred_begin(), Dest
->pred_end());
398 for (unsigned i
= 0; i
< Work
.size(); ++i
) {
399 MachineBasicBlock
*B
= Work
[i
];
404 for (auto *P
: B
->predecessors())
410 // First, try to extend live range within individual basic blocks. This
411 // will leave us only with dead defs that do not reach any predicated
412 // defs in the same block.
413 SetVector
<MachineBasicBlock
*> Defs
;
414 SmallVector
<SlotIndex
,4> PredDefs
;
415 for (auto &Seg
: Range
) {
416 if (!Seg
.start
.isRegister())
418 MachineInstr
*DefI
= LIS
->getInstructionFromIndex(Seg
.start
);
419 Defs
.insert(DefI
->getParent());
420 if (HII
->isPredicated(*DefI
))
421 PredDefs
.push_back(Seg
.start
);
424 SmallVector
<SlotIndex
,8> Undefs
;
425 LiveInterval
&LI
= LIS
->getInterval(Reg
);
426 LI
.computeSubRangeUndefs(Undefs
, LM
, *MRI
, *LIS
->getSlotIndexes());
428 for (auto &SI
: PredDefs
) {
429 MachineBasicBlock
*BB
= LIS
->getMBBFromIndex(SI
);
430 auto P
= Range
.extendInBlock(Undefs
, LIS
->getMBBStartIdx(BB
), SI
);
431 if (P
.first
!= nullptr || P
.second
)
435 // Calculate reachability for those predicated defs that were not handled
436 // by the in-block extension.
437 SmallVector
<SlotIndex
,4> ExtTo
;
438 for (auto &SI
: PredDefs
) {
441 MachineBasicBlock
*BB
= LIS
->getMBBFromIndex(SI
);
442 if (BB
->pred_empty())
444 // If the defs from this range reach SI via all predecessors, it is live.
445 // It can happen that SI is reached by the defs through some paths, but
446 // not all. In the IR coming into this optimization, SI would not be
447 // considered live, since the defs would then not jointly dominate SI.
448 // That means that SI is an overwriting def, and no implicit use is
449 // needed at this point. Do not add SI to the extension points, since
450 // extendToIndices will abort if there is no joint dominance.
451 // If the abort was avoided by adding extra undefs added to Undefs,
452 // extendToIndices could actually indicate that SI is live, contrary
453 // to the original IR.
454 if (Dominate(Defs
, BB
))
459 LIS
->extendToIndices(Range
, ExtTo
, Undefs
);
461 // Remove <dead> flags from all defs that are not dead after live range
462 // extension, and collect all def operands. They will be used to generate
463 // the necessary implicit uses.
464 // At the same time, add <dead> flag to all defs that are actually dead.
465 // This can happen, for example, when a mux with identical inputs is
466 // replaced with a COPY: the use of the predicate register disappears and
467 // the dead can become dead.
468 std::set
<RegisterRef
> DefRegs
;
469 for (auto &Seg
: Range
) {
470 if (!Seg
.start
.isRegister())
472 MachineInstr
*DefI
= LIS
->getInstructionFromIndex(Seg
.start
);
473 for (auto &Op
: DefI
->operands()) {
474 auto P
= IsRegDef(Op
);
475 if (P
.second
&& Seg
.end
.isDead()) {
477 } else if (P
.first
) {
484 // Now, add implicit uses to each predicated def that is reached
486 for (auto &Seg
: Range
) {
487 if (!Seg
.start
.isRegister() || !Range
.liveAt(Seg
.start
.getPrevSlot()))
489 MachineInstr
*DefI
= LIS
->getInstructionFromIndex(Seg
.start
);
490 if (!HII
->isPredicated(*DefI
))
492 // Construct the set of all necessary implicit uses, based on the def
493 // operands in the instruction. We need to tie the implicit uses to
494 // the corresponding defs.
495 std::map
<RegisterRef
,unsigned> ImpUses
;
496 for (unsigned i
= 0, e
= DefI
->getNumOperands(); i
!= e
; ++i
) {
497 MachineOperand
&Op
= DefI
->getOperand(i
);
498 if (!Op
.isReg() || !DefRegs
.count(Op
))
501 // Tied defs will always have corresponding uses, so no extra
502 // implicit uses are needed.
504 ImpUses
.insert({Op
, i
});
506 // This function can be called for the same register with different
507 // lane masks. If the def in this instruction was for the whole
508 // register, we can get here more than once. Avoid adding multiple
509 // implicit uses (or adding an implicit use when an explicit one is
517 MachineFunction
&MF
= *DefI
->getParent()->getParent();
518 for (std::pair
<RegisterRef
, unsigned> P
: ImpUses
) {
519 RegisterRef R
= P
.first
;
520 MachineInstrBuilder(MF
, DefI
).addReg(R
.Reg
, RegState::Implicit
, R
.Sub
);
521 DefI
->tieOperands(P
.second
, DefI
->getNumOperands()-1);
526 void HexagonExpandCondsets::updateDeadFlags(unsigned Reg
) {
527 LiveInterval
&LI
= LIS
->getInterval(Reg
);
528 if (LI
.hasSubRanges()) {
529 for (LiveInterval::SubRange
&S
: LI
.subranges()) {
530 updateDeadsInRange(Reg
, S
.LaneMask
, S
);
531 LIS
->shrinkToUses(S
, Reg
);
534 LIS
->constructMainRangeFromSubranges(LI
);
536 updateDeadsInRange(Reg
, MRI
->getMaxLaneMaskForVReg(Reg
), LI
);
540 void HexagonExpandCondsets::recalculateLiveInterval(unsigned Reg
) {
541 LIS
->removeInterval(Reg
);
542 LIS
->createAndComputeVirtRegInterval(Reg
);
545 void HexagonExpandCondsets::removeInstr(MachineInstr
&MI
) {
546 LIS
->RemoveMachineInstrFromMaps(MI
);
547 MI
.eraseFromParent();
550 void HexagonExpandCondsets::updateLiveness(std::set
<unsigned> &RegSet
,
551 bool Recalc
, bool UpdateKills
, bool UpdateDeads
) {
552 UpdateKills
|= UpdateDeads
;
553 for (unsigned R
: RegSet
) {
554 if (!Register::isVirtualRegister(R
)) {
555 assert(Register::isPhysicalRegister(R
));
556 // There shouldn't be any physical registers as operands, except
557 // possibly reserved registers.
558 assert(MRI
->isReserved(R
));
562 recalculateLiveInterval(R
);
564 MRI
->clearKillFlags(R
);
567 // Fixing <dead> flags may extend live ranges, so reset <kill> flags
571 LIS
->getInterval(R
).verify();
575 /// Get the opcode for a conditional transfer of the value in SO (source
576 /// operand). The condition (true/false) is given in Cond.
577 unsigned HexagonExpandCondsets::getCondTfrOpcode(const MachineOperand
&SO
,
579 using namespace Hexagon
;
584 if (Register::isVirtualRegister(RS
.Reg
)) {
585 const TargetRegisterClass
*VC
= MRI
->getRegClass(RS
.Reg
);
586 assert(VC
->begin() != VC
->end() && "Empty register class");
587 PhysR
= *VC
->begin();
589 assert(Register::isPhysicalRegister(RS
.Reg
));
592 Register PhysS
= (RS
.Sub
== 0) ? PhysR
: TRI
->getSubReg(PhysR
, RS
.Sub
);
593 const TargetRegisterClass
*RC
= TRI
->getMinimalPhysRegClass(PhysS
);
594 switch (TRI
->getRegSizeInBits(*RC
)) {
596 return IfTrue
? A2_tfrt
: A2_tfrf
;
598 return IfTrue
? A2_tfrpt
: A2_tfrpf
;
600 llvm_unreachable("Invalid register operand");
602 switch (SO
.getType()) {
603 case MachineOperand::MO_Immediate
:
604 case MachineOperand::MO_FPImmediate
:
605 case MachineOperand::MO_ConstantPoolIndex
:
606 case MachineOperand::MO_TargetIndex
:
607 case MachineOperand::MO_JumpTableIndex
:
608 case MachineOperand::MO_ExternalSymbol
:
609 case MachineOperand::MO_GlobalAddress
:
610 case MachineOperand::MO_BlockAddress
:
611 return IfTrue
? C2_cmoveit
: C2_cmoveif
;
615 llvm_unreachable("Unexpected source operand");
618 /// Generate a conditional transfer, copying the value SrcOp to the
619 /// destination register DstR:DstSR, and using the predicate register from
620 /// PredOp. The Cond argument specifies whether the predicate is to be
621 /// if(PredOp), or if(!PredOp).
622 MachineInstr
*HexagonExpandCondsets::genCondTfrFor(MachineOperand
&SrcOp
,
623 MachineBasicBlock::iterator At
,
624 unsigned DstR
, unsigned DstSR
, const MachineOperand
&PredOp
,
625 bool PredSense
, bool ReadUndef
, bool ImpUse
) {
626 MachineInstr
*MI
= SrcOp
.getParent();
627 MachineBasicBlock
&B
= *At
->getParent();
628 const DebugLoc
&DL
= MI
->getDebugLoc();
630 // Don't avoid identity copies here (i.e. if the source and the destination
631 // are the same registers). It is actually better to generate them here,
632 // since this would cause the copy to potentially be predicated in the next
633 // step. The predication will remove such a copy if it is unable to
636 unsigned Opc
= getCondTfrOpcode(SrcOp
, PredSense
);
637 unsigned DstState
= RegState::Define
| (ReadUndef
? RegState::Undef
: 0);
638 unsigned PredState
= getRegState(PredOp
) & ~RegState::Kill
;
639 MachineInstrBuilder MIB
;
642 unsigned SrcState
= getRegState(SrcOp
);
643 if (RegisterRef(SrcOp
) == RegisterRef(DstR
, DstSR
))
644 SrcState
&= ~RegState::Kill
;
645 MIB
= BuildMI(B
, At
, DL
, HII
->get(Opc
))
646 .addReg(DstR
, DstState
, DstSR
)
647 .addReg(PredOp
.getReg(), PredState
, PredOp
.getSubReg())
648 .addReg(SrcOp
.getReg(), SrcState
, SrcOp
.getSubReg());
650 MIB
= BuildMI(B
, At
, DL
, HII
->get(Opc
))
651 .addReg(DstR
, DstState
, DstSR
)
652 .addReg(PredOp
.getReg(), PredState
, PredOp
.getSubReg())
656 LLVM_DEBUG(dbgs() << "created an initial copy: " << *MIB
);
660 /// Replace a MUX instruction MI with a pair A2_tfrt/A2_tfrf. This function
661 /// performs all necessary changes to complete the replacement.
662 bool HexagonExpandCondsets::split(MachineInstr
&MI
,
663 std::set
<unsigned> &UpdRegs
) {
664 if (TfrLimitActive
) {
665 if (TfrCounter
>= TfrLimit
)
669 LLVM_DEBUG(dbgs() << "\nsplitting " << printMBBReference(*MI
.getParent())
671 MachineOperand
&MD
= MI
.getOperand(0); // Definition
672 MachineOperand
&MP
= MI
.getOperand(1); // Predicate register
674 Register DR
= MD
.getReg(), DSR
= MD
.getSubReg();
675 bool ReadUndef
= MD
.isUndef();
676 MachineBasicBlock::iterator At
= MI
;
678 auto updateRegs
= [&UpdRegs
] (const MachineInstr
&MI
) -> void {
679 for (auto &Op
: MI
.operands())
681 UpdRegs
.insert(Op
.getReg());
684 // If this is a mux of the same register, just replace it with COPY.
685 // Ideally, this would happen earlier, so that register coalescing would
687 MachineOperand
&ST
= MI
.getOperand(2);
688 MachineOperand
&SF
= MI
.getOperand(3);
689 if (ST
.isReg() && SF
.isReg()) {
691 if (RT
== RegisterRef(SF
)) {
692 // Copy regs to update first.
694 MI
.setDesc(HII
->get(TargetOpcode::COPY
));
695 unsigned S
= getRegState(ST
);
696 while (MI
.getNumOperands() > 1)
697 MI
.RemoveOperand(MI
.getNumOperands()-1);
698 MachineFunction
&MF
= *MI
.getParent()->getParent();
699 MachineInstrBuilder(MF
, MI
).addReg(RT
.Reg
, S
, RT
.Sub
);
704 // First, create the two invididual conditional transfers, and add each
705 // of them to the live intervals information. Do that first and then remove
706 // the old instruction from live intervals.
708 genCondTfrFor(ST
, At
, DR
, DSR
, MP
, true, ReadUndef
, false);
710 genCondTfrFor(SF
, At
, DR
, DSR
, MP
, false, ReadUndef
, true);
711 LIS
->InsertMachineInstrInMaps(*TfrT
);
712 LIS
->InsertMachineInstrInMaps(*TfrF
);
714 // Will need to recalculate live intervals for all registers in MI.
721 bool HexagonExpandCondsets::isPredicable(MachineInstr
*MI
) {
722 if (HII
->isPredicated(*MI
) || !HII
->isPredicable(*MI
))
724 if (MI
->hasUnmodeledSideEffects() || MI
->mayStore())
726 // Reject instructions with multiple defs (e.g. post-increment loads).
728 for (auto &Op
: MI
->operands()) {
729 if (!Op
.isReg() || !Op
.isDef())
735 for (auto &Mo
: MI
->memoperands())
736 if (Mo
->isVolatile() || Mo
->isAtomic())
741 /// Find the reaching definition for a predicated use of RD. The RD is used
742 /// under the conditions given by PredR and Cond, and this function will ignore
743 /// definitions that set RD under the opposite conditions.
744 MachineInstr
*HexagonExpandCondsets::getReachingDefForPred(RegisterRef RD
,
745 MachineBasicBlock::iterator UseIt
, unsigned PredR
, bool Cond
) {
746 MachineBasicBlock
&B
= *UseIt
->getParent();
747 MachineBasicBlock::iterator I
= UseIt
, S
= B
.begin();
751 bool PredValid
= true;
754 MachineInstr
*MI
= &*I
;
755 // Check if this instruction can be ignored, i.e. if it is predicated
756 // on the complementary condition.
757 if (PredValid
&& HII
->isPredicated(*MI
)) {
758 if (MI
->readsRegister(PredR
) && (Cond
!= HII
->isPredicatedTrue(*MI
)))
762 // Check the defs. If the PredR is defined, invalidate it. If RD is
763 // defined, return the instruction or 0, depending on the circumstances.
764 for (auto &Op
: MI
->operands()) {
765 if (!Op
.isReg() || !Op
.isDef())
768 if (RR
.Reg
== PredR
) {
772 if (RR
.Reg
!= RD
.Reg
)
774 // If the "Reg" part agrees, there is still the subregister to check.
775 // If we are looking for %1:loreg, we can skip %1:hireg, but
776 // not %1 (w/o subregisters).
777 if (RR
.Sub
== RD
.Sub
)
779 if (RR
.Sub
== 0 || RD
.Sub
== 0)
781 // We have different subregisters, so we can continue looking.
788 /// Check if the instruction MI can be safely moved over a set of instructions
789 /// whose side-effects (in terms of register defs and uses) are expressed in
790 /// the maps Defs and Uses. These maps reflect the conditional defs and uses
791 /// that depend on the same predicate register to allow moving instructions
792 /// over instructions predicated on the opposite condition.
793 bool HexagonExpandCondsets::canMoveOver(MachineInstr
&MI
, ReferenceMap
&Defs
,
794 ReferenceMap
&Uses
) {
795 // In order to be able to safely move MI over instructions that define
796 // "Defs" and use "Uses", no def operand from MI can be defined or used
797 // and no use operand can be defined.
798 for (auto &Op
: MI
.operands()) {
802 // For physical register we would need to check register aliases, etc.
803 // and we don't want to bother with that. It would be of little value
804 // before the actual register rewriting (from virtual to physical).
805 if (!Register::isVirtualRegister(RR
.Reg
))
807 // No redefs for any operand.
808 if (isRefInMap(RR
, Defs
, Exec_Then
))
810 // For defs, there cannot be uses.
811 if (Op
.isDef() && isRefInMap(RR
, Uses
, Exec_Then
))
817 /// Check if the instruction accessing memory (TheI) can be moved to the
819 bool HexagonExpandCondsets::canMoveMemTo(MachineInstr
&TheI
, MachineInstr
&ToI
,
821 bool IsLoad
= TheI
.mayLoad(), IsStore
= TheI
.mayStore();
822 if (!IsLoad
&& !IsStore
)
824 if (HII
->areMemAccessesTriviallyDisjoint(TheI
, ToI
))
826 if (TheI
.hasUnmodeledSideEffects())
829 MachineBasicBlock::iterator StartI
= IsDown
? TheI
: ToI
;
830 MachineBasicBlock::iterator EndI
= IsDown
? ToI
: TheI
;
831 bool Ordered
= TheI
.hasOrderedMemoryRef();
833 // Search for aliased memory reference in (StartI, EndI).
834 for (MachineBasicBlock::iterator I
= std::next(StartI
); I
!= EndI
; ++I
) {
835 MachineInstr
*MI
= &*I
;
836 if (MI
->hasUnmodeledSideEffects())
838 bool L
= MI
->mayLoad(), S
= MI
->mayStore();
841 if (Ordered
&& MI
->hasOrderedMemoryRef())
844 bool Conflict
= (L
&& IsStore
) || S
;
851 /// Generate a predicated version of MI (where the condition is given via
852 /// PredR and Cond) at the point indicated by Where.
853 void HexagonExpandCondsets::predicateAt(const MachineOperand
&DefOp
,
855 MachineBasicBlock::iterator Where
,
856 const MachineOperand
&PredOp
, bool Cond
,
857 std::set
<unsigned> &UpdRegs
) {
858 // The problem with updating live intervals is that we can move one def
859 // past another def. In particular, this can happen when moving an A2_tfrt
860 // over an A2_tfrf defining the same register. From the point of view of
861 // live intervals, these two instructions are two separate definitions,
862 // and each one starts another live segment. LiveIntervals's "handleMove"
863 // does not allow such moves, so we need to handle it ourselves. To avoid
864 // invalidating liveness data while we are using it, the move will be
865 // implemented in 4 steps: (1) add a clone of the instruction MI at the
866 // target location, (2) update liveness, (3) delete the old instruction,
867 // and (4) update liveness again.
869 MachineBasicBlock
&B
= *MI
.getParent();
870 DebugLoc DL
= Where
->getDebugLoc(); // "Where" points to an instruction.
871 unsigned Opc
= MI
.getOpcode();
872 unsigned PredOpc
= HII
->getCondOpcode(Opc
, !Cond
);
873 MachineInstrBuilder MB
= BuildMI(B
, Where
, DL
, HII
->get(PredOpc
));
874 unsigned Ox
= 0, NP
= MI
.getNumOperands();
875 // Skip all defs from MI first.
877 MachineOperand
&MO
= MI
.getOperand(Ox
);
878 if (!MO
.isReg() || !MO
.isDef())
882 // Add the new def, then the predicate register, then the rest of the
884 MB
.addReg(DefOp
.getReg(), getRegState(DefOp
), DefOp
.getSubReg());
885 MB
.addReg(PredOp
.getReg(), PredOp
.isUndef() ? RegState::Undef
: 0,
888 MachineOperand
&MO
= MI
.getOperand(Ox
);
889 if (!MO
.isReg() || !MO
.isImplicit())
895 MachineInstr
*NewI
= MB
;
896 NewI
->clearKillInfo();
897 LIS
->InsertMachineInstrInMaps(*NewI
);
899 for (auto &Op
: NewI
->operands())
901 UpdRegs
.insert(Op
.getReg());
904 /// In the range [First, Last], rename all references to the "old" register RO
905 /// to the "new" register RN, but only in instructions predicated on the given
907 void HexagonExpandCondsets::renameInRange(RegisterRef RO
, RegisterRef RN
,
908 unsigned PredR
, bool Cond
, MachineBasicBlock::iterator First
,
909 MachineBasicBlock::iterator Last
) {
910 MachineBasicBlock::iterator End
= std::next(Last
);
911 for (MachineBasicBlock::iterator I
= First
; I
!= End
; ++I
) {
912 MachineInstr
*MI
= &*I
;
913 // Do not touch instructions that are not predicated, or are predicated
914 // on the opposite condition.
915 if (!HII
->isPredicated(*MI
))
917 if (!MI
->readsRegister(PredR
) || (Cond
!= HII
->isPredicatedTrue(*MI
)))
920 for (auto &Op
: MI
->operands()) {
921 if (!Op
.isReg() || RO
!= RegisterRef(Op
))
924 Op
.setSubReg(RN
.Sub
);
925 // In practice, this isn't supposed to see any defs.
926 assert(!Op
.isDef() && "Not expecting a def");
931 /// For a given conditional copy, predicate the definition of the source of
932 /// the copy under the given condition (using the same predicate register as
934 bool HexagonExpandCondsets::predicate(MachineInstr
&TfrI
, bool Cond
,
935 std::set
<unsigned> &UpdRegs
) {
936 // TfrI - A2_tfr[tf] Instruction (not A2_tfrsi).
937 unsigned Opc
= TfrI
.getOpcode();
939 assert(Opc
== Hexagon::A2_tfrt
|| Opc
== Hexagon::A2_tfrf
);
940 LLVM_DEBUG(dbgs() << "\nattempt to predicate if-" << (Cond
? "true" : "false")
943 MachineOperand
&MD
= TfrI
.getOperand(0);
944 MachineOperand
&MP
= TfrI
.getOperand(1);
945 MachineOperand
&MS
= TfrI
.getOperand(2);
946 // The source operand should be a <kill>. This is not strictly necessary,
947 // but it makes things a lot simpler. Otherwise, we would need to rename
948 // some registers, which would complicate the transformation considerably.
951 // Avoid predicating instructions that define a subregister if subregister
952 // liveness tracking is not enabled.
953 if (MD
.getSubReg() && !MRI
->shouldTrackSubRegLiveness(MD
.getReg()))
957 Register PredR
= MP
.getReg();
958 MachineInstr
*DefI
= getReachingDefForPred(RT
, TfrI
, PredR
, Cond
);
959 if (!DefI
|| !isPredicable(DefI
))
962 LLVM_DEBUG(dbgs() << "Source def: " << *DefI
);
964 // Collect the information about registers defined and used between the
965 // DefI and the TfrI.
966 // Map: reg -> bitmask of subregs
967 ReferenceMap Uses
, Defs
;
968 MachineBasicBlock::iterator DefIt
= DefI
, TfrIt
= TfrI
;
970 // Check if the predicate register is valid between DefI and TfrI.
971 // If it is, we can then ignore instructions predicated on the negated
972 // conditions when collecting def and use information.
973 bool PredValid
= true;
974 for (MachineBasicBlock::iterator I
= std::next(DefIt
); I
!= TfrIt
; ++I
) {
975 if (!I
->modifiesRegister(PredR
, nullptr))
981 for (MachineBasicBlock::iterator I
= std::next(DefIt
); I
!= TfrIt
; ++I
) {
982 MachineInstr
*MI
= &*I
;
983 // If this instruction is predicated on the same register, it could
984 // potentially be ignored.
985 // By default assume that the instruction executes on the same condition
986 // as TfrI (Exec_Then), and also on the opposite one (Exec_Else).
987 unsigned Exec
= Exec_Then
| Exec_Else
;
988 if (PredValid
&& HII
->isPredicated(*MI
) && MI
->readsRegister(PredR
))
989 Exec
= (Cond
== HII
->isPredicatedTrue(*MI
)) ? Exec_Then
: Exec_Else
;
991 for (auto &Op
: MI
->operands()) {
994 // We don't want to deal with physical registers. The reason is that
995 // they can be aliased with other physical registers. Aliased virtual
996 // registers must share the same register number, and can only differ
997 // in the subregisters, which we are keeping track of. Physical
998 // registers ters no longer have subregisters---their super- and
999 // subregisters are other physical registers, and we are not checking
1001 RegisterRef RR
= Op
;
1002 if (!Register::isVirtualRegister(RR
.Reg
))
1005 ReferenceMap
&Map
= Op
.isDef() ? Defs
: Uses
;
1006 if (Op
.isDef() && Op
.isUndef()) {
1007 assert(RR
.Sub
&& "Expecting a subregister on <def,read-undef>");
1008 // If this is a <def,read-undef>, then it invalidates the non-written
1009 // part of the register. For the purpose of checking the validity of
1010 // the move, assume that it modifies the whole register.
1013 addRefToMap(RR
, Map
, Exec
);
1020 // RD = TfrI ..., RT
1022 // If the register-in-the-middle (RT) is used or redefined between
1023 // DefI and TfrI, we may not be able proceed with this transformation.
1024 // We can ignore a def that will not execute together with TfrI, and a
1025 // use that will. If there is such a use (that does execute together with
1026 // TfrI), we will not be able to move DefI down. If there is a use that
1027 // executed if TfrI's condition is false, then RT must be available
1028 // unconditionally (cannot be predicated).
1029 // Essentially, we need to be able to rename RT to RD in this segment.
1030 if (isRefInMap(RT
, Defs
, Exec_Then
) || isRefInMap(RT
, Uses
, Exec_Else
))
1032 RegisterRef RD
= MD
;
1033 // If the predicate register is defined between DefI and TfrI, the only
1034 // potential thing to do would be to move the DefI down to TfrI, and then
1035 // predicate. The reaching def (DefI) must be movable down to the location
1037 // If the target register of the TfrI (RD) is not used or defined between
1038 // DefI and TfrI, consider moving TfrI up to DefI.
1039 bool CanUp
= canMoveOver(TfrI
, Defs
, Uses
);
1040 bool CanDown
= canMoveOver(*DefI
, Defs
, Uses
);
1041 // The TfrI does not access memory, but DefI could. Check if it's safe
1042 // to move DefI down to TfrI.
1043 if (DefI
->mayLoad() || DefI
->mayStore())
1044 if (!canMoveMemTo(*DefI
, TfrI
, true))
1047 LLVM_DEBUG(dbgs() << "Can move up: " << (CanUp
? "yes" : "no")
1048 << ", can move down: " << (CanDown
? "yes\n" : "no\n"));
1049 MachineBasicBlock::iterator PastDefIt
= std::next(DefIt
);
1051 predicateAt(MD
, *DefI
, PastDefIt
, MP
, Cond
, UpdRegs
);
1053 predicateAt(MD
, *DefI
, TfrIt
, MP
, Cond
, UpdRegs
);
1058 renameInRange(RT
, RD
, PredR
, Cond
, PastDefIt
, TfrIt
);
1059 UpdRegs
.insert(RT
.Reg
);
1067 /// Predicate all cases of conditional copies in the specified block.
1068 bool HexagonExpandCondsets::predicateInBlock(MachineBasicBlock
&B
,
1069 std::set
<unsigned> &UpdRegs
) {
1070 bool Changed
= false;
1071 MachineBasicBlock::iterator I
, E
, NextI
;
1072 for (I
= B
.begin(), E
= B
.end(); I
!= E
; I
= NextI
) {
1073 NextI
= std::next(I
);
1074 unsigned Opc
= I
->getOpcode();
1075 if (Opc
== Hexagon::A2_tfrt
|| Opc
== Hexagon::A2_tfrf
) {
1076 bool Done
= predicate(*I
, (Opc
== Hexagon::A2_tfrt
), UpdRegs
);
1078 // If we didn't predicate I, we may need to remove it in case it is
1079 // an "identity" copy, e.g. %1 = A2_tfrt %2, %1.
1080 if (RegisterRef(I
->getOperand(0)) == RegisterRef(I
->getOperand(2))) {
1081 for (auto &Op
: I
->operands())
1083 UpdRegs
.insert(Op
.getReg());
1093 bool HexagonExpandCondsets::isIntReg(RegisterRef RR
, unsigned &BW
) {
1094 if (!Register::isVirtualRegister(RR
.Reg
))
1096 const TargetRegisterClass
*RC
= MRI
->getRegClass(RR
.Reg
);
1097 if (RC
== &Hexagon::IntRegsRegClass
) {
1101 if (RC
== &Hexagon::DoubleRegsRegClass
) {
1102 BW
= (RR
.Sub
!= 0) ? 32 : 64;
1108 bool HexagonExpandCondsets::isIntraBlocks(LiveInterval
&LI
) {
1109 for (LiveInterval::iterator I
= LI
.begin(), E
= LI
.end(); I
!= E
; ++I
) {
1110 LiveRange::Segment
&LR
= *I
;
1111 // Range must start at a register...
1112 if (!LR
.start
.isRegister())
1114 // ...and end in a register or in a dead slot.
1115 if (!LR
.end
.isRegister() && !LR
.end
.isDead())
1121 bool HexagonExpandCondsets::coalesceRegisters(RegisterRef R1
, RegisterRef R2
) {
1122 if (CoaLimitActive
) {
1123 if (CoaCounter
>= CoaLimit
)
1128 if (!isIntReg(R1
, BW1
) || !isIntReg(R2
, BW2
) || BW1
!= BW2
)
1130 if (MRI
->isLiveIn(R1
.Reg
))
1132 if (MRI
->isLiveIn(R2
.Reg
))
1135 LiveInterval
&L1
= LIS
->getInterval(R1
.Reg
);
1136 LiveInterval
&L2
= LIS
->getInterval(R2
.Reg
);
1139 if (L1
.hasSubRanges() || L2
.hasSubRanges())
1141 bool Overlap
= L1
.overlaps(L2
);
1143 LLVM_DEBUG(dbgs() << "compatible registers: ("
1144 << (Overlap
? "overlap" : "disjoint") << ")\n "
1145 << printReg(R1
.Reg
, TRI
, R1
.Sub
) << " " << L1
<< "\n "
1146 << printReg(R2
.Reg
, TRI
, R2
.Sub
) << " " << L2
<< "\n");
1147 if (R1
.Sub
|| R2
.Sub
)
1152 // Coalescing could have a negative impact on scheduling, so try to limit
1153 // to some reasonable extent. Only consider coalescing segments, when one
1154 // of them does not cross basic block boundaries.
1155 if (!isIntraBlocks(L1
) && !isIntraBlocks(L2
))
1158 MRI
->replaceRegWith(R2
.Reg
, R1
.Reg
);
1160 // Move all live segments from L2 to L1.
1161 using ValueInfoMap
= DenseMap
<VNInfo
*, VNInfo
*>;
1163 for (LiveInterval::iterator I
= L2
.begin(), E
= L2
.end(); I
!= E
; ++I
) {
1164 VNInfo
*NewVN
, *OldVN
= I
->valno
;
1165 ValueInfoMap::iterator F
= VM
.find(OldVN
);
1166 if (F
== VM
.end()) {
1167 NewVN
= L1
.getNextValue(I
->valno
->def
, LIS
->getVNInfoAllocator());
1168 VM
.insert(std::make_pair(OldVN
, NewVN
));
1172 L1
.addSegment(LiveRange::Segment(I
->start
, I
->end
, NewVN
));
1174 while (L2
.begin() != L2
.end())
1175 L2
.removeSegment(*L2
.begin());
1176 LIS
->removeInterval(R2
.Reg
);
1178 updateKillFlags(R1
.Reg
);
1179 LLVM_DEBUG(dbgs() << "coalesced: " << L1
<< "\n");
1185 /// Attempt to coalesce one of the source registers to a MUX instruction with
1186 /// the destination register. This could lead to having only one predicated
1187 /// instruction in the end instead of two.
1188 bool HexagonExpandCondsets::coalesceSegments(
1189 const SmallVectorImpl
<MachineInstr
*> &Condsets
,
1190 std::set
<unsigned> &UpdRegs
) {
1191 SmallVector
<MachineInstr
*,16> TwoRegs
;
1192 for (MachineInstr
*MI
: Condsets
) {
1193 MachineOperand
&S1
= MI
->getOperand(2), &S2
= MI
->getOperand(3);
1194 if (!S1
.isReg() && !S2
.isReg())
1196 TwoRegs
.push_back(MI
);
1199 bool Changed
= false;
1200 for (MachineInstr
*CI
: TwoRegs
) {
1201 RegisterRef RD
= CI
->getOperand(0);
1202 RegisterRef RP
= CI
->getOperand(1);
1203 MachineOperand
&S1
= CI
->getOperand(2), &S2
= CI
->getOperand(3);
1205 // Consider this case:
1208 // %0 = C2_mux ..., %1, %2
1209 // If %0 was coalesced with %1, we could end up with the following
1213 // %0 = A2_tfrf ..., %2
1214 // which will later become:
1216 // %0 = instr2_cNotPt ...
1217 // i.e. there will be an unconditional definition (instr1) of %0
1218 // followed by a conditional one. The output dependency was there before
1219 // and it unavoidable, but if instr1 is predicable, we will no longer be
1220 // able to predicate it here.
1221 // To avoid this scenario, don't coalesce the destination register with
1222 // a source register that is defined by a predicable instruction.
1224 RegisterRef RS
= S1
;
1225 MachineInstr
*RDef
= getReachingDefForPred(RS
, CI
, RP
.Reg
, true);
1226 if (!RDef
|| !HII
->isPredicable(*RDef
)) {
1227 Done
= coalesceRegisters(RD
, RegisterRef(S1
));
1229 UpdRegs
.insert(RD
.Reg
);
1230 UpdRegs
.insert(S1
.getReg());
1234 if (!Done
&& S2
.isReg()) {
1235 RegisterRef RS
= S2
;
1236 MachineInstr
*RDef
= getReachingDefForPred(RS
, CI
, RP
.Reg
, false);
1237 if (!RDef
|| !HII
->isPredicable(*RDef
)) {
1238 Done
= coalesceRegisters(RD
, RegisterRef(S2
));
1240 UpdRegs
.insert(RD
.Reg
);
1241 UpdRegs
.insert(S2
.getReg());
1250 bool HexagonExpandCondsets::runOnMachineFunction(MachineFunction
&MF
) {
1251 if (skipFunction(MF
.getFunction()))
1254 HII
= static_cast<const HexagonInstrInfo
*>(MF
.getSubtarget().getInstrInfo());
1255 TRI
= MF
.getSubtarget().getRegisterInfo();
1256 MDT
= &getAnalysis
<MachineDominatorTree
>();
1257 LIS
= &getAnalysis
<LiveIntervals
>();
1258 MRI
= &MF
.getRegInfo();
1260 LLVM_DEBUG(LIS
->print(dbgs() << "Before expand-condsets\n",
1261 MF
.getFunction().getParent()));
1263 bool Changed
= false;
1264 std::set
<unsigned> CoalUpd
, PredUpd
;
1266 SmallVector
<MachineInstr
*,16> Condsets
;
1270 Condsets
.push_back(&I
);
1272 // Try to coalesce the target of a mux with one of its sources.
1273 // This could eliminate a register copy in some circumstances.
1274 Changed
|= coalesceSegments(Condsets
, CoalUpd
);
1276 // Update kill flags on all source operands. This is done here because
1277 // at this moment (when expand-condsets runs), there are no kill flags
1278 // in the IR (they have been removed by live range analysis).
1279 // Updating them right before we split is the easiest, because splitting
1280 // adds definitions which would interfere with updating kills afterwards.
1281 std::set
<unsigned> KillUpd
;
1282 for (MachineInstr
*MI
: Condsets
)
1283 for (MachineOperand
&Op
: MI
->operands())
1284 if (Op
.isReg() && Op
.isUse())
1285 if (!CoalUpd
.count(Op
.getReg()))
1286 KillUpd
.insert(Op
.getReg());
1287 updateLiveness(KillUpd
, false, true, false);
1289 LIS
->print(dbgs() << "After coalescing\n", MF
.getFunction().getParent()));
1291 // First, simply split all muxes into a pair of conditional transfers
1292 // and update the live intervals to reflect the new arrangement. The
1293 // goal is to update the kill flags, since predication will rely on
1295 for (MachineInstr
*MI
: Condsets
)
1296 Changed
|= split(*MI
, PredUpd
);
1297 Condsets
.clear(); // The contents of Condsets are invalid here anyway.
1299 // Do not update live ranges after splitting. Recalculation of live
1300 // intervals removes kill flags, which were preserved by splitting on
1301 // the source operands of condsets. These kill flags are needed by
1302 // predication, and after splitting they are difficult to recalculate
1303 // (because of predicated defs), so make sure they are left untouched.
1304 // Predication does not use live intervals.
1306 LIS
->print(dbgs() << "After splitting\n", MF
.getFunction().getParent()));
1308 // Traverse all blocks and collapse predicable instructions feeding
1309 // conditional transfers into predicated instructions.
1310 // Walk over all the instructions again, so we may catch pre-existing
1311 // cases that were not created in the previous step.
1313 Changed
|= predicateInBlock(B
, PredUpd
);
1314 LLVM_DEBUG(LIS
->print(dbgs() << "After predicating\n",
1315 MF
.getFunction().getParent()));
1317 PredUpd
.insert(CoalUpd
.begin(), CoalUpd
.end());
1318 updateLiveness(PredUpd
, true, true, true);
1322 LIS
->print(dbgs() << "After expand-condsets\n",
1323 MF
.getFunction().getParent());
1329 //===----------------------------------------------------------------------===//
1330 // Public Constructor Functions
1331 //===----------------------------------------------------------------------===//
1332 FunctionPass
*llvm::createHexagonExpandCondsets() {
1333 return new HexagonExpandCondsets();