From: Krzysztof Parzyszek Date: Wed, 19 Jul 2017 18:03:46 +0000 (+0000) Subject: [Hexagon] Handle subregisters in areMemAccessesTriviallyDisjoint X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b7138c0ecd191671066789b79d5280fa2378368a;p=llvm [Hexagon] Handle subregisters in areMemAccessesTriviallyDisjoint git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308502 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/Hexagon/HexagonInstrInfo.cpp b/lib/Target/Hexagon/HexagonInstrInfo.cpp index f8d7db0af5a..370af950942 100644 --- a/lib/Target/Hexagon/HexagonInstrInfo.cpp +++ b/lib/Target/Hexagon/HexagonInstrInfo.cpp @@ -1677,9 +1677,6 @@ DFAPacketizer *HexagonInstrInfo::CreateTargetScheduleState( // Currently AA considers the addresses in these instructions to be aliasing. bool HexagonInstrInfo::areMemAccessesTriviallyDisjoint( MachineInstr &MIa, MachineInstr &MIb, AliasAnalysis *AA) const { - int OffsetA = 0, OffsetB = 0; - unsigned SizeA = 0, SizeB = 0; - if (MIa.hasUnmodeledSideEffects() || MIb.hasUnmodeledSideEffects() || MIa.hasOrderedMemoryRef() || MIb.hasOrderedMemoryRef()) return false; @@ -1689,27 +1686,47 @@ bool HexagonInstrInfo::areMemAccessesTriviallyDisjoint( if (MIa.mayLoad() && !isMemOp(MIa) && MIb.mayLoad() && !isMemOp(MIb)) return true; - // Get base, offset, and access size in MIa. - unsigned BaseRegA = getBaseAndOffset(MIa, OffsetA, SizeA); - if (!BaseRegA || !SizeA) + // Get the base register in MIa. + unsigned BasePosA, OffsetPosA; + if (!getBaseAndOffsetPosition(MIa, BasePosA, OffsetPosA)) return false; + const MachineOperand &BaseA = MIa.getOperand(BasePosA); + unsigned BaseRegA = BaseA.getReg(); + unsigned BaseSubA = BaseA.getSubReg(); - // Get base, offset, and access size in MIb. - unsigned BaseRegB = getBaseAndOffset(MIb, OffsetB, SizeB); - if (!BaseRegB || !SizeB) + // Get the base register in MIb. + unsigned BasePosB, OffsetPosB; + if (!getBaseAndOffsetPosition(MIb, BasePosB, OffsetPosB)) return false; + const MachineOperand &BaseB = MIb.getOperand(BasePosB); + unsigned BaseRegB = BaseB.getReg(); + unsigned BaseSubB = BaseB.getSubReg(); - if (BaseRegA != BaseRegB) + if (BaseRegA != BaseRegB || BaseSubA != BaseSubB) return false; + // Get the access sizes. + unsigned SizeA = (1u << (getMemAccessSize(MIa) - 1)); + unsigned SizeB = (1u << (getMemAccessSize(MIb) - 1)); + + // Get the offsets. Handle immediates only for now. + const MachineOperand &OffA = MIa.getOperand(OffsetPosA); + const MachineOperand &OffB = MIb.getOperand(OffsetPosB); + if (!MIa.getOperand(OffsetPosA).isImm() || + !MIb.getOperand(OffsetPosB).isImm()) + return false; + int OffsetA = OffA.getImm(); + int OffsetB = OffB.getImm(); + // This is a mem access with the same base register and known offsets from it. // Reason about it. if (OffsetA > OffsetB) { - uint64_t offDiff = (uint64_t)((int64_t)OffsetA - (int64_t)OffsetB); - return (SizeB <= offDiff); - } else if (OffsetA < OffsetB) { - uint64_t offDiff = (uint64_t)((int64_t)OffsetB - (int64_t)OffsetA); - return (SizeA <= offDiff); + uint64_t OffDiff = (uint64_t)((int64_t)OffsetA - (int64_t)OffsetB); + return SizeB <= OffDiff; + } + if (OffsetA < OffsetB) { + uint64_t OffDiff = (uint64_t)((int64_t)OffsetB - (int64_t)OffsetA); + return SizeA <= OffDiff; } return false;