From 0b8dd4488e961b074cac76b952769286b4834393 Mon Sep 17 00:00:00 2001 From: Francis Visoiu Mistrih Date: Thu, 29 Nov 2018 20:03:19 +0000 Subject: [MachineScheduler] Order FI-based memops based on stack direction It makes more sense to order FI-based memops in descending order when the stack goes down. This allows offsets to stay "consecutive" and allow easier pattern matching. llvm-svn: 347906 --- llvm/lib/CodeGen/MachineScheduler.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'llvm/lib/CodeGen/MachineScheduler.cpp') diff --git a/llvm/lib/CodeGen/MachineScheduler.cpp b/llvm/lib/CodeGen/MachineScheduler.cpp index 7313d43c806..ec11586b08e 100644 --- a/llvm/lib/CodeGen/MachineScheduler.cpp +++ b/llvm/lib/CodeGen/MachineScheduler.cpp @@ -41,6 +41,7 @@ #include "llvm/CodeGen/ScheduleDFS.h" #include "llvm/CodeGen/ScheduleHazardRecognizer.h" #include "llvm/CodeGen/SlotIndexes.h" +#include "llvm/CodeGen/TargetFrameLowering.h" #include "llvm/CodeGen/TargetInstrInfo.h" #include "llvm/CodeGen/TargetLowering.h" #include "llvm/CodeGen/TargetPassConfig.h" @@ -1497,10 +1498,23 @@ class BaseMemOpClusterMutation : public ScheduleDAGMutation { return std::make_tuple(BaseOp->getReg(), Offset, SU->NodeNum) < std::make_tuple(RHS.BaseOp->getReg(), RHS.Offset, RHS.SU->NodeNum); - if (BaseOp->isFI()) - return std::make_tuple(BaseOp->getIndex(), Offset, SU->NodeNum) < - std::make_tuple(RHS.BaseOp->getIndex(), RHS.Offset, - RHS.SU->NodeNum); + if (BaseOp->isFI()) { + const MachineFunction &MF = + *BaseOp->getParent()->getParent()->getParent(); + const TargetFrameLowering &TFI = *MF.getSubtarget().getFrameLowering(); + bool StackGrowsDown = TFI.getStackGrowthDirection() == + TargetFrameLowering::StackGrowsDown; + // Can't use tuple comparison here since we might need to use a + // different order when the stack grows down. + if (BaseOp->getIndex() != RHS.BaseOp->getIndex()) + return StackGrowsDown ? BaseOp->getIndex() > RHS.BaseOp->getIndex() + : BaseOp->getIndex() < RHS.BaseOp->getIndex(); + + if (Offset != RHS.Offset) + return StackGrowsDown ? Offset > RHS.Offset : Offset < RHS.Offset; + + return SU->NodeNum < RHS.SU->NodeNum; + } llvm_unreachable("MemOpClusterMutation only supports register or frame " "index bases."); -- cgit v1.2.3