diff options
Diffstat (limited to 'source/slang/slang-ir-inline.cpp')
| -rw-r--r-- | source/slang/slang-ir-inline.cpp | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/source/slang/slang-ir-inline.cpp b/source/slang/slang-ir-inline.cpp index a5538425f..1e8c1462f 100644 --- a/source/slang/slang-ir-inline.cpp +++ b/source/slang/slang-ir-inline.cpp @@ -709,15 +709,15 @@ void performMandatoryEarlyInlining(IRModule* module) namespace { // anonymous // Inlines calls that involve String types -struct StringInliningPass : InliningPassBase +struct TypeInliningPass : InliningPassBase { typedef InliningPassBase Super; - StringInliningPass(IRModule* module) + TypeInliningPass(IRModule* module) : Super(module) {} - bool doesTypeRequireInline(IRType* type) + bool doesTypeRequireInline(IRType* type, IRFunc* callee) { // TODO(JS): // I guess there is a question here about what type around string requires @@ -727,6 +727,12 @@ struct StringInliningPass : InliningPassBase const auto op = type->getOp(); switch (op) { + case kIROp_RefType: + { + if(callee->findDecoration<IRNoRefInlineDecoration>()) + return false; + return true; + } case kIROp_StringType: case kIROp_NativeStringType: { @@ -742,7 +748,7 @@ struct StringInliningPass : InliningPassBase { auto callee = info.callee; - if (doesTypeRequireInline(callee->getResultType())) + if (doesTypeRequireInline(callee->getResultType(), callee)) { return true; } @@ -750,7 +756,7 @@ struct StringInliningPass : InliningPassBase const auto count = Count(callee->getParamCount()); for (Index i = 0; i < count; ++i) { - if (doesTypeRequireInline(callee->getParamType(UInt(i)))) + if (doesTypeRequireInline(callee->getParamType(UInt(i)), callee)) { return true; } @@ -762,7 +768,7 @@ struct StringInliningPass : InliningPassBase } // anonymous -Result performStringInlining(IRModule* module, DiagnosticSink* sink) +Result performTypeInlining(IRModule* module, DiagnosticSink* sink) { SLANG_UNUSED(sink); @@ -780,7 +786,7 @@ Result performStringInlining(IRModule* module, DiagnosticSink* sink) // while(true) { - StringInliningPass pass(module); + TypeInliningPass pass(module); if (pass.considerAllCallSites()) { // If there was a change try inlining again |
