diff options
| author | Daniel Sanders <daniel_l_sanders@apple.com> | 2018-06-27 19:03:21 +0000 |
|---|---|---|
| committer | Daniel Sanders <daniel_l_sanders@apple.com> | 2018-06-27 19:03:21 +0000 |
| commit | bdeb880d14dfcc54b990cb32e0d0804bd24f70cf (patch) | |
| tree | ac015a0069a76505232196742ae07c74bf4b299b /llvm/lib/Target/AArch64 | |
| parent | 6835c284a41e7604eb6ccb7bc0750327b0bd4705 (diff) | |
| download | bcm5719-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.cpp | 8 |
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 |

