[llvm] [MachinePipeliner] Improve loop carried dependence analysis (PR #94185)
Santanu Das via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 6 06:58:26 PDT 2024
================
@@ -2555,9 +2555,104 @@ bool SwingSchedulerDAG::schedulePipeline(SMSchedule &Schedule) {
return scheduleFound && Schedule.getMaxStageCount() > 0;
}
+static Register findUniqueOperandDefinedInLoop(const MachineInstr &MI) {
+ const MachineRegisterInfo &MRI = MI.getParent()->getParent()->getRegInfo();
+ Register Result;
+ for (const MachineOperand &Use : MI.all_uses()) {
+ Register Reg = Use.getReg();
+ if (!Reg.isVirtual())
+ return Register();
+ if (MRI.getVRegDef(Reg)->getParent() != MI.getParent())
+ continue;
+ if (Result)
+ return Register();
+ Result = Reg;
+ }
+ return Result;
+}
+
+/// When Op is a value that is incremented recursively in a loop and there is a
+/// unique instruction that increments it, returns true and sets Value.
+static bool findLoopIncrementValue(const MachineOperand &Op, int &Value) {
+ if (!Op.isReg() || !Op.getReg().isVirtual())
+ return false;
+
+ Register OrgReg = Op.getReg();
+ Register CurReg = OrgReg;
+ const MachineBasicBlock *LoopBB = Op.getParent()->getParent();
+ const MachineRegisterInfo &MRI = LoopBB->getParent()->getRegInfo();
+
+ const TargetInstrInfo *TII =
+ LoopBB->getParent()->getSubtarget().getInstrInfo();
+ const TargetRegisterInfo *TRI =
+ LoopBB->getParent()->getSubtarget().getRegisterInfo();
+
+ MachineInstr *Phi = nullptr;
+ MachineInstr *Increment = nullptr;
+
+ // Traverse definitions until it reaches Op or an instruction that does not
+ // satisfy the condition.
+ // Acceptable example:
+ // bb.0:
+ // %0 = PHI %3, %bb.0, ...
+ // %2 = ADD %0, Value
+ // ... = LOAD %2(Op)
+ // %3 = COPY %2
+ while (true) {
+ if (!CurReg.isValid() || !CurReg.isVirtual())
+ return false;
+ MachineInstr *Def = MRI.getVRegDef(CurReg);
+ if (Def->getParent() != LoopBB)
+ return false;
+
+ if (Def->isCopy()) {
----------------
quic-santdas wrote:
Does REG_SEQUENCE also need to be supported to arrive at the definition?
https://github.com/llvm/llvm-project/pull/94185
More information about the llvm-commits
mailing list