diff options
| author | Yong He <yonghe@outlook.com> | 2024-12-09 04:47:53 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-12-09 20:47:53 +0800 |
| commit | 051ae8acec0a641bcaf86e7eeff35eff29e8922d (patch) | |
| tree | 4e385415742ad98c8842454fda14a9abb8112cb2 /source | |
| parent | 71e90a7ba78d0566e3b7da54df48f9af598e4cbb (diff) | |
Fix crash during emitCast of attributed type, allow MaxIters to take linktime const. (#5791)
* Fix crash during emitCast of attributed type.
* Allow [MaxIters] to take link time constants.
---------
Co-authored-by: Ellie Hermaszewska <ellieh@nvidia.com>
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/slang-ast-modifier.h | 2 | ||||
| -rw-r--r-- | source/slang/slang-check-modifier.cpp | 6 | ||||
| -rw-r--r-- | source/slang/slang-ir-insts.h | 9 | ||||
| -rw-r--r-- | source/slang/slang-ir.cpp | 2 | ||||
| -rw-r--r-- | source/slang/slang-lower-to-ir.cpp | 16 |
5 files changed, 21 insertions, 14 deletions
diff --git a/source/slang/slang-ast-modifier.h b/source/slang/slang-ast-modifier.h index ee9b55334..863ffaef2 100644 --- a/source/slang/slang-ast-modifier.h +++ b/source/slang/slang-ast-modifier.h @@ -744,7 +744,7 @@ class MaxItersAttribute : public Attribute { SLANG_AST_CLASS(MaxItersAttribute) - int32_t value = 0; + IntVal* value = 0; }; // An inferred max iteration count on a loop. diff --git a/source/slang/slang-check-modifier.cpp b/source/slang/slang-check-modifier.cpp index 0794279a7..a1e0f7876 100644 --- a/source/slang/slang-check-modifier.cpp +++ b/source/slang/slang-check-modifier.cpp @@ -720,11 +720,7 @@ Modifier* SemanticsVisitor::validateAttribute( } else { - auto cint = checkConstantIntVal(attr->args[0]); - if (cint) - { - maxItersAttrs->value = (int32_t)cint->getValue(); - } + maxItersAttrs->value = checkLinkTimeConstantIntVal(attr->args[0]); } } else if (const auto userDefAttr = as<UserDefinedAttribute>(attr)) diff --git a/source/slang/slang-ir-insts.h b/source/slang/slang-ir-insts.h index 4c7272755..829e72575 100644 --- a/source/slang/slang-ir-insts.h +++ b/source/slang/slang-ir-insts.h @@ -4637,9 +4637,14 @@ public: getIntValue(getIntType(), IRIntegerValue(mode))); } - void addLoopMaxItersDecoration(IRInst* value, IntegerLiteralValue iters) + void addLoopMaxItersDecoration(IRInst* value, IRIntegerValue iters) { - addDecoration(value, kIROp_LoopMaxItersDecoration, getIntValue(getIntType(), iters)); + addDecoration(value, kIROp_LoopMaxItersDecoration, getIntValue(iters)); + } + + void addLoopMaxItersDecoration(IRInst* value, IRInst* iters) + { + addDecoration(value, kIROp_LoopMaxItersDecoration, iters); } void addLoopForceUnrollDecoration(IRInst* value, IntegerLiteralValue iters) diff --git a/source/slang/slang-ir.cpp b/source/slang/slang-ir.cpp index f6c662a98..29fbcc3c9 100644 --- a/source/slang/slang-ir.cpp +++ b/source/slang/slang-ir.cpp @@ -3890,6 +3890,8 @@ enum class TypeCastStyle }; static TypeCastStyle _getTypeStyleId(IRType* type) { + type = (IRType*)unwrapAttributedType(type); + if (auto vectorType = as<IRVectorType>(type)) { return _getTypeStyleId(vectorType->getElementType()); diff --git a/source/slang/slang-lower-to-ir.cpp b/source/slang/slang-lower-to-ir.cpp index 75cf421af..ce6f8cb42 100644 --- a/source/slang/slang-lower-to-ir.cpp +++ b/source/slang/slang-lower-to-ir.cpp @@ -5938,7 +5938,8 @@ struct StmtLoweringVisitor : StmtVisitor<StmtLoweringVisitor> if (auto maxItersAttr = stmt->findModifier<MaxItersAttribute>()) { - getBuilder()->addLoopMaxItersDecoration(inst, maxItersAttr->value); + auto iters = lowerVal(context, maxItersAttr->value); + getBuilder()->addLoopMaxItersDecoration(inst, getSimpleVal(context, iters)); } else if (auto inferredMaxItersAttr = stmt->findModifier<InferredMaxItersAttribute>()) { @@ -6028,12 +6029,15 @@ struct StmtLoweringVisitor : StmtVisitor<StmtLoweringVisitor> { if (auto maxIters = stmt->findModifier<MaxItersAttribute>()) { - if (inferredMaxIters->value < maxIters->value) + if (auto constIntVal = as<ConstantIntVal>(maxIters->value)) { - context->getSink()->diagnose( - maxIters, - Diagnostics::forLoopTerminatesInFewerIterationsThanMaxIters, - inferredMaxIters->value); + if (inferredMaxIters->value < constIntVal->getValue()) + { + context->getSink()->diagnose( + maxIters, + Diagnostics::forLoopTerminatesInFewerIterationsThanMaxIters, + inferredMaxIters->value); + } } } } |
