summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/MachineScheduler.cpp
diff options
context:
space:
mode:
authorFrancis Visoiu Mistrih <francisvm@yahoo.com>2018-11-29 20:03:19 +0000
committerFrancis Visoiu Mistrih <francisvm@yahoo.com>2018-11-29 20:03:19 +0000
commit0b8dd4488e961b074cac76b952769286b4834393 (patch)
tree279c3c33f38e579af101aa2e616ff6a91780b4fe /llvm/lib/CodeGen/MachineScheduler.cpp
parentd6248978fb5d79bec27ac090a8bdb209c0aadd45 (diff)
downloadbcm5719-llvm-0b8dd4488e961b074cac76b952769286b4834393.tar.gz
bcm5719-llvm-0b8dd4488e961b074cac76b952769286b4834393.zip
[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
Diffstat (limited to 'llvm/lib/CodeGen/MachineScheduler.cpp')
-rw-r--r--llvm/lib/CodeGen/MachineScheduler.cpp22
1 files changed, 18 insertions, 4 deletions
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.");
OpenPOWER on IntegriCloud