@@ -54,6 +54,13 @@ bool isTypeFoldingSupported(unsigned Opcode) {
54
54
return TypeFoldingSupportingOpcs.count (Opcode) > 0 ;
55
55
}
56
56
57
+ LegalityPredicate typeOfExtendedScalars (unsigned TypeIdx, bool IsExtendedInts) {
58
+ return [IsExtendedInts, TypeIdx](const LegalityQuery &Query) {
59
+ const LLT Ty = Query.Types [TypeIdx];
60
+ return IsExtendedInts && Ty.isValid () && Ty.isScalar ();
61
+ };
62
+ }
63
+
57
64
SPIRVLegalizerInfo::SPIRVLegalizerInfo (const SPIRVSubtarget &ST) {
58
65
using namespace TargetOpcode ;
59
66
@@ -143,6 +150,27 @@ SPIRVLegalizerInfo::SPIRVLegalizerInfo(const SPIRVSubtarget &ST) {
143
150
144
151
auto allPtrs = {p0, p1, p2, p3, p4, p5, p6};
145
152
153
+ bool IsExtendedInts =
154
+ ST.canUseExtension (
155
+ SPIRV::Extension::SPV_INTEL_arbitrary_precision_integers) ||
156
+ ST.canUseExtension (SPIRV::Extension::SPV_KHR_bit_instructions);
157
+ auto extendedScalarsAndVectors =
158
+ [IsExtendedInts](const LegalityQuery &Query) {
159
+ const LLT Ty = Query.Types [0 ];
160
+ return IsExtendedInts && Ty.isValid () && !Ty.isPointerOrPointerVector ();
161
+ };
162
+ auto extendedScalarsAndVectorsProduct = [IsExtendedInts](
163
+ const LegalityQuery &Query) {
164
+ const LLT Ty1 = Query.Types [0 ], Ty2 = Query.Types [1 ];
165
+ return IsExtendedInts && Ty1.isValid () && Ty2.isValid () &&
166
+ !Ty1.isPointerOrPointerVector () && !Ty2.isPointerOrPointerVector ();
167
+ };
168
+ auto extendedPtrsScalarsAndVectors =
169
+ [IsExtendedInts](const LegalityQuery &Query) {
170
+ const LLT Ty = Query.Types [0 ];
171
+ return IsExtendedInts && Ty.isValid ();
172
+ };
173
+
146
174
for (auto Opc : TypeFoldingSupportingOpcs)
147
175
getActionDefinitionsBuilder (Opc).custom ();
148
176
@@ -182,7 +210,11 @@ SPIRVLegalizerInfo::SPIRVLegalizerInfo(const SPIRVSubtarget &ST) {
182
210
183
211
getActionDefinitionsBuilder ({G_LOAD, G_STORE}).legalIf (typeInSet (1 , allPtrs));
184
212
185
- getActionDefinitionsBuilder (G_BITREVERSE).legalFor (allIntScalarsAndVectors);
213
+ getActionDefinitionsBuilder ({G_SMIN, G_SMAX, G_UMIN, G_UMAX, G_ABS,
214
+ G_BITREVERSE, G_SADDSAT, G_UADDSAT, G_SSUBSAT,
215
+ G_USUBSAT})
216
+ .legalFor (allIntScalarsAndVectors)
217
+ .legalIf (extendedScalarsAndVectors);
186
218
187
219
getActionDefinitionsBuilder (G_FMA).legalFor (allFloatScalarsAndVectors);
188
220
@@ -194,13 +226,18 @@ SPIRVLegalizerInfo::SPIRVLegalizerInfo(const SPIRVSubtarget &ST) {
194
226
.legalForCartesianProduct (allFloatScalarsAndVectors,
195
227
allScalarsAndVectors);
196
228
197
- getActionDefinitionsBuilder ({G_SMIN, G_SMAX, G_UMIN, G_UMAX, G_ABS})
198
- .legalFor (allIntScalarsAndVectors);
229
+ getActionDefinitionsBuilder (G_CTPOP)
230
+ .legalForCartesianProduct (allIntScalarsAndVectors)
231
+ .legalIf (extendedScalarsAndVectorsProduct);
199
232
200
- getActionDefinitionsBuilder (G_CTPOP).legalForCartesianProduct (
201
- allIntScalarsAndVectors, allIntScalarsAndVectors);
233
+ // Extensions.
234
+ getActionDefinitionsBuilder ({G_TRUNC, G_ZEXT, G_SEXT, G_ANYEXT})
235
+ .legalForCartesianProduct (allScalarsAndVectors)
236
+ .legalIf (extendedScalarsAndVectorsProduct);
202
237
203
- getActionDefinitionsBuilder (G_PHI).legalFor (allPtrsScalarsAndVectors);
238
+ getActionDefinitionsBuilder (G_PHI)
239
+ .legalFor (allPtrsScalarsAndVectors)
240
+ .legalIf (extendedPtrsScalarsAndVectors);
204
241
205
242
getActionDefinitionsBuilder (G_BITCAST).legalIf (
206
243
all (typeInSet (0 , allPtrsScalarsAndVectors),
@@ -211,11 +248,17 @@ SPIRVLegalizerInfo::SPIRVLegalizerInfo(const SPIRVSubtarget &ST) {
211
248
getActionDefinitionsBuilder ({G_STACKSAVE, G_STACKRESTORE}).alwaysLegal ();
212
249
213
250
getActionDefinitionsBuilder (G_INTTOPTR)
214
- .legalForCartesianProduct (allPtrs, allIntScalars);
251
+ .legalForCartesianProduct (allPtrs, allIntScalars)
252
+ .legalIf (
253
+ all (typeInSet (0 , allPtrs), typeOfExtendedScalars (1 , IsExtendedInts)));
215
254
getActionDefinitionsBuilder (G_PTRTOINT)
216
- .legalForCartesianProduct (allIntScalars, allPtrs);
217
- getActionDefinitionsBuilder (G_PTR_ADD).legalForCartesianProduct (
218
- allPtrs, allIntScalars);
255
+ .legalForCartesianProduct (allIntScalars, allPtrs)
256
+ .legalIf (
257
+ all (typeOfExtendedScalars (0 , IsExtendedInts), typeInSet (1 , allPtrs)));
258
+ getActionDefinitionsBuilder (G_PTR_ADD)
259
+ .legalForCartesianProduct (allPtrs, allIntScalars)
260
+ .legalIf (
261
+ all (typeInSet (0 , allPtrs), typeOfExtendedScalars (1 , IsExtendedInts)));
219
262
220
263
// ST.canDirectlyComparePointers() for pointer args is supported in
221
264
// legalizeCustom().
@@ -247,10 +290,6 @@ SPIRVLegalizerInfo::SPIRVLegalizerInfo(const SPIRVSubtarget &ST) {
247
290
getActionDefinitionsBuilder ({G_UADDO, G_USUBO, G_SMULO, G_UMULO})
248
291
.alwaysLegal ();
249
292
250
- // Extensions.
251
- getActionDefinitionsBuilder ({G_TRUNC, G_ZEXT, G_SEXT, G_ANYEXT})
252
- .legalForCartesianProduct (allScalarsAndVectors);
253
-
254
293
// FP conversions.
255
294
getActionDefinitionsBuilder ({G_FPTRUNC, G_FPEXT})
256
295
.legalForCartesianProduct (allFloatScalarsAndVectors);
@@ -310,10 +349,6 @@ SPIRVLegalizerInfo::SPIRVLegalizerInfo(const SPIRVSubtarget &ST) {
310
349
311
350
// Struct return types become a single scalar, so cannot easily legalize.
312
351
getActionDefinitionsBuilder ({G_SMULH, G_UMULH}).alwaysLegal ();
313
-
314
- // supported saturation arithmetic
315
- getActionDefinitionsBuilder ({G_SADDSAT, G_UADDSAT, G_SSUBSAT, G_USUBSAT})
316
- .legalFor (allIntScalarsAndVectors);
317
352
}
318
353
319
354
getLegacyLegalizerInfo ().computeTables ();
0 commit comments