| Tim Northover | 69fa84a | 2016-10-14 22:18:18 +0000 | [diff] [blame] | 1 | //===- AArch64LegalizerInfo.cpp ----------------------------------*- C++ -*-==// |
| Tim Northover | 33b07d6 | 2016-07-22 20:03:43 +0000 | [diff] [blame] | 2 | // |
| Chandler Carruth | 2946cd7 | 2019-01-19 08:50:56 +0000 | [diff] [blame] | 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| Tim Northover | 33b07d6 | 2016-07-22 20:03:43 +0000 | [diff] [blame] | 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | /// \file |
| 9 | /// This file implements the targeting of the Machinelegalizer class for |
| 10 | /// AArch64. |
| 11 | /// \todo This should be generated by TableGen. |
| 12 | //===----------------------------------------------------------------------===// |
| 13 | |
| Tim Northover | 69fa84a | 2016-10-14 22:18:18 +0000 | [diff] [blame] | 14 | #include "AArch64LegalizerInfo.h" |
| Daniel Sanders | 7fe7acc | 2017-11-28 20:21:15 +0000 | [diff] [blame] | 15 | #include "AArch64Subtarget.h" |
| Amara Emerson | cf12c78 | 2019-07-19 00:24:45 +0000 | [diff] [blame] | 16 | #include "llvm/CodeGen/GlobalISel/LegalizerHelper.h" |
| Chandler Carruth | 6bda14b | 2017-06-06 11:49:48 +0000 | [diff] [blame] | 17 | #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h" |
| Amara Emerson | cf12c78 | 2019-07-19 00:24:45 +0000 | [diff] [blame] | 18 | #include "llvm/CodeGen/GlobalISel/Utils.h" |
| Tim Northover | 9136617 | 2017-02-15 23:22:50 +0000 | [diff] [blame] | 19 | #include "llvm/CodeGen/MachineInstr.h" |
| 20 | #include "llvm/CodeGen/MachineRegisterInfo.h" |
| David Blaikie | b3bde2e | 2017-11-17 01:07:10 +0000 | [diff] [blame] | 21 | #include "llvm/CodeGen/TargetOpcodes.h" |
| Craig Topper | 2fa1436 | 2018-03-29 17:21:10 +0000 | [diff] [blame] | 22 | #include "llvm/CodeGen/ValueTypes.h" |
| Tim Northover | 33b07d6 | 2016-07-22 20:03:43 +0000 | [diff] [blame] | 23 | #include "llvm/IR/DerivedTypes.h" |
| Chandler Carruth | 6bda14b | 2017-06-06 11:49:48 +0000 | [diff] [blame] | 24 | #include "llvm/IR/Type.h" |
| Tim Northover | 33b07d6 | 2016-07-22 20:03:43 +0000 | [diff] [blame] | 25 | |
| Amara Emerson | b956051 | 2019-04-11 20:32:24 +0000 | [diff] [blame] | 26 | #define DEBUG_TYPE "aarch64-legalinfo" |
| 27 | |
| Tim Northover | 33b07d6 | 2016-07-22 20:03:43 +0000 | [diff] [blame] | 28 | using namespace llvm; |
| Daniel Sanders | 9ade559 | 2018-01-29 17:37:29 +0000 | [diff] [blame] | 29 | using namespace LegalizeActions; |
| Matt Arsenault | 990f507 | 2019-01-25 00:51:00 +0000 | [diff] [blame] | 30 | using namespace LegalizeMutations; |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 31 | using namespace LegalityPredicates; |
| Kristof Beyls | af9814a | 2017-11-07 10:34:34 +0000 | [diff] [blame] | 32 | |
| Daniel Sanders | 7fe7acc | 2017-11-28 20:21:15 +0000 | [diff] [blame] | 33 | AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST) { |
| Ahmed Bougacha | ad30db3 | 2016-08-02 15:10:28 +0000 | [diff] [blame] | 34 | using namespace TargetOpcode; |
| Tim Northover | 5ae8350 | 2016-09-15 09:20:34 +0000 | [diff] [blame] | 35 | const LLT p0 = LLT::pointer(0, 64); |
| Tim Northover | ea904f9 | 2016-08-19 22:40:00 +0000 | [diff] [blame] | 36 | const LLT s1 = LLT::scalar(1); |
| Tim Northover | 9656f14 | 2016-08-04 20:54:13 +0000 | [diff] [blame] | 37 | const LLT s8 = LLT::scalar(8); |
| 38 | const LLT s16 = LLT::scalar(16); |
| Ahmed Bougacha | ad30db3 | 2016-08-02 15:10:28 +0000 | [diff] [blame] | 39 | const LLT s32 = LLT::scalar(32); |
| 40 | const LLT s64 = LLT::scalar(64); |
| Quentin Colombet | 7c114d3 | 2017-10-16 22:28:27 +0000 | [diff] [blame] | 41 | const LLT s128 = LLT::scalar(128); |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 42 | const LLT s256 = LLT::scalar(256); |
| 43 | const LLT s512 = LLT::scalar(512); |
| 44 | const LLT v16s8 = LLT::vector(16, 8); |
| 45 | const LLT v8s8 = LLT::vector(8, 8); |
| 46 | const LLT v4s8 = LLT::vector(4, 8); |
| 47 | const LLT v8s16 = LLT::vector(8, 16); |
| 48 | const LLT v4s16 = LLT::vector(4, 16); |
| 49 | const LLT v2s16 = LLT::vector(2, 16); |
| Ahmed Bougacha | ad30db3 | 2016-08-02 15:10:28 +0000 | [diff] [blame] | 50 | const LLT v2s32 = LLT::vector(2, 32); |
| 51 | const LLT v4s32 = LLT::vector(4, 32); |
| 52 | const LLT v2s64 = LLT::vector(2, 64); |
| Amara Emerson | 888dd5d | 2019-04-09 21:22:40 +0000 | [diff] [blame] | 53 | const LLT v2p0 = LLT::vector(2, p0); |
| Ahmed Bougacha | ad30db3 | 2016-08-02 15:10:28 +0000 | [diff] [blame] | 54 | |
| Amara Emerson | de81bd0 | 2019-07-24 23:00:04 +0000 | [diff] [blame] | 55 | // FIXME: support subtargets which have neon/fp-armv8 disabled. |
| 56 | if (!ST.hasNEON() || !ST.hasFPARMv8()) { |
| 57 | computeTables(); |
| 58 | return; |
| 59 | } |
| 60 | |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 61 | getActionDefinitionsBuilder(G_IMPLICIT_DEF) |
| Amara Emerson | 18e2c57 | 2019-03-19 21:43:02 +0000 | [diff] [blame] | 62 | .legalFor({p0, s1, s8, s16, s32, s64, v4s32, v2s64}) |
| Matt Arsenault | 3dddb16 | 2019-01-09 07:51:52 +0000 | [diff] [blame] | 63 | .clampScalar(0, s1, s64) |
| 64 | .widenScalarToNextPow2(0, 8) |
| 65 | .fewerElementsIf( |
| 66 | [=](const LegalityQuery &Query) { |
| 67 | return Query.Types[0].isVector() && |
| 68 | (Query.Types[0].getElementType() != s64 || |
| 69 | Query.Types[0].getNumElements() != 2); |
| 70 | }, |
| 71 | [=](const LegalityQuery &Query) { |
| 72 | LLT EltTy = Query.Types[0].getElementType(); |
| 73 | if (EltTy == s64) |
| 74 | return std::make_pair(0, LLT::vector(2, 64)); |
| 75 | return std::make_pair(0, EltTy); |
| 76 | }); |
| Tim Northover | ff5e7e1 | 2017-06-30 20:27:36 +0000 | [diff] [blame] | 77 | |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 78 | getActionDefinitionsBuilder(G_PHI) |
| Amara Emerson | 8a02aea | 2019-03-27 18:31:46 +0000 | [diff] [blame] | 79 | .legalFor({p0, s16, s32, s64, v2s32, v4s32, v2s64}) |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 80 | .clampScalar(0, s16, s64) |
| 81 | .widenScalarToNextPow2(0); |
| Aditya Nandakumar | efd8a84 | 2017-08-23 20:45:48 +0000 | [diff] [blame] | 82 | |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 83 | getActionDefinitionsBuilder(G_BSWAP) |
| Jessica Paquette | 67ab9eb | 2019-04-26 18:00:01 +0000 | [diff] [blame] | 84 | .legalFor({s32, s64, v4s32, v2s32, v2s64}) |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 85 | .clampScalar(0, s16, s64) |
| 86 | .widenScalarToNextPow2(0); |
| Aditya Nandakumar | 892979e | 2017-08-25 04:57:27 +0000 | [diff] [blame] | 87 | |
| Matt Arsenault | 30989e4 | 2019-01-22 21:42:11 +0000 | [diff] [blame] | 88 | getActionDefinitionsBuilder({G_ADD, G_SUB, G_MUL, G_AND, G_OR, G_XOR}) |
| Amara Emerson | a7ff111 | 2019-04-10 23:06:11 +0000 | [diff] [blame] | 89 | .legalFor({s32, s64, v2s32, v4s32, v2s64, v8s16, v16s8}) |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 90 | .clampScalar(0, s32, s64) |
| 91 | .widenScalarToNextPow2(0) |
| 92 | .clampNumElements(0, v2s32, v4s32) |
| 93 | .clampNumElements(0, v2s64, v2s64) |
| 94 | .moreElementsToNextPow2(0); |
| Daniel Sanders | 83e23d1 | 2017-09-19 14:25:15 +0000 | [diff] [blame] | 95 | |
| Matt Arsenault | 30989e4 | 2019-01-22 21:42:11 +0000 | [diff] [blame] | 96 | getActionDefinitionsBuilder(G_SHL) |
| 97 | .legalFor({{s32, s32}, {s64, s64}, |
| 98 | {v2s32, v2s32}, {v4s32, v4s32}, {v2s64, v2s64}}) |
| Matt Arsenault | fbec8fe | 2019-02-07 19:37:44 +0000 | [diff] [blame] | 99 | .clampScalar(1, s32, s64) |
| Matt Arsenault | 30989e4 | 2019-01-22 21:42:11 +0000 | [diff] [blame] | 100 | .clampScalar(0, s32, s64) |
| 101 | .widenScalarToNextPow2(0) |
| 102 | .clampNumElements(0, v2s32, v4s32) |
| 103 | .clampNumElements(0, v2s64, v2s64) |
| 104 | .moreElementsToNextPow2(0) |
| 105 | .minScalarSameAs(1, 0); |
| 106 | |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 107 | getActionDefinitionsBuilder(G_GEP) |
| 108 | .legalFor({{p0, s64}}) |
| 109 | .clampScalar(1, s64, s64); |
| Ahmed Bougacha | cfb384d | 2017-01-23 21:10:05 +0000 | [diff] [blame] | 110 | |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 111 | getActionDefinitionsBuilder(G_PTR_MASK).legalFor({p0}); |
| Tim Northover | 9656f14 | 2016-08-04 20:54:13 +0000 | [diff] [blame] | 112 | |
| Matt Arsenault | 30989e4 | 2019-01-22 21:42:11 +0000 | [diff] [blame] | 113 | getActionDefinitionsBuilder({G_SDIV, G_UDIV}) |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 114 | .legalFor({s32, s64}) |
| Amara Emerson | 2a2c25b | 2019-09-03 21:42:32 +0000 | [diff] [blame] | 115 | .libcallFor({s128}) |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 116 | .clampScalar(0, s32, s64) |
| Amara Emerson | ae878da | 2019-04-10 23:06:08 +0000 | [diff] [blame] | 117 | .widenScalarToNextPow2(0) |
| 118 | .scalarize(0); |
| Tim Northover | 7a753d9 | 2016-08-26 17:46:06 +0000 | [diff] [blame] | 119 | |
| Matt Arsenault | 30989e4 | 2019-01-22 21:42:11 +0000 | [diff] [blame] | 120 | getActionDefinitionsBuilder({G_LSHR, G_ASHR}) |
| Amara Emerson | cac1151 | 2019-07-03 01:49:06 +0000 | [diff] [blame] | 121 | .customIf([=](const LegalityQuery &Query) { |
| 122 | const auto &SrcTy = Query.Types[0]; |
| 123 | const auto &AmtTy = Query.Types[1]; |
| 124 | return !SrcTy.isVector() && SrcTy.getSizeInBits() == 32 && |
| 125 | AmtTy.getSizeInBits() == 32; |
| 126 | }) |
| Amara Emerson | fae979b | 2019-09-21 09:21:10 +0000 | [diff] [blame] | 127 | .legalFor({{s32, s32}, |
| 128 | {s32, s64}, |
| 129 | {s64, s64}, |
| 130 | {v2s32, v2s32}, |
| 131 | {v4s32, v4s32}, |
| 132 | {v2s64, v2s64}}) |
| Amara Emerson | 92d74f1 | 2019-04-09 21:22:37 +0000 | [diff] [blame] | 133 | .clampScalar(1, s32, s64) |
| 134 | .clampScalar(0, s32, s64) |
| 135 | .minScalarSameAs(1, 0); |
| Matt Arsenault | 30989e4 | 2019-01-22 21:42:11 +0000 | [diff] [blame] | 136 | |
| Daniel Sanders | 5281b02 | 2018-04-09 21:10:09 +0000 | [diff] [blame] | 137 | getActionDefinitionsBuilder({G_SREM, G_UREM}) |
| 138 | .lowerFor({s1, s8, s16, s32, s64}); |
| Tim Northover | cecee56 | 2016-08-26 17:46:13 +0000 | [diff] [blame] | 139 | |
| Daniel Sanders | 5281b02 | 2018-04-09 21:10:09 +0000 | [diff] [blame] | 140 | getActionDefinitionsBuilder({G_SMULO, G_UMULO}) |
| 141 | .lowerFor({{s64, s1}}); |
| Tim Northover | 0a9b279 | 2017-02-08 21:22:15 +0000 | [diff] [blame] | 142 | |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 143 | getActionDefinitionsBuilder({G_SMULH, G_UMULH}).legalFor({s32, s64}); |
| Tim Northover | 438c77c | 2016-08-25 17:37:32 +0000 | [diff] [blame] | 144 | |
| Jessica Paquette | 7d6784f | 2019-03-14 22:54:29 +0000 | [diff] [blame] | 145 | getActionDefinitionsBuilder({G_UADDE, G_USUBE, G_SADDO, G_SSUBO, G_UADDO}) |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 146 | .legalFor({{s32, s1}, {s64, s1}}); |
| Tim Northover | d8a6d7c | 2016-08-25 17:37:41 +0000 | [diff] [blame] | 147 | |
| Jessica Paquette | df5ce78 | 2019-04-23 17:37:56 +0000 | [diff] [blame] | 148 | getActionDefinitionsBuilder({G_FADD, G_FSUB, G_FMUL, G_FDIV, G_FNEG}) |
| Amara Emerson | 0bfa2fa | 2019-01-28 02:28:22 +0000 | [diff] [blame] | 149 | .legalFor({s32, s64, v2s64, v4s32, v2s32}); |
| Ahmed Bougacha | 33e19fe | 2016-08-18 16:05:11 +0000 | [diff] [blame] | 150 | |
| Jessica Paquette | dfd87f6 | 2019-04-19 16:28:08 +0000 | [diff] [blame] | 151 | getActionDefinitionsBuilder(G_FREM).libcallFor({s32, s64}); |
| Tim Northover | edb3c8c | 2016-08-29 19:07:16 +0000 | [diff] [blame] | 152 | |
| Jessica Paquette | 3cc6d1f | 2019-04-23 21:11:57 +0000 | [diff] [blame] | 153 | getActionDefinitionsBuilder({G_FCEIL, G_FABS, G_FSQRT, G_FFLOOR, G_FRINT, |
| Jessica Paquette | ba55767 | 2019-04-25 16:44:40 +0000 | [diff] [blame] | 154 | G_FMA, G_INTRINSIC_TRUNC, G_INTRINSIC_ROUND, |
| 155 | G_FNEARBYINT}) |
| Jessica Paquette | 245047d | 2019-01-24 22:00:41 +0000 | [diff] [blame] | 156 | // If we don't have full FP16 support, then scalarize the elements of |
| 157 | // vectors containing fp16 types. |
| 158 | .fewerElementsIf( |
| 159 | [=, &ST](const LegalityQuery &Query) { |
| 160 | const auto &Ty = Query.Types[0]; |
| 161 | return Ty.isVector() && Ty.getElementType() == s16 && |
| 162 | !ST.hasFullFP16(); |
| 163 | }, |
| 164 | [=](const LegalityQuery &Query) { return std::make_pair(0, s16); }) |
| Jessica Paquette | 453ab1d | 2018-12-21 17:05:26 +0000 | [diff] [blame] | 165 | // If we don't have full FP16 support, then widen s16 to s32 if we |
| 166 | // encounter it. |
| 167 | .widenScalarIf( |
| 168 | [=, &ST](const LegalityQuery &Query) { |
| 169 | return Query.Types[0] == s16 && !ST.hasFullFP16(); |
| 170 | }, |
| 171 | [=](const LegalityQuery &Query) { return std::make_pair(0, s32); }) |
| Jessica Paquette | 245047d | 2019-01-24 22:00:41 +0000 | [diff] [blame] | 172 | .legalFor({s16, s32, s64, v2s32, v4s32, v2s64, v2s16, v4s16, v8s16}); |
| Jessica Paquette | 3560e93 | 2018-12-19 19:01:36 +0000 | [diff] [blame] | 173 | |
| Jessica Paquette | 84bedac | 2019-01-30 23:46:15 +0000 | [diff] [blame] | 174 | getActionDefinitionsBuilder( |
| Jessica Paquette | dfd87f6 | 2019-04-19 16:28:08 +0000 | [diff] [blame] | 175 | {G_FCOS, G_FSIN, G_FLOG10, G_FLOG, G_FLOG2, G_FEXP, G_FEXP2, G_FPOW}) |
| Jessica Paquette | 7db82d7 | 2019-01-28 18:34:18 +0000 | [diff] [blame] | 176 | // We need a call for these, so we always need to scalarize. |
| 177 | .scalarize(0) |
| 178 | // Regardless of FP16 support, widen 16-bit elements to 32-bits. |
| 179 | .minScalar(0, s32) |
| 180 | .libcallFor({s32, s64, v2s32, v4s32, v2s64}); |
| 181 | |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 182 | getActionDefinitionsBuilder(G_INSERT) |
| 183 | .unsupportedIf([=](const LegalityQuery &Query) { |
| 184 | return Query.Types[0].getSizeInBits() <= Query.Types[1].getSizeInBits(); |
| 185 | }) |
| 186 | .legalIf([=](const LegalityQuery &Query) { |
| 187 | const LLT &Ty0 = Query.Types[0]; |
| 188 | const LLT &Ty1 = Query.Types[1]; |
| 189 | if (Ty0 != s32 && Ty0 != s64 && Ty0 != p0) |
| 190 | return false; |
| 191 | return isPowerOf2_32(Ty1.getSizeInBits()) && |
| 192 | (Ty1.getSizeInBits() == 1 || Ty1.getSizeInBits() >= 8); |
| 193 | }) |
| 194 | .clampScalar(0, s32, s64) |
| 195 | .widenScalarToNextPow2(0) |
| 196 | .maxScalarIf(typeInSet(0, {s32}), 1, s16) |
| 197 | .maxScalarIf(typeInSet(0, {s64}), 1, s32) |
| 198 | .widenScalarToNextPow2(1); |
| Tim Northover | 0e6afbd | 2017-02-06 21:56:47 +0000 | [diff] [blame] | 199 | |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 200 | getActionDefinitionsBuilder(G_EXTRACT) |
| 201 | .unsupportedIf([=](const LegalityQuery &Query) { |
| 202 | return Query.Types[0].getSizeInBits() >= Query.Types[1].getSizeInBits(); |
| 203 | }) |
| 204 | .legalIf([=](const LegalityQuery &Query) { |
| 205 | const LLT &Ty0 = Query.Types[0]; |
| 206 | const LLT &Ty1 = Query.Types[1]; |
| Amara Emerson | 511f7f5 | 2019-07-23 22:05:13 +0000 | [diff] [blame] | 207 | if (Ty1 != s32 && Ty1 != s64 && Ty1 != s128) |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 208 | return false; |
| 209 | if (Ty1 == p0) |
| 210 | return true; |
| 211 | return isPowerOf2_32(Ty0.getSizeInBits()) && |
| 212 | (Ty0.getSizeInBits() == 1 || Ty0.getSizeInBits() >= 8); |
| 213 | }) |
| Amara Emerson | 511f7f5 | 2019-07-23 22:05:13 +0000 | [diff] [blame] | 214 | .clampScalar(1, s32, s128) |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 215 | .widenScalarToNextPow2(1) |
| 216 | .maxScalarIf(typeInSet(1, {s32}), 0, s16) |
| 217 | .maxScalarIf(typeInSet(1, {s64}), 0, s32) |
| 218 | .widenScalarToNextPow2(0); |
| Tim Northover | c2d5e6d | 2017-06-26 20:34:13 +0000 | [diff] [blame] | 219 | |
| Daniel Sanders | 5eb9f58 | 2018-04-28 18:14:50 +0000 | [diff] [blame] | 220 | getActionDefinitionsBuilder({G_SEXTLOAD, G_ZEXTLOAD}) |
| Matt Arsenault | 530d05e | 2019-02-14 22:41:09 +0000 | [diff] [blame] | 221 | .legalForTypesWithMemDesc({{s32, p0, 8, 8}, |
| 222 | {s32, p0, 16, 8}, |
| 223 | {s32, p0, 32, 8}, |
| Amara Emerson | 2d37cb8 | 2019-06-04 21:51:34 +0000 | [diff] [blame] | 224 | {s64, p0, 8, 2}, |
| 225 | {s64, p0, 16, 2}, |
| 226 | {s64, p0, 32, 4}, |
| Matt Arsenault | 530d05e | 2019-02-14 22:41:09 +0000 | [diff] [blame] | 227 | {s64, p0, 64, 8}, |
| 228 | {p0, p0, 64, 8}, |
| 229 | {v2s32, p0, 64, 8}}) |
| Daniel Sanders | f84bc37 | 2018-05-05 20:53:24 +0000 | [diff] [blame] | 230 | .clampScalar(0, s32, s64) |
| 231 | .widenScalarToNextPow2(0) |
| 232 | // TODO: We could support sum-of-pow2's but the lowering code doesn't know |
| 233 | // how to do that yet. |
| 234 | .unsupportedIfMemSizeNotPow2() |
| 235 | // Lower anything left over into G_*EXT and G_LOAD |
| Daniel Sanders | 5eb9f58 | 2018-04-28 18:14:50 +0000 | [diff] [blame] | 236 | .lower(); |
| 237 | |
| Amara Emerson | b956051 | 2019-04-11 20:32:24 +0000 | [diff] [blame] | 238 | auto IsPtrVecPred = [=](const LegalityQuery &Query) { |
| 239 | const LLT &ValTy = Query.Types[0]; |
| 240 | if (!ValTy.isVector()) |
| 241 | return false; |
| 242 | const LLT EltTy = ValTy.getElementType(); |
| 243 | return EltTy.isPointer() && EltTy.getAddressSpace() == 0; |
| 244 | }; |
| 245 | |
| Daniel Sanders | f84bc37 | 2018-05-05 20:53:24 +0000 | [diff] [blame] | 246 | getActionDefinitionsBuilder(G_LOAD) |
| Matt Arsenault | 530d05e | 2019-02-14 22:41:09 +0000 | [diff] [blame] | 247 | .legalForTypesWithMemDesc({{s8, p0, 8, 8}, |
| 248 | {s16, p0, 16, 8}, |
| 249 | {s32, p0, 32, 8}, |
| 250 | {s64, p0, 64, 8}, |
| 251 | {p0, p0, 64, 8}, |
| Amara Emerson | 511f7f5 | 2019-07-23 22:05:13 +0000 | [diff] [blame] | 252 | {s128, p0, 128, 8}, |
| Jessica Paquette | 3b5119c | 2019-04-18 21:13:58 +0000 | [diff] [blame] | 253 | {v8s8, p0, 64, 8}, |
| Amara Emerson | 7e9355f | 2019-04-11 20:40:01 +0000 | [diff] [blame] | 254 | {v16s8, p0, 128, 8}, |
| 255 | {v4s16, p0, 64, 8}, |
| 256 | {v8s16, p0, 128, 8}, |
| Amara Emerson | b956051 | 2019-04-11 20:32:24 +0000 | [diff] [blame] | 257 | {v2s32, p0, 64, 8}, |
| Amara Emerson | 7e9355f | 2019-04-11 20:40:01 +0000 | [diff] [blame] | 258 | {v4s32, p0, 128, 8}, |
| Amara Emerson | b956051 | 2019-04-11 20:32:24 +0000 | [diff] [blame] | 259 | {v2s64, p0, 128, 8}}) |
| Daniel Sanders | f84bc37 | 2018-05-05 20:53:24 +0000 | [diff] [blame] | 260 | // These extends are also legal |
| Matt Arsenault | 530d05e | 2019-02-14 22:41:09 +0000 | [diff] [blame] | 261 | .legalForTypesWithMemDesc({{s32, p0, 8, 8}, |
| 262 | {s32, p0, 16, 8}}) |
| Daniel Sanders | f84bc37 | 2018-05-05 20:53:24 +0000 | [diff] [blame] | 263 | .clampScalar(0, s8, s64) |
| Amara Emerson | c835164 | 2019-08-02 23:44:24 +0000 | [diff] [blame] | 264 | .lowerIfMemSizeNotPow2() |
| Daniel Sanders | f84bc37 | 2018-05-05 20:53:24 +0000 | [diff] [blame] | 265 | // Lower any any-extending loads left into G_ANYEXT and G_LOAD |
| 266 | .lowerIf([=](const LegalityQuery &Query) { |
| Volkan Keles | f87473f | 2018-10-25 17:37:07 +0000 | [diff] [blame] | 267 | return Query.Types[0].getSizeInBits() != Query.MMODescrs[0].SizeInBits; |
| Daniel Sanders | f84bc37 | 2018-05-05 20:53:24 +0000 | [diff] [blame] | 268 | }) |
| Amara Emerson | c835164 | 2019-08-02 23:44:24 +0000 | [diff] [blame] | 269 | .widenScalarToNextPow2(0) |
| Matt Arsenault | 86504fb | 2019-02-05 16:57:18 +0000 | [diff] [blame] | 270 | .clampMaxNumElements(0, s32, 2) |
| Amara Emerson | b956051 | 2019-04-11 20:32:24 +0000 | [diff] [blame] | 271 | .clampMaxNumElements(0, s64, 1) |
| 272 | .customIf(IsPtrVecPred); |
| Daniel Sanders | f84bc37 | 2018-05-05 20:53:24 +0000 | [diff] [blame] | 273 | |
| 274 | getActionDefinitionsBuilder(G_STORE) |
| Matt Arsenault | 530d05e | 2019-02-14 22:41:09 +0000 | [diff] [blame] | 275 | .legalForTypesWithMemDesc({{s8, p0, 8, 8}, |
| 276 | {s16, p0, 16, 8}, |
| Amara Emerson | c835164 | 2019-08-02 23:44:24 +0000 | [diff] [blame] | 277 | {s32, p0, 8, 8}, |
| 278 | {s32, p0, 16, 8}, |
| Matt Arsenault | 530d05e | 2019-02-14 22:41:09 +0000 | [diff] [blame] | 279 | {s32, p0, 32, 8}, |
| 280 | {s64, p0, 64, 8}, |
| 281 | {p0, p0, 64, 8}, |
| Amara Emerson | 511f7f5 | 2019-07-23 22:05:13 +0000 | [diff] [blame] | 282 | {s128, p0, 128, 8}, |
| Amara Emerson | 7e9355f | 2019-04-11 20:40:01 +0000 | [diff] [blame] | 283 | {v16s8, p0, 128, 8}, |
| 284 | {v4s16, p0, 64, 8}, |
| 285 | {v8s16, p0, 128, 8}, |
| Jessica Paquette | e44c20a | 2019-04-01 22:19:13 +0000 | [diff] [blame] | 286 | {v2s32, p0, 64, 8}, |
| Amara Emerson | 7e9355f | 2019-04-11 20:40:01 +0000 | [diff] [blame] | 287 | {v4s32, p0, 128, 8}, |
| Jessica Paquette | e44c20a | 2019-04-01 22:19:13 +0000 | [diff] [blame] | 288 | {v2s64, p0, 128, 8}}) |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 289 | .clampScalar(0, s8, s64) |
| Amara Emerson | c835164 | 2019-08-02 23:44:24 +0000 | [diff] [blame] | 290 | .lowerIfMemSizeNotPow2() |
| Daniel Sanders | 5eb9f58 | 2018-04-28 18:14:50 +0000 | [diff] [blame] | 291 | .lowerIf([=](const LegalityQuery &Query) { |
| Daniel Sanders | 2de9d4a | 2018-04-30 17:20:01 +0000 | [diff] [blame] | 292 | return Query.Types[0].isScalar() && |
| Volkan Keles | f87473f | 2018-10-25 17:37:07 +0000 | [diff] [blame] | 293 | Query.Types[0].getSizeInBits() != Query.MMODescrs[0].SizeInBits; |
| Daniel Sanders | 5eb9f58 | 2018-04-28 18:14:50 +0000 | [diff] [blame] | 294 | }) |
| Matt Arsenault | 86504fb | 2019-02-05 16:57:18 +0000 | [diff] [blame] | 295 | .clampMaxNumElements(0, s32, 2) |
| Amara Emerson | b956051 | 2019-04-11 20:32:24 +0000 | [diff] [blame] | 296 | .clampMaxNumElements(0, s64, 1) |
| 297 | .customIf(IsPtrVecPred); |
| Tim Northover | 3c73e36 | 2016-08-23 18:20:09 +0000 | [diff] [blame] | 298 | |
| Tim Northover | b3a0be4 | 2016-08-23 21:01:20 +0000 | [diff] [blame] | 299 | // Constants |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 300 | getActionDefinitionsBuilder(G_CONSTANT) |
| Amara Emerson | 8f25a02 | 2019-06-21 16:43:50 +0000 | [diff] [blame] | 301 | .legalFor({p0, s8, s16, s32, s64}) |
| 302 | .clampScalar(0, s8, s64) |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 303 | .widenScalarToNextPow2(0); |
| 304 | getActionDefinitionsBuilder(G_FCONSTANT) |
| 305 | .legalFor({s32, s64}) |
| 306 | .clampScalar(0, s32, s64); |
| Tim Northover | ea904f9 | 2016-08-19 22:40:00 +0000 | [diff] [blame] | 307 | |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 308 | getActionDefinitionsBuilder(G_ICMP) |
| Amara Emerson | 888dd5d | 2019-04-09 21:22:40 +0000 | [diff] [blame] | 309 | .legalFor({{s32, s32}, |
| 310 | {s32, s64}, |
| 311 | {s32, p0}, |
| 312 | {v4s32, v4s32}, |
| 313 | {v2s32, v2s32}, |
| 314 | {v2s64, v2s64}, |
| 315 | {v2s64, v2p0}, |
| 316 | {v4s16, v4s16}, |
| 317 | {v8s16, v8s16}, |
| 318 | {v8s8, v8s8}, |
| 319 | {v16s8, v16s8}}) |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 320 | .clampScalar(1, s32, s64) |
| Amara Emerson | e54dc6b | 2019-07-25 21:44:52 +0000 | [diff] [blame] | 321 | .clampScalar(0, s32, s32) |
| Amara Emerson | 888dd5d | 2019-04-09 21:22:40 +0000 | [diff] [blame] | 322 | .minScalarEltSameAsIf( |
| 323 | [=](const LegalityQuery &Query) { |
| 324 | const LLT &Ty = Query.Types[0]; |
| 325 | const LLT &SrcTy = Query.Types[1]; |
| 326 | return Ty.isVector() && !SrcTy.getElementType().isPointer() && |
| 327 | Ty.getElementType() != SrcTy.getElementType(); |
| 328 | }, |
| 329 | 0, 1) |
| 330 | .minScalarOrEltIf( |
| 331 | [=](const LegalityQuery &Query) { return Query.Types[1] == v2s16; }, |
| 332 | 1, s32) |
| 333 | .minScalarOrEltIf( |
| 334 | [=](const LegalityQuery &Query) { return Query.Types[1] == v2p0; }, 0, |
| 335 | s64) |
| 336 | .widenScalarOrEltToNextPow2(1); |
| Tim Northover | 7a1ec01 | 2016-08-25 17:37:35 +0000 | [diff] [blame] | 337 | |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 338 | getActionDefinitionsBuilder(G_FCMP) |
| 339 | .legalFor({{s32, s32}, {s32, s64}}) |
| 340 | .clampScalar(0, s32, s32) |
| 341 | .clampScalar(1, s32, s64) |
| 342 | .widenScalarToNextPow2(1); |
| Tim Northover | 30bd36e | 2016-08-26 17:46:19 +0000 | [diff] [blame] | 343 | |
| Tim Northover | 2c4a838 | 2016-08-25 17:37:25 +0000 | [diff] [blame] | 344 | // Extensions |
| Amara Emerson | 7bc4fad | 2019-07-26 23:46:38 +0000 | [diff] [blame] | 345 | auto ExtLegalFunc = [=](const LegalityQuery &Query) { |
| 346 | unsigned DstSize = Query.Types[0].getSizeInBits(); |
| Jessica Paquette | 8184b6e | 2019-04-25 18:42:00 +0000 | [diff] [blame] | 347 | |
| Amara Emerson | 7bc4fad | 2019-07-26 23:46:38 +0000 | [diff] [blame] | 348 | if (DstSize == 128 && !Query.Types[0].isVector()) |
| Amara Emerson | 56606a4 | 2019-08-21 00:12:37 +0000 | [diff] [blame] | 349 | return false; // Extending to a scalar s128 needs narrowing. |
| Amara Emerson | 7bc4fad | 2019-07-26 23:46:38 +0000 | [diff] [blame] | 350 | |
| 351 | // Make sure that we have something that will fit in a register, and |
| 352 | // make sure it's a power of 2. |
| 353 | if (DstSize < 8 || DstSize > 128 || !isPowerOf2_32(DstSize)) |
| 354 | return false; |
| Jessica Paquette | 8184b6e | 2019-04-25 18:42:00 +0000 | [diff] [blame] | 355 | |
| Amara Emerson | 7bc4fad | 2019-07-26 23:46:38 +0000 | [diff] [blame] | 356 | const LLT &SrcTy = Query.Types[1]; |
| Jessica Paquette | 8184b6e | 2019-04-25 18:42:00 +0000 | [diff] [blame] | 357 | |
| Amara Emerson | 7bc4fad | 2019-07-26 23:46:38 +0000 | [diff] [blame] | 358 | // Special case for s1. |
| 359 | if (SrcTy == s1) |
| 360 | return true; |
| Jessica Paquette | 8184b6e | 2019-04-25 18:42:00 +0000 | [diff] [blame] | 361 | |
| Amara Emerson | 7bc4fad | 2019-07-26 23:46:38 +0000 | [diff] [blame] | 362 | // Make sure we fit in a register otherwise. Don't bother checking that |
| 363 | // the source type is below 128 bits. We shouldn't be allowing anything |
| 364 | // through which is wider than the destination in the first place. |
| 365 | unsigned SrcSize = SrcTy.getSizeInBits(); |
| 366 | if (SrcSize < 8 || !isPowerOf2_32(SrcSize)) |
| 367 | return false; |
| Jessica Paquette | 8184b6e | 2019-04-25 18:42:00 +0000 | [diff] [blame] | 368 | |
| Amara Emerson | 7bc4fad | 2019-07-26 23:46:38 +0000 | [diff] [blame] | 369 | return true; |
| 370 | }; |
| Amara Emerson | 56606a4 | 2019-08-21 00:12:37 +0000 | [diff] [blame] | 371 | getActionDefinitionsBuilder({G_ZEXT, G_SEXT, G_ANYEXT}) |
| Amara Emerson | 7bc4fad | 2019-07-26 23:46:38 +0000 | [diff] [blame] | 372 | .legalIf(ExtLegalFunc) |
| 373 | .clampScalar(0, s64, s64); // Just for s128, others are handled above. |
| Tim Northover | 2c4a838 | 2016-08-25 17:37:25 +0000 | [diff] [blame] | 374 | |
| Amara Emerson | 92d74f1 | 2019-04-09 21:22:37 +0000 | [diff] [blame] | 375 | getActionDefinitionsBuilder(G_TRUNC).alwaysLegal(); |
| 376 | |
| Daniel Sanders | e9a57c2 | 2019-08-09 21:11:20 +0000 | [diff] [blame] | 377 | getActionDefinitionsBuilder(G_SEXT_INREG).lower(); |
| 378 | |
| Ahmed Bougacha | 106dd03 | 2017-09-12 21:04:11 +0000 | [diff] [blame] | 379 | // FP conversions |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 380 | getActionDefinitionsBuilder(G_FPTRUNC).legalFor( |
| Jessica Paquette | e57fe23 | 2019-02-11 18:56:39 +0000 | [diff] [blame] | 381 | {{s16, s32}, {s16, s64}, {s32, s64}, {v4s16, v4s32}, {v2s32, v2s64}}); |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 382 | getActionDefinitionsBuilder(G_FPEXT).legalFor( |
| Jessica Paquette | e57fe23 | 2019-02-11 18:56:39 +0000 | [diff] [blame] | 383 | {{s32, s16}, {s64, s16}, {s64, s32}, {v4s32, v4s16}, {v2s64, v2s32}}); |
| Tim Northover | 438c77c | 2016-08-25 17:37:32 +0000 | [diff] [blame] | 384 | |
| Tim Northover | 5d0eaa4 | 2016-08-26 17:45:58 +0000 | [diff] [blame] | 385 | // Conversions |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 386 | getActionDefinitionsBuilder({G_FPTOSI, G_FPTOUI}) |
| Amara Emerson | 92ffb30 | 2019-01-28 02:27:59 +0000 | [diff] [blame] | 387 | .legalForCartesianProduct({s32, s64, v2s64, v4s32, v2s32}) |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 388 | .clampScalar(0, s32, s64) |
| 389 | .widenScalarToNextPow2(0) |
| 390 | .clampScalar(1, s32, s64) |
| 391 | .widenScalarToNextPow2(1); |
| Tim Northover | 5d0eaa4 | 2016-08-26 17:45:58 +0000 | [diff] [blame] | 392 | |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 393 | getActionDefinitionsBuilder({G_SITOFP, G_UITOFP}) |
| Amara Emerson | 92ffb30 | 2019-01-28 02:27:59 +0000 | [diff] [blame] | 394 | .legalForCartesianProduct({s32, s64, v2s64, v4s32, v2s32}) |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 395 | .clampScalar(1, s32, s64) |
| 396 | .widenScalarToNextPow2(1) |
| 397 | .clampScalar(0, s32, s64) |
| 398 | .widenScalarToNextPow2(0); |
| Tim Northover | 438c77c | 2016-08-25 17:37:32 +0000 | [diff] [blame] | 399 | |
| Tim Northover | b3a0be4 | 2016-08-23 21:01:20 +0000 | [diff] [blame] | 400 | // Control-flow |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 401 | getActionDefinitionsBuilder(G_BRCOND).legalFor({s1, s8, s16, s32}); |
| 402 | getActionDefinitionsBuilder(G_BRINDIRECT).legalFor({p0}); |
| Ahmed Bougacha | ad30db3 | 2016-08-02 15:10:28 +0000 | [diff] [blame] | 403 | |
| Tim Northover | 1d18a99 | 2016-08-26 17:46:03 +0000 | [diff] [blame] | 404 | // Select |
| Jessica Paquette | 0632e12 | 2019-03-04 21:12:46 +0000 | [diff] [blame] | 405 | // FIXME: We can probably do a bit better than just scalarizing vector |
| 406 | // selects. |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 407 | getActionDefinitionsBuilder(G_SELECT) |
| 408 | .legalFor({{s32, s1}, {s64, s1}, {p0, s1}}) |
| 409 | .clampScalar(0, s32, s64) |
| Jessica Paquette | 0632e12 | 2019-03-04 21:12:46 +0000 | [diff] [blame] | 410 | .widenScalarToNextPow2(0) |
| 411 | .scalarize(0); |
| Tim Northover | 1d18a99 | 2016-08-26 17:46:03 +0000 | [diff] [blame] | 412 | |
| Tim Northover | b3a0be4 | 2016-08-23 21:01:20 +0000 | [diff] [blame] | 413 | // Pointer-handling |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 414 | getActionDefinitionsBuilder(G_FRAME_INDEX).legalFor({p0}); |
| 415 | getActionDefinitionsBuilder(G_GLOBAL_VALUE).legalFor({p0}); |
| Ahmed Bougacha | 0306b5e | 2016-08-16 14:02:42 +0000 | [diff] [blame] | 416 | |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 417 | getActionDefinitionsBuilder(G_PTRTOINT) |
| 418 | .legalForCartesianProduct({s1, s8, s16, s32, s64}, {p0}) |
| 419 | .maxScalar(0, s64) |
| 420 | .widenScalarToNextPow2(0, /*Min*/ 8); |
| Tim Northover | 037af52c | 2016-10-31 18:31:09 +0000 | [diff] [blame] | 421 | |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 422 | getActionDefinitionsBuilder(G_INTTOPTR) |
| 423 | .unsupportedIf([&](const LegalityQuery &Query) { |
| 424 | return Query.Types[0].getSizeInBits() != Query.Types[1].getSizeInBits(); |
| 425 | }) |
| Roman Tereshin | 5a65eb7 | 2018-05-31 01:56:05 +0000 | [diff] [blame] | 426 | .legalFor({{p0, s64}}); |
| Tim Northover | 456a3c0 | 2016-08-23 19:30:38 +0000 | [diff] [blame] | 427 | |
| Quentin Colombet | 404e435 | 2016-10-12 03:57:43 +0000 | [diff] [blame] | 428 | // Casts for 32 and 64-bit width type are just copies. |
| Quentin Colombet | 7c114d3 | 2017-10-16 22:28:27 +0000 | [diff] [blame] | 429 | // Same for 128-bit width type, except they are on the FPR bank. |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 430 | getActionDefinitionsBuilder(G_BITCAST) |
| 431 | // FIXME: This is wrong since G_BITCAST is not allowed to change the |
| 432 | // number of bits but it's what the previous code described and fixing |
| 433 | // it breaks tests. |
| 434 | .legalForCartesianProduct({s1, s8, s16, s32, s64, s128, v16s8, v8s8, v4s8, |
| Amara Emerson | b956051 | 2019-04-11 20:32:24 +0000 | [diff] [blame] | 435 | v8s16, v4s16, v2s16, v4s32, v2s32, v2s64, |
| 436 | v2p0}); |
| Tim Northover | c1d8c2b | 2016-10-11 22:29:23 +0000 | [diff] [blame] | 437 | |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 438 | getActionDefinitionsBuilder(G_VASTART).legalFor({p0}); |
| Tim Northover | e9600d8 | 2017-02-08 17:57:27 +0000 | [diff] [blame] | 439 | |
| Tim Northover | 9136617 | 2017-02-15 23:22:50 +0000 | [diff] [blame] | 440 | // va_list must be a pointer, but most sized types are pretty easy to handle |
| 441 | // as the destination. |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 442 | getActionDefinitionsBuilder(G_VAARG) |
| 443 | .customForCartesianProduct({s8, s16, s32, s64, p0}, {p0}) |
| 444 | .clampScalar(0, s8, s64) |
| 445 | .widenScalarToNextPow2(0, /*Min*/ 8); |
| Tim Northover | 9136617 | 2017-02-15 23:22:50 +0000 | [diff] [blame] | 446 | |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 447 | if (ST.hasLSE()) { |
| Daniel Sanders | 5281b02 | 2018-04-09 21:10:09 +0000 | [diff] [blame] | 448 | getActionDefinitionsBuilder(G_ATOMIC_CMPXCHG_WITH_SUCCESS) |
| Daniel Sanders | bdeb880 | 2018-06-27 19:03:21 +0000 | [diff] [blame] | 449 | .lowerIf(all( |
| 450 | typeInSet(0, {s8, s16, s32, s64}), typeIs(1, s1), typeIs(2, p0), |
| 451 | atomicOrderingAtLeastOrStrongerThan(0, AtomicOrdering::Monotonic))); |
| Daniel Sanders | 7fe7acc | 2017-11-28 20:21:15 +0000 | [diff] [blame] | 452 | |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 453 | getActionDefinitionsBuilder( |
| 454 | {G_ATOMICRMW_XCHG, G_ATOMICRMW_ADD, G_ATOMICRMW_SUB, G_ATOMICRMW_AND, |
| 455 | G_ATOMICRMW_OR, G_ATOMICRMW_XOR, G_ATOMICRMW_MIN, G_ATOMICRMW_MAX, |
| Roman Tereshin | 5a65eb7 | 2018-05-31 01:56:05 +0000 | [diff] [blame] | 456 | G_ATOMICRMW_UMIN, G_ATOMICRMW_UMAX, G_ATOMIC_CMPXCHG}) |
| Daniel Sanders | bdeb880 | 2018-06-27 19:03:21 +0000 | [diff] [blame] | 457 | .legalIf(all( |
| 458 | typeInSet(0, {s8, s16, s32, s64}), typeIs(1, p0), |
| 459 | atomicOrderingAtLeastOrStrongerThan(0, AtomicOrdering::Monotonic))); |
| Daniel Sanders | 7fe7acc | 2017-11-28 20:21:15 +0000 | [diff] [blame] | 460 | } |
| 461 | |
| Amara Emerson | 0e86c07 | 2018-07-31 00:08:56 +0000 | [diff] [blame] | 462 | getActionDefinitionsBuilder(G_BLOCK_ADDR).legalFor({p0}); |
| 463 | |
| Volkan Keles | a32ff00 | 2017-12-01 08:19:10 +0000 | [diff] [blame] | 464 | // Merge/Unmerge |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 465 | for (unsigned Op : {G_MERGE_VALUES, G_UNMERGE_VALUES}) { |
| 466 | unsigned BigTyIdx = Op == G_MERGE_VALUES ? 0 : 1; |
| 467 | unsigned LitTyIdx = Op == G_MERGE_VALUES ? 1 : 0; |
| 468 | |
| 469 | auto notValidElt = [](const LegalityQuery &Query, unsigned TypeIdx) { |
| 470 | const LLT &Ty = Query.Types[TypeIdx]; |
| 471 | if (Ty.isVector()) { |
| 472 | const LLT &EltTy = Ty.getElementType(); |
| 473 | if (EltTy.getSizeInBits() < 8 || EltTy.getSizeInBits() > 64) |
| 474 | return true; |
| 475 | if (!isPowerOf2_32(EltTy.getSizeInBits())) |
| 476 | return true; |
| Volkan Keles | a32ff00 | 2017-12-01 08:19:10 +0000 | [diff] [blame] | 477 | } |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 478 | return false; |
| 479 | }; |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 480 | |
| 481 | // FIXME: This rule is horrible, but specifies the same as what we had |
| 482 | // before with the particularly strange definitions removed (e.g. |
| 483 | // s8 = G_MERGE_VALUES s32, s32). |
| 484 | // Part of the complexity comes from these ops being extremely flexible. For |
| 485 | // example, you can build/decompose vectors with it, concatenate vectors, |
| 486 | // etc. and in addition to this you can also bitcast with it at the same |
| 487 | // time. We've been considering breaking it up into multiple ops to make it |
| 488 | // more manageable throughout the backend. |
| 489 | getActionDefinitionsBuilder(Op) |
| 490 | // Break up vectors with weird elements into scalars |
| 491 | .fewerElementsIf( |
| 492 | [=](const LegalityQuery &Query) { return notValidElt(Query, 0); }, |
| Matt Arsenault | 990f507 | 2019-01-25 00:51:00 +0000 | [diff] [blame] | 493 | scalarize(0)) |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 494 | .fewerElementsIf( |
| 495 | [=](const LegalityQuery &Query) { return notValidElt(Query, 1); }, |
| Matt Arsenault | 990f507 | 2019-01-25 00:51:00 +0000 | [diff] [blame] | 496 | scalarize(1)) |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 497 | // Clamp the big scalar to s8-s512 and make it either a power of 2, 192, |
| 498 | // or 384. |
| 499 | .clampScalar(BigTyIdx, s8, s512) |
| 500 | .widenScalarIf( |
| 501 | [=](const LegalityQuery &Query) { |
| 502 | const LLT &Ty = Query.Types[BigTyIdx]; |
| 503 | return !isPowerOf2_32(Ty.getSizeInBits()) && |
| 504 | Ty.getSizeInBits() % 64 != 0; |
| 505 | }, |
| 506 | [=](const LegalityQuery &Query) { |
| 507 | // Pick the next power of 2, or a multiple of 64 over 128. |
| 508 | // Whichever is smaller. |
| 509 | const LLT &Ty = Query.Types[BigTyIdx]; |
| 510 | unsigned NewSizeInBits = 1 |
| 511 | << Log2_32_Ceil(Ty.getSizeInBits() + 1); |
| 512 | if (NewSizeInBits >= 256) { |
| 513 | unsigned RoundedTo = alignTo<64>(Ty.getSizeInBits() + 1); |
| 514 | if (RoundedTo < NewSizeInBits) |
| 515 | NewSizeInBits = RoundedTo; |
| 516 | } |
| 517 | return std::make_pair(BigTyIdx, LLT::scalar(NewSizeInBits)); |
| 518 | }) |
| 519 | // Clamp the little scalar to s8-s256 and make it a power of 2. It's not |
| 520 | // worth considering the multiples of 64 since 2*192 and 2*384 are not |
| 521 | // valid. |
| 522 | .clampScalar(LitTyIdx, s8, s256) |
| 523 | .widenScalarToNextPow2(LitTyIdx, /*Min*/ 8) |
| 524 | // So at this point, we have s8, s16, s32, s64, s128, s192, s256, s384, |
| 525 | // s512, <X x s8>, <X x s16>, <X x s32>, or <X x s64>. |
| 526 | // At this point it's simple enough to accept the legal types. |
| 527 | .legalIf([=](const LegalityQuery &Query) { |
| 528 | const LLT &BigTy = Query.Types[BigTyIdx]; |
| 529 | const LLT &LitTy = Query.Types[LitTyIdx]; |
| 530 | if (BigTy.isVector() && BigTy.getSizeInBits() < 32) |
| 531 | return false; |
| 532 | if (LitTy.isVector() && LitTy.getSizeInBits() < 32) |
| 533 | return false; |
| 534 | return BigTy.getSizeInBits() % LitTy.getSizeInBits() == 0; |
| 535 | }) |
| 536 | // Any vectors left are the wrong size. Scalarize them. |
| Matt Arsenault | 990f507 | 2019-01-25 00:51:00 +0000 | [diff] [blame] | 537 | .scalarize(0) |
| 538 | .scalarize(1); |
| Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 539 | } |
| Volkan Keles | a32ff00 | 2017-12-01 08:19:10 +0000 | [diff] [blame] | 540 | |
| Amara Emerson | cbd86d8 | 2018-10-25 14:04:54 +0000 | [diff] [blame] | 541 | getActionDefinitionsBuilder(G_EXTRACT_VECTOR_ELT) |
| 542 | .unsupportedIf([=](const LegalityQuery &Query) { |
| 543 | const LLT &EltTy = Query.Types[1].getElementType(); |
| 544 | return Query.Types[0] != EltTy; |
| 545 | }) |
| 546 | .minScalar(2, s64) |
| 547 | .legalIf([=](const LegalityQuery &Query) { |
| 548 | const LLT &VecTy = Query.Types[1]; |
| Jessica Paquette | f54258c | 2019-04-25 20:00:57 +0000 | [diff] [blame] | 549 | return VecTy == v2s16 || VecTy == v4s16 || VecTy == v8s16 || |
| 550 | VecTy == v4s32 || VecTy == v2s64 || VecTy == v2s32; |
| Amara Emerson | cbd86d8 | 2018-10-25 14:04:54 +0000 | [diff] [blame] | 551 | }); |
| 552 | |
| Jessica Paquette | 5aff1f4 | 2019-03-14 18:01:30 +0000 | [diff] [blame] | 553 | getActionDefinitionsBuilder(G_INSERT_VECTOR_ELT) |
| 554 | .legalIf([=](const LegalityQuery &Query) { |
| 555 | const LLT &VecTy = Query.Types[0]; |
| Jessica Paquette | 5aff1f4 | 2019-03-14 18:01:30 +0000 | [diff] [blame] | 556 | // TODO: Support s8 and s16 |
| Jessica Paquette | d3ffd47 | 2019-03-29 21:39:36 +0000 | [diff] [blame] | 557 | return VecTy == v2s32 || VecTy == v4s32 || VecTy == v2s64; |
| Jessica Paquette | 5aff1f4 | 2019-03-14 18:01:30 +0000 | [diff] [blame] | 558 | }); |
| 559 | |
| Amara Emerson | 5ec1460 | 2018-12-10 18:44:58 +0000 | [diff] [blame] | 560 | getActionDefinitionsBuilder(G_BUILD_VECTOR) |
| Jessica Paquette | 7db82d7 | 2019-01-28 18:34:18 +0000 | [diff] [blame] | 561 | .legalFor({{v4s16, s16}, |
| 562 | {v8s16, s16}, |
| 563 | {v2s32, s32}, |
| 564 | {v4s32, s32}, |
| Amara Emerson | 213e0bd | 2019-04-10 23:06:14 +0000 | [diff] [blame] | 565 | {v2p0, p0}, |
| Jessica Paquette | 7db82d7 | 2019-01-28 18:34:18 +0000 | [diff] [blame] | 566 | {v2s64, s64}}) |
| Amara Emerson | 5ec1460 | 2018-12-10 18:44:58 +0000 | [diff] [blame] | 567 | .clampNumElements(0, v4s32, v4s32) |
| 568 | .clampNumElements(0, v2s64, v2s64) |
| 569 | |
| 570 | // Deal with larger scalar types, which will be implicitly truncated. |
| 571 | .legalIf([=](const LegalityQuery &Query) { |
| 572 | return Query.Types[0].getScalarSizeInBits() < |
| 573 | Query.Types[1].getSizeInBits(); |
| 574 | }) |
| 575 | .minScalarSameAs(1, 0); |
| 576 | |
| Jessica Paquette | b53e0f4 | 2019-02-18 23:33:24 +0000 | [diff] [blame] | 577 | getActionDefinitionsBuilder(G_CTLZ).legalForCartesianProduct( |
| 578 | {s32, s64, v8s8, v16s8, v4s16, v8s16, v2s32, v4s32}) |
| 579 | .scalarize(1); |
| 580 | |
| Amara Emerson | 1abe05c | 2019-02-21 20:20:16 +0000 | [diff] [blame] | 581 | getActionDefinitionsBuilder(G_SHUFFLE_VECTOR) |
| 582 | .legalIf([=](const LegalityQuery &Query) { |
| 583 | const LLT &DstTy = Query.Types[0]; |
| 584 | const LLT &SrcTy = Query.Types[1]; |
| 585 | // For now just support the TBL2 variant which needs the source vectors |
| 586 | // to be the same size as the dest. |
| 587 | if (DstTy != SrcTy) |
| 588 | return false; |
| 589 | for (auto &Ty : {v2s32, v4s32, v2s64}) { |
| 590 | if (DstTy == Ty) |
| 591 | return true; |
| 592 | } |
| 593 | return false; |
| 594 | }) |
| 595 | // G_SHUFFLE_VECTOR can have scalar sources (from 1 x s vectors), we |
| 596 | // just want those lowered into G_BUILD_VECTOR |
| 597 | .lowerIf([=](const LegalityQuery &Query) { |
| 598 | return !Query.Types[1].isVector(); |
| 599 | }) |
| 600 | .clampNumElements(0, v4s32, v4s32) |
| 601 | .clampNumElements(0, v2s64, v2s64); |
| 602 | |
| Amara Emerson | 2ff2298 | 2019-03-14 22:48:15 +0000 | [diff] [blame] | 603 | getActionDefinitionsBuilder(G_CONCAT_VECTORS) |
| 604 | .legalFor({{v4s32, v2s32}, {v8s16, v4s16}}); |
| 605 | |
| Amara Emerson | 6e71b34 | 2019-06-21 18:10:41 +0000 | [diff] [blame] | 606 | getActionDefinitionsBuilder(G_JUMP_TABLE) |
| 607 | .legalFor({{p0}, {s64}}); |
| 608 | |
| 609 | getActionDefinitionsBuilder(G_BRJT).legalIf([=](const LegalityQuery &Query) { |
| 610 | return Query.Types[0] == p0 && Query.Types[1] == s64; |
| 611 | }); |
| 612 | |
| Amara Emerson | e20b91c | 2019-08-27 19:54:27 +0000 | [diff] [blame] | 613 | getActionDefinitionsBuilder(G_DYN_STACKALLOC).lower(); |
| 614 | |
| Tim Northover | 33b07d6 | 2016-07-22 20:03:43 +0000 | [diff] [blame] | 615 | computeTables(); |
| Roman Tereshin | 8f1753e | 2018-05-30 22:10:04 +0000 | [diff] [blame] | 616 | verify(*ST.getInstrInfo()); |
| Tim Northover | 33b07d6 | 2016-07-22 20:03:43 +0000 | [diff] [blame] | 617 | } |
| Tim Northover | 9136617 | 2017-02-15 23:22:50 +0000 | [diff] [blame] | 618 | |
| 619 | bool AArch64LegalizerInfo::legalizeCustom(MachineInstr &MI, |
| 620 | MachineRegisterInfo &MRI, |
| Aditya Nandakumar | f75d4f3 | 2018-12-05 20:14:52 +0000 | [diff] [blame] | 621 | MachineIRBuilder &MIRBuilder, |
| 622 | GISelChangeObserver &Observer) const { |
| Tim Northover | 9136617 | 2017-02-15 23:22:50 +0000 | [diff] [blame] | 623 | switch (MI.getOpcode()) { |
| 624 | default: |
| 625 | // No idea what to do. |
| 626 | return false; |
| 627 | case TargetOpcode::G_VAARG: |
| 628 | return legalizeVaArg(MI, MRI, MIRBuilder); |
| Amara Emerson | b956051 | 2019-04-11 20:32:24 +0000 | [diff] [blame] | 629 | case TargetOpcode::G_LOAD: |
| 630 | case TargetOpcode::G_STORE: |
| 631 | return legalizeLoadStore(MI, MRI, MIRBuilder, Observer); |
| Amara Emerson | cac1151 | 2019-07-03 01:49:06 +0000 | [diff] [blame] | 632 | case TargetOpcode::G_SHL: |
| 633 | case TargetOpcode::G_ASHR: |
| 634 | case TargetOpcode::G_LSHR: |
| 635 | return legalizeShlAshrLshr(MI, MRI, MIRBuilder, Observer); |
| Tim Northover | 9136617 | 2017-02-15 23:22:50 +0000 | [diff] [blame] | 636 | } |
| 637 | |
| 638 | llvm_unreachable("expected switch to return"); |
| 639 | } |
| 640 | |
| Amara Emerson | cf12c78 | 2019-07-19 00:24:45 +0000 | [diff] [blame] | 641 | bool AArch64LegalizerInfo::legalizeIntrinsic( |
| 642 | MachineInstr &MI, MachineRegisterInfo &MRI, |
| 643 | MachineIRBuilder &MIRBuilder) const { |
| 644 | switch (MI.getIntrinsicID()) { |
| 645 | case Intrinsic::memcpy: |
| 646 | case Intrinsic::memset: |
| 647 | case Intrinsic::memmove: |
| 648 | if (createMemLibcall(MIRBuilder, MRI, MI) == |
| 649 | LegalizerHelper::UnableToLegalize) |
| 650 | return false; |
| 651 | MI.eraseFromParent(); |
| 652 | return true; |
| 653 | default: |
| 654 | break; |
| 655 | } |
| 656 | return true; |
| 657 | } |
| 658 | |
| Amara Emerson | cac1151 | 2019-07-03 01:49:06 +0000 | [diff] [blame] | 659 | bool AArch64LegalizerInfo::legalizeShlAshrLshr( |
| 660 | MachineInstr &MI, MachineRegisterInfo &MRI, MachineIRBuilder &MIRBuilder, |
| 661 | GISelChangeObserver &Observer) const { |
| 662 | assert(MI.getOpcode() == TargetOpcode::G_ASHR || |
| 663 | MI.getOpcode() == TargetOpcode::G_LSHR || |
| 664 | MI.getOpcode() == TargetOpcode::G_SHL); |
| 665 | // If the shift amount is a G_CONSTANT, promote it to a 64 bit type so the |
| 666 | // imported patterns can select it later. Either way, it will be legal. |
| 667 | Register AmtReg = MI.getOperand(2).getReg(); |
| 668 | auto *CstMI = MRI.getVRegDef(AmtReg); |
| 669 | assert(CstMI && "expected to find a vreg def"); |
| 670 | if (CstMI->getOpcode() != TargetOpcode::G_CONSTANT) |
| 671 | return true; |
| 672 | // Check the shift amount is in range for an immediate form. |
| 673 | unsigned Amount = CstMI->getOperand(1).getCImm()->getZExtValue(); |
| 674 | if (Amount > 31) |
| 675 | return true; // This will have to remain a register variant. |
| 676 | assert(MRI.getType(AmtReg).getSizeInBits() == 32); |
| 677 | MIRBuilder.setInstr(MI); |
| 678 | auto ExtCst = MIRBuilder.buildZExt(LLT::scalar(64), AmtReg); |
| 679 | MI.getOperand(2).setReg(ExtCst.getReg(0)); |
| 680 | return true; |
| 681 | } |
| 682 | |
| Amara Emerson | b956051 | 2019-04-11 20:32:24 +0000 | [diff] [blame] | 683 | bool AArch64LegalizerInfo::legalizeLoadStore( |
| 684 | MachineInstr &MI, MachineRegisterInfo &MRI, MachineIRBuilder &MIRBuilder, |
| 685 | GISelChangeObserver &Observer) const { |
| 686 | assert(MI.getOpcode() == TargetOpcode::G_STORE || |
| 687 | MI.getOpcode() == TargetOpcode::G_LOAD); |
| 688 | // Here we just try to handle vector loads/stores where our value type might |
| 689 | // have pointer elements, which the SelectionDAG importer can't handle. To |
| 690 | // allow the existing patterns for s64 to fire for p0, we just try to bitcast |
| 691 | // the value to use s64 types. |
| 692 | |
| 693 | // Custom legalization requires the instruction, if not deleted, must be fully |
| 694 | // legalized. In order to allow further legalization of the inst, we create |
| 695 | // a new instruction and erase the existing one. |
| 696 | |
| Daniel Sanders | d9934d4 | 2019-08-06 17:16:27 +0000 | [diff] [blame] | 697 | Register ValReg = MI.getOperand(0).getReg(); |
| Amara Emerson | b956051 | 2019-04-11 20:32:24 +0000 | [diff] [blame] | 698 | const LLT ValTy = MRI.getType(ValReg); |
| 699 | |
| 700 | if (!ValTy.isVector() || !ValTy.getElementType().isPointer() || |
| 701 | ValTy.getElementType().getAddressSpace() != 0) { |
| 702 | LLVM_DEBUG(dbgs() << "Tried to do custom legalization on wrong load/store"); |
| 703 | return false; |
| 704 | } |
| 705 | |
| 706 | MIRBuilder.setInstr(MI); |
| 707 | unsigned PtrSize = ValTy.getElementType().getSizeInBits(); |
| 708 | const LLT NewTy = LLT::vector(ValTy.getNumElements(), PtrSize); |
| 709 | auto &MMO = **MI.memoperands_begin(); |
| 710 | if (MI.getOpcode() == TargetOpcode::G_STORE) { |
| 711 | auto Bitcast = MIRBuilder.buildBitcast({NewTy}, {ValReg}); |
| 712 | MIRBuilder.buildStore(Bitcast.getReg(0), MI.getOperand(1).getReg(), MMO); |
| 713 | } else { |
| Daniel Sanders | 5ae66e5 | 2019-08-12 22:40:53 +0000 | [diff] [blame] | 714 | Register NewReg = MRI.createGenericVirtualRegister(NewTy); |
| Amara Emerson | b956051 | 2019-04-11 20:32:24 +0000 | [diff] [blame] | 715 | auto NewLoad = MIRBuilder.buildLoad(NewReg, MI.getOperand(1).getReg(), MMO); |
| 716 | MIRBuilder.buildBitcast({ValReg}, {NewLoad}); |
| 717 | } |
| 718 | MI.eraseFromParent(); |
| 719 | return true; |
| 720 | } |
| 721 | |
| Tim Northover | 9136617 | 2017-02-15 23:22:50 +0000 | [diff] [blame] | 722 | bool AArch64LegalizerInfo::legalizeVaArg(MachineInstr &MI, |
| 723 | MachineRegisterInfo &MRI, |
| 724 | MachineIRBuilder &MIRBuilder) const { |
| 725 | MIRBuilder.setInstr(MI); |
| 726 | MachineFunction &MF = MIRBuilder.getMF(); |
| 727 | unsigned Align = MI.getOperand(2).getImm(); |
| Matt Arsenault | 079f77b | 2019-07-08 16:27:47 +0000 | [diff] [blame] | 728 | Register Dst = MI.getOperand(0).getReg(); |
| 729 | Register ListPtr = MI.getOperand(1).getReg(); |
| Tim Northover | 9136617 | 2017-02-15 23:22:50 +0000 | [diff] [blame] | 730 | |
| 731 | LLT PtrTy = MRI.getType(ListPtr); |
| 732 | LLT IntPtrTy = LLT::scalar(PtrTy.getSizeInBits()); |
| 733 | |
| 734 | const unsigned PtrSize = PtrTy.getSizeInBits() / 8; |
| Matt Arsenault | 079f77b | 2019-07-08 16:27:47 +0000 | [diff] [blame] | 735 | Register List = MRI.createGenericVirtualRegister(PtrTy); |
| Tim Northover | 9136617 | 2017-02-15 23:22:50 +0000 | [diff] [blame] | 736 | MIRBuilder.buildLoad( |
| 737 | List, ListPtr, |
| 738 | *MF.getMachineMemOperand(MachinePointerInfo(), MachineMemOperand::MOLoad, |
| 739 | PtrSize, /* Align = */ PtrSize)); |
| 740 | |
| Matt Arsenault | 079f77b | 2019-07-08 16:27:47 +0000 | [diff] [blame] | 741 | Register DstPtr; |
| Tim Northover | 9136617 | 2017-02-15 23:22:50 +0000 | [diff] [blame] | 742 | if (Align > PtrSize) { |
| 743 | // Realign the list to the actual required alignment. |
| Aditya Nandakumar | 1745121 | 2017-07-06 19:40:07 +0000 | [diff] [blame] | 744 | auto AlignMinus1 = MIRBuilder.buildConstant(IntPtrTy, Align - 1); |
| Tim Northover | 9136617 | 2017-02-15 23:22:50 +0000 | [diff] [blame] | 745 | |
| Matt Arsenault | 079f77b | 2019-07-08 16:27:47 +0000 | [diff] [blame] | 746 | auto ListTmp = MIRBuilder.buildGEP(PtrTy, List, AlignMinus1.getReg(0)); |
| Tim Northover | 9136617 | 2017-02-15 23:22:50 +0000 | [diff] [blame] | 747 | |
| 748 | DstPtr = MRI.createGenericVirtualRegister(PtrTy); |
| 749 | MIRBuilder.buildPtrMask(DstPtr, ListTmp, Log2_64(Align)); |
| 750 | } else |
| 751 | DstPtr = List; |
| 752 | |
| 753 | uint64_t ValSize = MRI.getType(Dst).getSizeInBits() / 8; |
| 754 | MIRBuilder.buildLoad( |
| 755 | Dst, DstPtr, |
| 756 | *MF.getMachineMemOperand(MachinePointerInfo(), MachineMemOperand::MOLoad, |
| 757 | ValSize, std::max(Align, PtrSize))); |
| 758 | |
| Amara Emerson | 946b124 | 2019-04-15 05:04:20 +0000 | [diff] [blame] | 759 | auto Size = MIRBuilder.buildConstant(IntPtrTy, alignTo(ValSize, PtrSize)); |
| Tim Northover | 9136617 | 2017-02-15 23:22:50 +0000 | [diff] [blame] | 760 | |
| Matt Arsenault | 079f77b | 2019-07-08 16:27:47 +0000 | [diff] [blame] | 761 | auto NewList = MIRBuilder.buildGEP(PtrTy, DstPtr, Size.getReg(0)); |
| Tim Northover | 9136617 | 2017-02-15 23:22:50 +0000 | [diff] [blame] | 762 | |
| 763 | MIRBuilder.buildStore( |
| 764 | NewList, ListPtr, |
| 765 | *MF.getMachineMemOperand(MachinePointerInfo(), MachineMemOperand::MOStore, |
| 766 | PtrSize, /* Align = */ PtrSize)); |
| 767 | |
| 768 | MI.eraseFromParent(); |
| 769 | return true; |
| 770 | } |