summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/MachineScheduler.cpp
diff options
context:
space:
mode:
authorFrancis Visoiu Mistrih <francisvm@yahoo.com>2018-11-28 12:00:28 +0000
committerFrancis Visoiu Mistrih <francisvm@yahoo.com>2018-11-28 12:00:28 +0000
commit879087ce5b56712ccfa96b286cec49fcce95f366 (patch)
tree9daed5b277c06402db7f9890526b5b8d56758e51 /llvm/lib/CodeGen/MachineScheduler.cpp
parentd7eebd6d831fa80c3840f10120c235db65f650da (diff)
downloadbcm5719-llvm-879087ce5b56712ccfa96b286cec49fcce95f366.tar.gz
bcm5719-llvm-879087ce5b56712ccfa96b286cec49fcce95f366.zip
[MachineScheduler] Add support for clustering mem ops with FI base operands
Before this patch, the following stores in `merge_fail` would fail to be merged, while they would get merged in `merge_ok`: ``` void use(unsigned long long *); void merge_fail(unsigned key, unsigned index) { unsigned long long args[8]; args[0] = key; args[1] = index; use(args); } void merge_ok(unsigned long long *dst, unsigned a, unsigned b) { dst[0] = a; dst[1] = b; } ``` The reason is that `getMemOpBaseImmOfs` would return false for FI base operands. This adds support for this. Differential Revision: https://reviews.llvm.org/D54847 llvm-svn: 347747
Diffstat (limited to 'llvm/lib/CodeGen/MachineScheduler.cpp')
-rw-r--r--llvm/lib/CodeGen/MachineScheduler.cpp16
1 files changed, 14 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/MachineScheduler.cpp b/llvm/lib/CodeGen/MachineScheduler.cpp
index e423c89b1db..7313d43c806 100644
--- a/llvm/lib/CodeGen/MachineScheduler.cpp
+++ b/llvm/lib/CodeGen/MachineScheduler.cpp
@@ -1490,8 +1490,20 @@ class BaseMemOpClusterMutation : public ScheduleDAGMutation {
: SU(su), BaseOp(Op), Offset(ofs) {}
bool operator<(const MemOpInfo &RHS) const {
- return std::make_tuple(BaseOp->getReg(), Offset, SU->NodeNum) <
- std::make_tuple(RHS.BaseOp->getReg(), RHS.Offset, RHS.SU->NodeNum);
+ if (BaseOp->getType() != RHS.BaseOp->getType())
+ return BaseOp->getType() < RHS.BaseOp->getType();
+
+ if (BaseOp->isReg())
+ 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);
+
+ llvm_unreachable("MemOpClusterMutation only supports register or frame "
+ "index bases.");
}
};
OpenPOWER on IntegriCloud