Lines Matching defs:Fold

1 //===-- SIFoldOperands.cpp - Fold operands --- ----------------------------===//
81 bool updateOperand(FoldCandidate &Fold) const;
83 bool canUseImmWithOpSel(FoldCandidate &Fold) const;
85 bool tryFoldImmWithOpSel(FoldCandidate &Fold) const;
130 StringRef getPassName() const override { return "SI Fold Operands"; }
141 "SI Fold Operands", false, false)
203 bool SIFoldOperands::canUseImmWithOpSel(FoldCandidate &Fold) const {
204 MachineInstr *MI = Fold.UseMI;
205 MachineOperand &Old = MI->getOperand(Fold.UseOpNo);
208 assert(Old.isReg() && Fold.isImm());
233 bool SIFoldOperands::tryFoldImmWithOpSel(FoldCandidate &Fold) const {
234 MachineInstr *MI = Fold.UseMI;
235 MachineOperand &Old = MI->getOperand(Fold.UseOpNo);
243 if (AMDGPU::isInlinableLiteralV216(Fold.ImmToFold, OpType)) {
244 Old.ChangeToImmediate(Fold.ImmToFold);
268 Fold.ImmToFold >> (ModVal & SISrcMods::OP_SEL_0 ? 16 : 0));
270 Fold.ImmToFold >> (ModVal & SISrcMods::OP_SEL_1 ? 16 : 0));
357 bool SIFoldOperands::updateOperand(FoldCandidate &Fold) const {
358 MachineInstr *MI = Fold.UseMI;
359 MachineOperand &Old = MI->getOperand(Fold.UseOpNo);
362 if (Fold.isImm() && canUseImmWithOpSel(Fold)) {
363 if (tryFoldImmWithOpSel(Fold))
368 MachineOperand New = MachineOperand::CreateImm(Fold.ImmToFold);
372 Old.ChangeToImmediate(Fold.ImmToFold);
376 if ((Fold.isImm() || Fold.isFI() || Fold.isGlobal()) && Fold.needsShrink()) {
384 int Op32 = Fold.ShrinkOpcode;
413 if (Fold.Commuted)
418 assert(!Fold.needsShrink() && "not handled");
420 if (Fold.isImm()) {
428 Old.ChangeToImmediate(Fold.ImmToFold);
432 if (Fold.isGlobal()) {
433 Old.ChangeToGA(Fold.OpToFold->getGlobal(), Fold.OpToFold->getOffset(),
434 Fold.OpToFold->getTargetFlags());
438 if (Fold.isFI()) {
439 Old.ChangeToFrameIndex(Fold.FrameIndexToFold);
443 MachineOperand *New = Fold.OpToFold;
459 for (FoldCandidate &Fold : FoldList)
460 if (Fold.UseMI == MI && Fold.UseOpNo == OpNo)
508 FoldCandidate Fold(MI, OpNo, OpToFold);
509 IsLegal = canUseImmWithOpSel(Fold);
766 // FIXME: Fold operands with subregs.
1416 for (FoldCandidate &Fold : FoldList) {
1417 assert(!Fold.isReg() || Fold.OpToFold);
1418 if (Fold.isReg() && Fold.OpToFold->getReg().isVirtual()) {
1419 Register Reg = Fold.OpToFold->getReg();
1420 MachineInstr *DefMI = Fold.OpToFold->getParent();
1422 execMayBeModifiedBeforeUse(*MRI, Reg, *DefMI, *Fold.UseMI))
1425 if (updateOperand(Fold)) {
1427 if (Fold.isReg()) {
1428 assert(Fold.OpToFold && Fold.OpToFold->isReg());
1432 MRI->clearKillFlags(Fold.OpToFold->getReg());
1435 << static_cast<int>(Fold.UseOpNo) << " of "
1436 << *Fold.UseMI);
1437 } else if (Fold.Commuted) {
1439 TII->commuteInstruction(*Fold.UseMI, false);