diff options
author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-05-06 19:13:38 +0000 |
---|---|---|
committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-05-06 19:13:38 +0000 |
commit | 687c1919cc8a0d5457fca78bd71061f7c9a8f2fc (patch) | |
tree | 226c04b58aeb0d79a30dd449aea03c0936ba8b81 /lib/Target/Hexagon/HexagonVLIWPacketizer.cpp | |
parent | 881d4a05e3b5045332a78d190cd9379ed18bc20e (diff) |
[Hexagon] Be careful about anti-dependencies with a call in packetizer
In a case like
J2_callr <ga:@foo>, %R0<imp-use>, ...
R0<def> = ...
the anti-dependency on R0 cannot be ignored and the two instructions
cannot be packetized together, since if they were, the assignment to
R0 would take place before the call.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@268776 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/Hexagon/HexagonVLIWPacketizer.cpp')
-rw-r--r-- | lib/Target/Hexagon/HexagonVLIWPacketizer.cpp | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp b/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp index 4630c98b46f..b4a5d2a4876 100644 --- a/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp +++ b/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp @@ -1402,8 +1402,30 @@ bool HexagonPacketizerList::isLegalToPacketizeTogether(SUnit *SUI, SUnit *SUJ) { } } - // Skip over anti-dependences. Two instructions that are anti-dependent - // can share a packet. + // There are certain anti-dependencies that cannot be ignored. + // Specifically: + // J2_call ... %R0<imp-def> ; SUJ + // R0 = ... ; SUI + // Those cannot be packetized together, since the call will observe + // the effect of the assignment to R0. + if (DepType == SDep::Anti && J->isCall()) { + // Check if I defines any volatile register. We should also check + // registers that the call may read, but these happen to be a + // subset of the volatile register set. + for (const MCPhysReg *P = J->getDesc().ImplicitDefs; P && *P; ++P) { + if (!I->modifiesRegister(*P, HRI)) + continue; + FoundSequentialDependence = true; + break; + } + } + + // Skip over remaining anti-dependences. Two instructions that are + // anti-dependent can share a packet, since in most such cases all + // operands are read before any modifications take place. + // The exceptions are branch and call instructions, since they are + // executed after all other instructions have completed (at least + // conceptually). if (DepType != SDep::Anti) { FoundSequentialDependence = true; break; |