Lines Matching +full:se +full:- +full:pos

1 //====- X86FlagsCopyLowering.cpp - Lowers COPY nodes of EFLAGS ------------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
17 /// and other non-status flags being overwritten. Using sequences involving
21 //===----------------------------------------------------------------------===//
62 #define PASS_KEY "x86-flags-copy-lowering"
104 void insertTest(MachineBasicBlock &MBB, MachineBasicBlock::iterator Pos,
107 void rewriteSetCC(MachineBasicBlock &MBB, MachineBasicBlock::iterator Pos,
111 MachineBasicBlock::iterator Pos, const DebugLoc &Loc,
113 void rewriteMI(MachineBasicBlock &MBB, MachineBasicBlock::iterator Pos,
157 assert(!std::prev(PrevI.getIterator())->isTerminator() && in splitBlock()
189 for (auto SI = MBB.succ_begin(), SE = MBB.succ_end(); SI != SE; ++SI) in splitBlock() local
247 if (FlagDef->isDead() && X86::getNFVariant(MI.getOpcode())) in getClobberType()
259 TII = Subtarget->getInstrInfo(); in runOnMachineFunction()
260 TRI = Subtarget->getRegisterInfo(); in runOnMachineFunction()
267 if (none_of(MRI->def_instructions(X86::EFLAGS), [](const MachineInstr &MI) { in runOnMachineFunction()
280 MDT = &MDTWrapper->getDomTree(); in runOnMachineFunction()
283 OwnedMDT->getBase().recalculate(MF); in runOnMachineFunction()
303 // OP1 implicit-def dead $eflags in runOnMachineFunction()
307 // -> in runOnMachineFunction()
311 if (Subtarget->hasNF()) { in runOnMachineFunction()
319 MachineOperand &VOp = CopyI->getOperand(1); in runOnMachineFunction()
320 MachineInstr *CopyDefI = MRI->getVRegDef(VOp.getReg()); in runOnMachineFunction()
321 MachineBasicBlock *CopyIMBB = CopyI->getParent(); in runOnMachineFunction()
322 MachineBasicBlock *CopyDefIMBB = CopyDefI->getParent(); in runOnMachineFunction()
323 // Walk all basic blocks reachable in depth-first iteration on the inverse in runOnMachineFunction()
327 // has to be NF-convertible if it clobbers flags. in runOnMachineFunction()
332 ? MBB->begin() in runOnMachineFunction()
334 E = (MBB != CopyIMBB) ? MBB->end() in runOnMachineFunction()
351 CopyI->eraseFromParent(); in runOnMachineFunction()
352 if (MRI->use_nodbg_empty(CopyDefI->getOperand(0).getReg())) { in runOnMachineFunction()
354 CopyDefI->eraseFromParent(); in runOnMachineFunction()
358 unsigned NewOpc = X86::getNFVariant(Clobber->getOpcode()); in runOnMachineFunction()
360 Clobber->setDesc(TII->get(NewOpc)); in runOnMachineFunction()
361 Clobber->removeOperand( in runOnMachineFunction()
362 Clobber->findRegisterDefOperand(X86::EFLAGS, /*TRI=*/nullptr) in runOnMachineFunction()
363 ->getOperandNo()); in runOnMachineFunction()
370 BI->addLiveIn(X86::EFLAGS); in runOnMachineFunction()
382 // OP1 implicit-def dead $eflags in runOnMachineFunction()
386 // -> in runOnMachineFunction()
389 // OP1 implicit-def dead $eflags in runOnMachineFunction()
390 // TEST8rr %1, %1, implicit-def $eflags in runOnMachineFunction()
393 MachineBasicBlock &MBB = *CopyI->getParent(); in runOnMachineFunction()
395 MachineOperand &VOp = CopyI->getOperand(1); in runOnMachineFunction()
398 MachineInstr &CopyDefI = *MRI->getVRegDef(VOp.getReg()); in runOnMachineFunction()
424 CopyI->eraseFromParent(); in runOnMachineFunction()
425 if (MRI->use_empty(CopyDefI.getOperand(0).getReg())) in runOnMachineFunction()
430 MachineOperand &DOp = CopyI->getOperand(0); in runOnMachineFunction()
440 LLVM_DEBUG(dbgs() << "Rewriting copy: "; CopyI->dump()); in runOnMachineFunction()
442 // Walk up across live-in EFLAGS to find where they were actually def'ed. in runOnMachineFunction()
466 assert(MDT->dominates(BeginMBB, EndMBB) && in runOnMachineFunction()
475 for (auto *PredMBB : MBB->predecessors()) { in runOnMachineFunction()
478 if (HasEFLAGSClobber(PredMBB->begin(), PredMBB->end())) in runOnMachineFunction()
487 while (TestMBB->isLiveIn(X86::EFLAGS) && !TestMBB->pred_empty() && in runOnMachineFunction()
488 !HasEFLAGSClobber(TestMBB->begin(), TestPos)) { in runOnMachineFunction()
492 std::accumulate(std::next(TestMBB->pred_begin()), TestMBB->pred_end(), in runOnMachineFunction()
493 *TestMBB->pred_begin(), in runOnMachineFunction()
495 return MDT->findNearestCommonDominator(LHS, RHS); in runOnMachineFunction()
505 if (HasEFLAGSClobber(HoistMBB->getFirstTerminator()->getIterator(), in runOnMachineFunction()
506 HoistMBB->instr_end())) in runOnMachineFunction()
511 TestPos = TestMBB->getFirstTerminator()->getIterator(); in runOnMachineFunction()
517 llvm::reverse(llvm::make_range(TestMBB->instr_begin(), TestPos)), in runOnMachineFunction()
521 if (DefIt.base() != TestMBB->instr_begin()) { in runOnMachineFunction()
523 DefIt->dump(); in runOnMachineFunction()
525 dbgs() << " Using live-in flags for BB:\n"; in runOnMachineFunction()
526 TestMBB->dump(); in runOnMachineFunction()
565 ? std::next(CopyI->getIterator()) in runOnMachineFunction()
571 // def or the copy itself, break so that we don't re-process any part of in runOnMachineFunction()
593 if (FlagUse->isKill()) in runOnMachineFunction()
600 // tail calls, as those are not introduced into the X86 MI until post-RA in runOnMachineFunction()
614 // Otherwise we can just rewrite in-place. in runOnMachineFunction()
618 MRI->replaceRegWith(MI.getOperand(0).getReg(), in runOnMachineFunction()
638 // Otherwise we need to scan successors for ones where the flags live-in in runOnMachineFunction()
641 if (SuccMBB->isLiveIn(X86::EFLAGS) && in runOnMachineFunction()
655 // a hard check even in non-debug builds here. in runOnMachineFunction()
656 if (SuccMBB == TestMBB || !MDT->dominates(TestMBB, SuccMBB)) { in runOnMachineFunction()
663 TestMBB->dump(); in runOnMachineFunction()
665 SuccMBB->dump(); in runOnMachineFunction()
675 SuccMBB->removeLiveIn(X86::EFLAGS); in runOnMachineFunction()
686 if (JmpI->getParent() == LastJmpMBB) in runOnMachineFunction()
687 splitBlock(*JmpI->getParent(), *JmpI, *TII); in runOnMachineFunction()
689 LastJmpMBB = JmpI->getParent(); in runOnMachineFunction()
714 /// can re-use them rather than adding duplicates.
726 "A non-storing SETcc should always define a register!"); in collectCondsInRegs()
741 Register Reg = MRI->createVirtualRegister(PromoteRC); in promoteCondToReg()
742 auto SetI = BuildMI(TestMBB, TestPos, TestLoc, TII->get(X86::SETCCr), Reg) in promoteCondToReg()
745 LLVM_DEBUG(dbgs() << " save cond: "; SetI->dump()); in promoteCondToReg()
765 MachineBasicBlock::iterator Pos, in insertTest() argument
768 BuildMI(MBB, Pos, Loc, TII->get(X86::TEST8rr)).addReg(Reg).addReg(Reg); in insertTest()
770 LLVM_DEBUG(dbgs() << " test cond: "; TestI->dump()); in insertTest()
775 MachineBasicBlock::iterator Pos, in rewriteSetCC() argument
785 CondReg = promoteCondToReg(MBB, Pos, Loc, Cond); in rewriteSetCC()
791 "Cannot have a non-register defined operand to SETcc!"); in rewriteSetCC()
795 MRI->clearKillFlags(OldReg); in rewriteSetCC()
796 MRI->replaceRegWith(OldReg, CondReg); in rewriteSetCC()
803 TII->get(X86::MOV8mr)); in rewriteSetCC()
814 MachineBasicBlock &MBB, MachineBasicBlock::iterator Pos, in rewriteArithmetic() argument
828 CondReg = promoteCondToReg(MBB, Pos, Loc, Cond); in rewriteArithmetic()
831 Register TmpReg = MRI->createVirtualRegister(PromoteRC); in rewriteArithmetic()
834 TII->get(Subtarget->hasNDD() ? X86::ADD8ri_ND : X86::ADD8ri)) in rewriteArithmetic()
839 LLVM_DEBUG(dbgs() << " add cond: "; AddI->dump()); in rewriteArithmetic()
841 MI.findRegisterUseOperand(X86::EFLAGS, /*TRI=*/nullptr)->setIsKill(true); in rewriteArithmetic()
889 MachineBasicBlock::iterator Pos, in rewriteMI() argument
903 getCondOrInverseInReg(MBB, Pos, Loc, CC, CondRegs); in rewriteMI()
912 MI.setDesc(TII->get(getOpcodeWithCC(MI.getOpcode(), NewCC))); in rewriteMI()
914 MI.getOperand(MI.getDesc().getNumOperands() - 1).setImm(NewCC); in rewriteMI()
916 MI.findRegisterUseOperand(X86::EFLAGS, /*TRI=*/nullptr)->setIsKill(true); in rewriteMI()