diff options
Diffstat (limited to 'source/slang/slang-ir.cpp')
| -rw-r--r-- | source/slang/slang-ir.cpp | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/source/slang/slang-ir.cpp b/source/slang/slang-ir.cpp index cdabb1ac2..f28f61ffc 100644 --- a/source/slang/slang-ir.cpp +++ b/source/slang/slang-ir.cpp @@ -3995,7 +3995,7 @@ static TypeCastStyle _getTypeStyleId(IRType* type) } } -IRInst* IRBuilder::emitCast(IRType* type, IRInst* value) +IRInst* IRBuilder::emitCast(IRType* type, IRInst* value, bool fallbackToBuiltinCast) { if (isTypeEqual(type, value->getDataType())) return value; @@ -4009,8 +4009,17 @@ IRInst* IRBuilder::emitCast(IRType* type, IRInst* value) SLANG_UNREACHABLE("cast from void type"); } - SLANG_RELEASE_ASSERT(toStyle != TypeCastStyle::Unknown); - SLANG_RELEASE_ASSERT(fromStyle != TypeCastStyle::Unknown); + if (toStyle == TypeCastStyle::Unknown || fromStyle == TypeCastStyle::Unknown) + { + if (fallbackToBuiltinCast) + { + return emitIntrinsicInst(type, kIROp_BuiltinCast, 1, &value); + } + else + { + return nullptr; + } + } struct OpSeq { @@ -4057,7 +4066,18 @@ IRInst* IRBuilder::emitCast(IRType* type, IRInst* value) auto t = type; if (op.op1 != kIROp_Nop) { - t = getUInt64Type(); + if (toStyle == TypeCastStyle::Bool) + t = getIntType(); + else + t = getUInt64Type(); + if (auto vecType = as<IRVectorType>(type)) + t = getVectorType(t, vecType->getElementCount()); + else if (auto matType = as<IRMatrixType>(type)) + t = getMatrixType( + t, + matType->getRowCount(), + matType->getColumnCount(), + matType->getLayout()); } auto result = emitIntrinsicInst(t, op.op0, 1, &value); if (op.op1 != kIROp_Nop) @@ -8293,6 +8313,7 @@ bool IRInst::mightHaveSideEffects(SideEffectAnalysisOptions options) case kIROp_ExtractExistentialValue: case kIROp_ExtractExistentialWitnessTable: case kIROp_WrapExistential: + case kIROp_BuiltinCast: case kIROp_BitCast: case kIROp_CastFloatToInt: case kIROp_CastIntToFloat: |
