summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-07-19 18:03:46 +0000
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-07-19 18:03:46 +0000
commit3fce9d9c4929a1218b9119b237bfe1b64c463113 (patch)
tree52c01479a720e8253812848a3b1544e3845f853f /llvm/lib
parent5abea0c97a3810afe82b09447f435cf169b8962f (diff)
downloadbcm5719-llvm-3fce9d9c4929a1218b9119b237bfe1b64c463113.tar.gz
bcm5719-llvm-3fce9d9c4929a1218b9119b237bfe1b64c463113.zip
[Hexagon] Handle subregisters in areMemAccessesTriviallyDisjoint
llvm-svn: 308502
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp47
1 files changed, 32 insertions, 15 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp b/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp
index f8d7db0af5a..370af950942 100644
--- a/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp
+++ b/llvm/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;
OpenPOWER on IntegriCloud