diff options
| author | Yong He <yonghe@outlook.com> | 2022-06-01 22:29:10 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-01 22:29:10 -0700 |
| commit | bc6bc56db51d06b92dc63ef9c9e0def6c9760c9e (patch) | |
| tree | 55aae1b64e3c0befe4b424764f6f0064701a9ffe /source/slang/slang-ir.cpp | |
| parent | 4f14efc9752d9ebc8538a2e29ed154a00dc99682 (diff) | |
Clean up void returns. (#2260)
* Clean up `IRReturnVoid`.
* Update gitignore.
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-ir.cpp')
| -rw-r--r-- | source/slang/slang-ir.cpp | 51 |
1 files changed, 35 insertions, 16 deletions
diff --git a/source/slang/slang-ir.cpp b/source/slang/slang-ir.cpp index c71954346..ee84cce73 100644 --- a/source/slang/slang-ir.cpp +++ b/source/slang/slang-ir.cpp @@ -486,8 +486,7 @@ namespace Slang auto operands = terminator->getOperands(); switch (terminator->getOp()) { - case kIROp_ReturnVal: - case kIROp_ReturnVoid: + case kIROp_Return: case kIROp_Unreachable: case kIROp_MissingReturn: case kIROp_discard: @@ -762,8 +761,7 @@ namespace Slang default: return false; - case kIROp_ReturnVal: - case kIROp_ReturnVoid: + case kIROp_Return: case kIROp_unconditionalBranch: case kIROp_conditionalBranch: case kIROp_loop: @@ -1968,6 +1966,10 @@ namespace Slang { return getStringSlice() == rhs->getStringSlice(); } + case kIROp_VoidLit: + { + return true; + } default: break; } @@ -2006,6 +2008,10 @@ namespace Slang const UnownedStringSlice slice = getStringSlice(); return combineHash(code, Slang::getHashCode(slice.begin(), slice.getLength())); } + case kIROp_VoidLit: + { + return code; + } default: { SLANG_ASSERT(!"Invalid type"); @@ -2066,6 +2072,14 @@ namespace Slang irValue->value.ptrVal = keyInst.value.ptrVal; break; } + case kIROp_VoidLit: + { + const size_t instSize = prefixSize; + irValue = static_cast<IRConstant*>( + _createInst(instSize, keyInst.getFullType(), keyInst.getOp())); + irValue->value.ptrVal = keyInst.value.ptrVal; + break; + } case kIROp_StringLit: { const UnownedStringSlice slice = keyInst.getStringSlice(); @@ -2198,6 +2212,18 @@ namespace Slang return (IRPtrLit*) _findOrEmitConstant(keyInst); } + IRVoidLit* IRBuilder::getVoidValue() + { + IRType* type = getVoidType(); + + IRConstant keyInst; + memset(&keyInst, 0, sizeof(keyInst)); + keyInst.m_op = kIROp_VoidLit; + keyInst.typeUse.usedValue = type; + keyInst.value.intVal= 0; + return (IRVoidLit*)_findOrEmitConstant(keyInst); + } + IRInst* IRBuilder::getCapabilityValue(CapabilitySet const& caps) { IRType* capabilityAtomType = getIntType(); @@ -3222,11 +3248,6 @@ namespace Slang return emitIntrinsicInst(resultType, kIROp_MakeResultValue, 1, &value); } - IRInst* IRBuilder::emitMakeResultValueVoid(IRType* resultType) - { - return emitIntrinsicInst(resultType, kIROp_MakeResultValueVoid, 0, nullptr); - } - IRInst* IRBuilder::emitIsResultError(IRInst* result) { return emitIntrinsicInst(getBoolType(), kIROp_IsResultError, 1, &result); @@ -3930,9 +3951,9 @@ namespace Slang IRInst* IRBuilder::emitReturn( IRInst* val) { - auto inst = createInst<IRReturnVal>( + auto inst = createInst<IRReturn>( this, - kIROp_ReturnVal, + kIROp_Return, nullptr, val); addInst(inst); @@ -3941,10 +3962,8 @@ namespace Slang IRInst* IRBuilder::emitReturn() { - auto inst = createInst<IRReturnVoid>( - this, - kIROp_ReturnVoid, - nullptr); + auto voidVal = getVoidValue(); + auto inst = createInst<IRReturn>(this, kIROp_Return, nullptr, voidVal); addInst(inst); return inst; } @@ -6001,7 +6020,7 @@ namespace Slang if (!lastBlock) return nullptr; - auto returnInst = as<IRReturnVal>(lastBlock->getTerminator()); + auto returnInst = as<IRReturn>(lastBlock->getTerminator()); if (!returnInst) return nullptr; |
