Skip to content

Commit 962d8a8

Browse files
committed
Changes that address PR Feedback
1 parent a1155f4 commit 962d8a8

File tree

2 files changed

+39
-32
lines changed

2 files changed

+39
-32
lines changed

llvm/lib/Target/DirectX/DXILOpBuilder.cpp

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
#include "llvm/IR/Module.h"
1616
#include "llvm/Support/DXILABI.h"
1717
#include "llvm/Support/ErrorHandling.h"
18-
#include "llvm/TargetParser/Triple.h"
18+
#include <optional>
1919

2020
using namespace llvm;
2121
using namespace llvm::dxil;
@@ -151,9 +151,9 @@ struct OpCodeProperty {
151151
dxil::OpCodeClass OpCodeClass;
152152
// Offset in DXILOpCodeClassNameTable.
153153
unsigned OpCodeClassNameOffset;
154-
std::vector<OpOverload> Overloads;
155-
std::vector<OpStage> Stages;
156-
std::vector<OpAttribute> Attributes;
154+
llvm::SmallVector<OpOverload> Overloads;
155+
llvm::SmallVector<OpStage> Stages;
156+
llvm::SmallVector<OpAttribute> Attributes;
157157
int OverloadParamIndex; // parameter index which control the overload.
158158
// When < 0, should be only 1 overload type.
159159
unsigned NumOfParameters; // Number of parameters include return value.
@@ -292,7 +292,7 @@ static FunctionType *getDXILOpFunctionType(const OpCodeProperty *Prop,
292292
Type *ReturnTy, Type *OverloadTy) {
293293
SmallVector<Type *> ArgTys;
294294

295-
auto ParamKinds = getOpCodeParameterKind(*Prop);
295+
const ParameterKind *ParamKinds = getOpCodeParameterKind(*Prop);
296296

297297
// Add ReturnTy as return type of the function
298298
ArgTys.emplace_back(ReturnTy);
@@ -313,45 +313,43 @@ static FunctionType *getDXILOpFunctionType(const OpCodeProperty *Prop,
313313
/// DXIL version not greater than DXILVer.
314314
/// PropList is expected to be sorted in ascending order of DXIL version.
315315
template <typename T>
316-
static int getPropIndex(const std::vector<T> PropList,
317-
const VersionTuple DXILVer) {
318-
auto Size = PropList.size();
319-
for (int I = Size - 1; I >= 0; I--) {
320-
auto OL = PropList[I];
321-
if (VersionTuple(OL.DXILVersion.Major, OL.DXILVersion.Minor) <= DXILVer) {
322-
return I;
316+
static std::optional<size_t> getPropIndex(ArrayRef<T> PropList,
317+
const VersionTuple DXILVer) {
318+
size_t Index = PropList.size() - 1;
319+
for (auto Iter = PropList.rbegin(); Iter != PropList.rend(); Iter++, Index--) {
320+
const T& Prop = *Iter;
321+
if (VersionTuple(Prop.DXILVersion.Major, Prop.DXILVersion.Minor) <= DXILVer) {
322+
return Index;
323323
}
324324
}
325-
report_fatal_error(Twine(DXILVer.getAsString()) + ": Unknown DXIL Version",
326-
/*gen_crash_diag*/ false);
327-
328-
return -1;
325+
return std::nullopt;
329326
}
330327

331328
namespace llvm {
332329
namespace dxil {
333330

334-
// No extra checks on TargetTripleStr need be performed to verify that the
331+
// No extra checks on TargetTriple need be performed to verify that the
335332
// Triple is well-formed or that the target is supported since these checks
336333
// would have been done at the time the module M is constructed in the earlier
337334
// stages of compilation.
338335
DXILOpBuilder::DXILOpBuilder(Module &M, IRBuilderBase &B)
339-
: M(M), B(B), TargetTripleStr(M.getTargetTriple()) {}
336+
: M(M), B(B), TargetTriple(Triple(M.getTargetTriple())) {}
340337

341338
CallInst *DXILOpBuilder::createDXILOpCall(dxil::OpCode OpCode, Type *ReturnTy,
342339
Type *OverloadTy,
343340
SmallVector<Value *> Args) {
344341

345-
auto Major = Triple(TargetTripleStr).getDXILVersion().getMajor();
346-
auto MinorOrErr = Triple(TargetTripleStr).getDXILVersion().getMinor();
347-
uint32_t Minor = MinorOrErr.has_value() ? *MinorOrErr : 0;
348-
VersionTuple DXILVer(Major, Minor);
349-
// Get Shader Stage Kind
350-
Triple::EnvironmentType ShaderEnv = Triple(TargetTripleStr).getEnvironment();
342+
VersionTuple DXILVer = TargetTriple.getDXILVersion();
351343

352344
const OpCodeProperty *Prop = getOpCodeProperty(OpCode);
353-
int OlIndex = getPropIndex(Prop->Overloads, DXILVer);
354-
uint16_t ValidTyMask = Prop->Overloads[OlIndex].ValidTys;
345+
auto OlIndexOrErr = getPropIndex(ArrayRef(Prop->Overloads), DXILVer);
346+
if (!OlIndexOrErr.has_value()) {
347+
report_fatal_error(Twine(getOpCodeName(OpCode)) +
348+
": No valid overloads found for DXIL Version - " +
349+
DXILVer.getAsString(),
350+
/*gen_crash_diag*/ false);
351+
}
352+
uint16_t ValidTyMask = Prop->Overloads[*OlIndexOrErr].ValidTys;
355353

356354
OverloadKind Kind = getOverloadKind(OverloadTy);
357355

@@ -364,6 +362,8 @@ CallInst *DXILOpBuilder::createDXILOpCall(dxil::OpCode OpCode, Type *ReturnTy,
364362
/* gen_crash_diag=*/false);
365363
}
366364

365+
// Get Shader Stage Kind
366+
Triple::EnvironmentType ShaderEnv = TargetTriple.getEnvironment();
367367
// Ensure Environment type is known
368368
if (ShaderEnv == Triple::UnknownEnvironment) {
369369
report_fatal_error(
@@ -374,9 +374,15 @@ CallInst *DXILOpBuilder::createDXILOpCall(dxil::OpCode OpCode, Type *ReturnTy,
374374

375375
// Perform necessary checks to ensure Opcode is valid in the targeted shader
376376
// kind
377-
int StIndex = getPropIndex(Prop->Stages, DXILVer);
378-
uint16_t ValidShaderKindMask = Prop->Stages[StIndex].ValidStages;
379-
enum ShaderKind ModuleStagekind = getShaderKindEnum(ShaderEnv);
377+
auto StIndexOrErr = getPropIndex(ArrayRef(Prop->Stages), DXILVer);
378+
if (!StIndexOrErr.has_value()) {
379+
report_fatal_error(Twine(getOpCodeName(OpCode)) +
380+
": No valid stages found for DXIL Version - " +
381+
DXILVer.getAsString(),
382+
/*gen_crash_diag*/ false);
383+
}
384+
uint16_t ValidShaderKindMask = Prop->Stages[*StIndexOrErr].ValidStages;
385+
ShaderKind ModuleStagekind = getShaderKindEnum(ShaderEnv);
380386

381387
// Ensure valid shader stage properties are specified
382388
if (ValidShaderKindMask == ShaderKind::removed) {
@@ -392,7 +398,7 @@ CallInst *DXILOpBuilder::createDXILOpCall(dxil::OpCode OpCode, Type *ReturnTy,
392398

393399
// Verify the target shader stage is valid for the DXIL operation
394400
if (!(ValidShaderKindMask & ModuleStagekind)) {
395-
auto ShaderEnvStr = Triple(TargetTripleStr).getEnvironmentName();
401+
auto ShaderEnvStr = TargetTriple.getEnvironmentName();
396402
report_fatal_error(Twine(ShaderEnvStr) +
397403
" : Invalid Shader Stage for DXIL operation - " +
398404
getOpCodeName(OpCode) + " for DXIL Version " +
@@ -431,7 +437,7 @@ Type *DXILOpBuilder::getOverloadTy(dxil::OpCode OpCode, FunctionType *FT) {
431437
OverloadType = FT->getParamType(Prop->OverloadParamIndex - 1);
432438
}
433439

434-
const auto *ParamKinds = getOpCodeParameterKind(*Prop);
440+
const ParameterKind *ParamKinds = getOpCodeParameterKind(*Prop);
435441
auto Kind = ParamKinds[Prop->OverloadParamIndex];
436442
// For ResRet and CBufferRet, OverloadTy is in field of StructType.
437443
if (Kind == ParameterKind::CBufferRet ||

llvm/lib/Target/DirectX/DXILOpBuilder.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include "DXILConstants.h"
1616
#include "llvm/ADT/SmallVector.h"
17+
#include "llvm/TargetParser/Triple.h"
1718

1819
namespace llvm {
1920
class Module;
@@ -47,7 +48,7 @@ class DXILOpBuilder {
4748
private:
4849
Module &M;
4950
IRBuilderBase &B;
50-
std::string TargetTripleStr;
51+
Triple TargetTriple;
5152
};
5253

5354
} // namespace dxil

0 commit comments

Comments
 (0)