Skip to content

Commit 7b40fbe

Browse files
account for arbitrary integer sizes, update legalizer
1 parent 56cd0a6 commit 7b40fbe

File tree

11 files changed

+73
-71
lines changed

11 files changed

+73
-71
lines changed

llvm/lib/Target/SPIRV/SPIRVLegalizerInfo.cpp

Lines changed: 53 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,13 @@ bool isTypeFoldingSupported(unsigned Opcode) {
5454
return TypeFoldingSupportingOpcs.count(Opcode) > 0;
5555
}
5656

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+
5764
SPIRVLegalizerInfo::SPIRVLegalizerInfo(const SPIRVSubtarget &ST) {
5865
using namespace TargetOpcode;
5966

@@ -143,6 +150,27 @@ SPIRVLegalizerInfo::SPIRVLegalizerInfo(const SPIRVSubtarget &ST) {
143150

144151
auto allPtrs = {p0, p1, p2, p3, p4, p5, p6};
145152

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+
146174
for (auto Opc : TypeFoldingSupportingOpcs)
147175
getActionDefinitionsBuilder(Opc).custom();
148176

@@ -182,7 +210,11 @@ SPIRVLegalizerInfo::SPIRVLegalizerInfo(const SPIRVSubtarget &ST) {
182210

183211
getActionDefinitionsBuilder({G_LOAD, G_STORE}).legalIf(typeInSet(1, allPtrs));
184212

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);
186218

187219
getActionDefinitionsBuilder(G_FMA).legalFor(allFloatScalarsAndVectors);
188220

@@ -194,13 +226,18 @@ SPIRVLegalizerInfo::SPIRVLegalizerInfo(const SPIRVSubtarget &ST) {
194226
.legalForCartesianProduct(allFloatScalarsAndVectors,
195227
allScalarsAndVectors);
196228

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);
199232

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);
202237

203-
getActionDefinitionsBuilder(G_PHI).legalFor(allPtrsScalarsAndVectors);
238+
getActionDefinitionsBuilder(G_PHI)
239+
.legalFor(allPtrsScalarsAndVectors)
240+
.legalIf(extendedPtrsScalarsAndVectors);
204241

205242
getActionDefinitionsBuilder(G_BITCAST).legalIf(
206243
all(typeInSet(0, allPtrsScalarsAndVectors),
@@ -211,11 +248,17 @@ SPIRVLegalizerInfo::SPIRVLegalizerInfo(const SPIRVSubtarget &ST) {
211248
getActionDefinitionsBuilder({G_STACKSAVE, G_STACKRESTORE}).alwaysLegal();
212249

213250
getActionDefinitionsBuilder(G_INTTOPTR)
214-
.legalForCartesianProduct(allPtrs, allIntScalars);
251+
.legalForCartesianProduct(allPtrs, allIntScalars)
252+
.legalIf(
253+
all(typeInSet(0, allPtrs), typeOfExtendedScalars(1, IsExtendedInts)));
215254
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)));
219262

220263
// ST.canDirectlyComparePointers() for pointer args is supported in
221264
// legalizeCustom().
@@ -247,10 +290,6 @@ SPIRVLegalizerInfo::SPIRVLegalizerInfo(const SPIRVSubtarget &ST) {
247290
getActionDefinitionsBuilder({G_UADDO, G_USUBO, G_SMULO, G_UMULO})
248291
.alwaysLegal();
249292

250-
// Extensions.
251-
getActionDefinitionsBuilder({G_TRUNC, G_ZEXT, G_SEXT, G_ANYEXT})
252-
.legalForCartesianProduct(allScalarsAndVectors);
253-
254293
// FP conversions.
255294
getActionDefinitionsBuilder({G_FPTRUNC, G_FPEXT})
256295
.legalForCartesianProduct(allFloatScalarsAndVectors);
@@ -310,10 +349,6 @@ SPIRVLegalizerInfo::SPIRVLegalizerInfo(const SPIRVSubtarget &ST) {
310349

311350
// Struct return types become a single scalar, so cannot easily legalize.
312351
getActionDefinitionsBuilder({G_SMULH, G_UMULH}).alwaysLegal();
313-
314-
// supported saturation arithmetic
315-
getActionDefinitionsBuilder({G_SADDSAT, G_UADDSAT, G_SSUBSAT, G_USUBSAT})
316-
.legalFor(allIntScalarsAndVectors);
317352
}
318353

319354
getLegacyLegalizerInfo().computeTables();

llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp

Lines changed: 11 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -319,46 +319,6 @@ static void widenScalarLLTNextPow2(Register Reg, MachineRegisterInfo &MRI) {
319319
MRI.setType(Reg, LLT::scalar(NewSz));
320320
}
321321

322-
inline bool getIsFloat(SPIRVType *SpvType, const SPIRVGlobalRegistry &GR) {
323-
bool IsFloat = SpvType->getOpcode() == SPIRV::OpTypeFloat;
324-
return IsFloat ? true
325-
: SpvType->getOpcode() == SPIRV::OpTypeVector &&
326-
GR.getSPIRVTypeForVReg(SpvType->getOperand(1).getReg())
327-
->getOpcode() == SPIRV::OpTypeFloat;
328-
}
329-
330-
/*
331-
static std::pair<Register, unsigned>
332-
createNewIdReg(SPIRVType *SpvType, Register SrcReg, MachineRegisterInfo &MRI,
333-
const SPIRVGlobalRegistry &GR) {
334-
if (!SpvType)
335-
SpvType = GR.getSPIRVTypeForVReg(SrcReg);
336-
assert(SpvType && "VReg is expected to have SPIRV type");
337-
LLT NewT;
338-
LLT SrcLLT = MRI.getType(SrcReg);
339-
bool IsFloat = getIsFloat(SpvType, GR);
340-
auto GetIdOp = IsFloat ? SPIRV::GET_fID : SPIRV::GET_ID;
341-
bool IsVec = SrcLLT.isVector();
342-
unsigned NumElements =
343-
IsVec ? std::max(2U, GR.getScalarOrVectorComponentCount(SpvType)) : 1;
344-
if (SrcLLT.isPointer()) {
345-
unsigned PtrSz = GR.getPointerSize();
346-
NewT = LLT::pointer(0, PtrSz);
347-
if (IsVec)
348-
NewT = LLT::fixed_vector(NumElements, NewT);
349-
GetIdOp = IsVec ? SPIRV::GET_vpID : SPIRV::GET_pID;
350-
} else if (IsVec) {
351-
NewT = LLT::fixed_vector(
352-
NumElements, LLT::scalar(GR.getScalarOrVectorBitWidth(SpvType)));
353-
GetIdOp = IsFloat ? SPIRV::GET_vfID : SPIRV::GET_vID;
354-
} else {
355-
NewT = LLT::scalar(GR.getScalarOrVectorBitWidth(SpvType));
356-
}
357-
Register IdReg = MRI.createGenericVirtualRegister(NewT);
358-
MRI.setRegClass(IdReg, GR.getRegClass(SpvType));
359-
return {IdReg, GetIdOp};
360-
}
361-
*/
362322
static std::pair<Register, unsigned>
363323
createNewIdReg(SPIRVType *SpvType, Register SrcReg, MachineRegisterInfo &MRI,
364324
const SPIRVGlobalRegistry &GR) {
@@ -454,6 +414,11 @@ generateAssignInstrs(MachineFunction &MF, SPIRVGlobalRegistry *GR,
454414
SmallVector<MachineInstr *, 10> ToErase;
455415
DenseMap<MachineInstr *, Register> RegsAlreadyAddedToDT;
456416

417+
bool IsExtendedInts =
418+
ST->canUseExtension(
419+
SPIRV::Extension::SPV_INTEL_arbitrary_precision_integers) ||
420+
ST->canUseExtension(SPIRV::Extension::SPV_KHR_bit_instructions);
421+
457422
for (MachineBasicBlock *MBB : post_order(&MF)) {
458423
if (MBB->empty())
459424
continue;
@@ -464,10 +429,12 @@ generateAssignInstrs(MachineFunction &MF, SPIRVGlobalRegistry *GR,
464429
MachineInstr &MI = *MII;
465430
unsigned MIOp = MI.getOpcode();
466431

467-
// validate bit width of scalar registers
468-
for (const auto &MOP : MI.operands())
469-
if (MOP.isReg())
470-
widenScalarLLTNextPow2(MOP.getReg(), MRI);
432+
if (!IsExtendedInts) {
433+
// validate bit width of scalar registers
434+
for (const auto &MOP : MI.operands())
435+
if (MOP.isReg())
436+
widenScalarLLTNextPow2(MOP.getReg(), MRI);
437+
}
471438

472439
if (isSpvIntrinsic(MI, Intrinsic::spv_assign_ptr_type)) {
473440
Register Reg = MI.getOperand(1).getReg();

llvm/test/CodeGen/SPIRV/hlsl-intrinsics/abs.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
1+
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
22
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %}
33

44
; CHECK: OpExtInstImport "GLSL.std.450"

llvm/test/CodeGen/SPIRV/hlsl-intrinsics/acos.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
1+
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
22
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %}
33

44
; CHECK-DAG: %[[#op_ext_glsl:]] = OpExtInstImport "GLSL.std.450"

llvm/test/CodeGen/SPIRV/hlsl-intrinsics/asin.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
1+
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
22
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %}
33

44
; CHECK-DAG: %[[#op_ext_glsl:]] = OpExtInstImport "GLSL.std.450"

llvm/test/CodeGen/SPIRV/hlsl-intrinsics/atan.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
1+
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
22
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %}
33

44
; CHECK-DAG: %[[#op_ext_glsl:]] = OpExtInstImport "GLSL.std.450"

llvm/test/CodeGen/SPIRV/hlsl-intrinsics/ceil.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
1+
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
22
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %}
33
; CHECK: OpExtInstImport "GLSL.std.450"
44

llvm/test/CodeGen/SPIRV/hlsl-intrinsics/cos.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
1+
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
22
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %}
33

44
; CHECK: OpExtInstImport "GLSL.std.450"

llvm/test/CodeGen/SPIRV/hlsl-intrinsics/cosh.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
1+
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
22
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %}
33

44
; CHECK-DAG: %[[#op_ext_glsl:]] = OpExtInstImport "GLSL.std.450"

llvm/test/CodeGen/SPIRV/hlsl-intrinsics/exp.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
1+
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
22
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %}
33

44
; CHECK: OpExtInstImport "GLSL.std.450"

llvm/test/CodeGen/SPIRV/hlsl-intrinsics/exp2.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
1+
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
22
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %}
33

44
; CHECK: OpExtInstImport "GLSL.std.450"

0 commit comments

Comments
 (0)