[llvm] [DXIL] Add constraint specification and backend implementation of DXIL Ops (PR #97593)
S. Bharadwaj Yadavalli via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 8 09:07:27 PDT 2024
================
@@ -249,19 +191,59 @@ static FunctionType *getDXILOpFunctionType(const OpCodeProperty *Prop,
ArgTys[0], ArrayRef<Type *>(&ArgTys[1], ArgTys.size() - 1), false);
}
+static int getValidConstraintIndex(const OpCodeProperty *Prop,
+ const VersionTuple SMVer) {
+ // std::vector Prop->SMConstraints is in ascending order of SM Version
+ // Overloads of highest SM version that is not greater than SMVer
+ // are the ones that are valid for SMVer.
+ auto Size = Prop->SMConstraints.size();
+ for (unsigned I = Size - 1; I >= 0; I--) {
+ auto OL = Prop->SMConstraints[I];
+ if (VersionTuple(OL.ShaderModelVer.Major, OL.ShaderModelVer.Minor) <=
+ SMVer) {
+ return I;
+ }
+ }
+ report_fatal_error(
+ StringRef(SMVer.getAsString().append(": Unhandled Shader Model Version")),
+ /*gen_crash_diag*/ false);
+
+ return -1;
+}
+
namespace llvm {
namespace dxil {
-CallInst *DXILOpBuilder::createDXILOpCall(dxil::OpCode OpCode, Type *ReturnTy,
+CallInst *DXILOpBuilder::createDXILOpCall(dxil::OpCode OpCode,
+ VersionTuple SMVer,
+ StringRef StageKind, Type *ReturnTy,
Type *OverloadTy,
SmallVector<Value *> Args) {
const OpCodeProperty *Prop = getOpCodeProperty(OpCode);
+ int Index = getValidConstraintIndex(Prop, SMVer);
+ uint16_t ValidTyMask = Prop->SMConstraints[Index].ValidTys;
OverloadKind Kind = getOverloadKind(OverloadTy);
- if ((Prop->OverloadTys & (uint16_t)Kind) == 0) {
+ if ((ValidTyMask & (uint16_t)Kind) == 0) {
report_fatal_error("Invalid Overload Type", /* gen_crash_diag=*/false);
}
+ // Ensure Opcode is valid in the targetted shader kind
+
+ uint16_t ValidShaderKindMask = Prop->SMConstraints[Index].ValidShaderKinds;
+
+ if (ValidShaderKindMask == ShaderKind::Unknown) {
+ report_fatal_error(
+ StringRef(SMVer.getAsString().append(": Unhandled Shader Kind")),
----------------
bharadwajy wrote:
> The error message is SMVer.getAsString().append(": Unhandled Shader Kind"). Should it be something like ShaderKind.getAsString().append(": Unhandled Shader Kind") or SMVer.getString().append(": Unhandled Shader Model Version") or something else?
Updated the message to emit the following (assume SM version is 6.0 and operation is `Cos`):
`LLVM ERROR: 6.0: Unknown Target Shader Stage for DXIL operation - Cos`
to signify unknown stage specification for operation `Cos` for Shader Model version 6.0
https://github.com/llvm/llvm-project/pull/97593
More information about the llvm-commits
mailing list