From 879087ce5b56712ccfa96b286cec49fcce95f366 Mon Sep 17 00:00:00 2001 From: Francis Visoiu Mistrih Date: Wed, 28 Nov 2018 12:00:28 +0000 Subject: [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 --- llvm/lib/CodeGen/MachineScheduler.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'llvm/lib/CodeGen/MachineScheduler.cpp') 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."); } }; -- cgit v1.2.3