summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AArch64
diff options
context:
space:
mode:
authorDaniel Sanders <daniel_l_sanders@apple.com>2018-06-27 19:03:21 +0000
committerDaniel Sanders <daniel_l_sanders@apple.com>2018-06-27 19:03:21 +0000
commitbdeb880d14dfcc54b990cb32e0d0804bd24f70cf (patch)
treeac015a0069a76505232196742ae07c74bf4b299b /llvm/lib/Target/AArch64
parent6835c284a41e7604eb6ccb7bc0750327b0bd4705 (diff)
downloadbcm5719-llvm-bdeb880d14dfcc54b990cb32e0d0804bd24f70cf.tar.gz
bcm5719-llvm-bdeb880d14dfcc54b990cb32e0d0804bd24f70cf.zip
[globalisel][legalizer] Add AtomicOrdering to LegalityQuery and use it in AArch64
Now that we have the ability to legalize based on MMO's. Add support for legalizing based on AtomicOrdering and use it to correct the legalization of the atomic instructions. Also extend all() to be a variadic template as this ruleset now requires 3 and 4 argument versions. llvm-svn: 335767
Diffstat (limited to 'llvm/lib/Target/AArch64')
-rw-r--r--llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp b/llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp
index d1f3203f29f..9b8c0a34efb 100644
--- a/llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp
@@ -280,13 +280,17 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST) {
if (ST.hasLSE()) {
getActionDefinitionsBuilder(G_ATOMIC_CMPXCHG_WITH_SUCCESS)
- .lowerForCartesianProduct({s8, s16, s32, s64}, {s1}, {p0});
+ .lowerIf(all(
+ typeInSet(0, {s8, s16, s32, s64}), typeIs(1, s1), typeIs(2, p0),
+ atomicOrderingAtLeastOrStrongerThan(0, AtomicOrdering::Monotonic)));
getActionDefinitionsBuilder(
{G_ATOMICRMW_XCHG, G_ATOMICRMW_ADD, G_ATOMICRMW_SUB, G_ATOMICRMW_AND,
G_ATOMICRMW_OR, G_ATOMICRMW_XOR, G_ATOMICRMW_MIN, G_ATOMICRMW_MAX,
G_ATOMICRMW_UMIN, G_ATOMICRMW_UMAX, G_ATOMIC_CMPXCHG})
- .legalForCartesianProduct({s8, s16, s32, s64}, {p0});
+ .legalIf(all(
+ typeInSet(0, {s8, s16, s32, s64}), typeIs(1, p0),
+ atomicOrderingAtLeastOrStrongerThan(0, AtomicOrdering::Monotonic)));
}
// Merge/Unmerge
OpenPOWER on IntegriCloud