From bc6bc56db51d06b92dc63ef9c9e0def6c9760c9e Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 1 Jun 2022 22:29:10 -0700 Subject: Clean up void returns. (#2260) * Clean up `IRReturnVoid`. * Update gitignore. Co-authored-by: Yong He --- source/slang/slang-ir.cpp | 51 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 16 deletions(-) (limited to 'source/slang/slang-ir.cpp') 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( + _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( + auto inst = createInst( this, - kIROp_ReturnVal, + kIROp_Return, nullptr, val); addInst(inst); @@ -3941,10 +3962,8 @@ namespace Slang IRInst* IRBuilder::emitReturn() { - auto inst = createInst( - this, - kIROp_ReturnVoid, - nullptr); + auto voidVal = getVoidValue(); + auto inst = createInst(this, kIROp_Return, nullptr, voidVal); addInst(inst); return inst; } @@ -6001,7 +6020,7 @@ namespace Slang if (!lastBlock) return nullptr; - auto returnInst = as(lastBlock->getTerminator()); + auto returnInst = as(lastBlock->getTerminator()); if (!returnInst) return nullptr; -- cgit v1.2.3