summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-ir-inline.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-ir-inline.cpp')
-rw-r--r--source/slang/slang-ir-inline.cpp30
1 files changed, 27 insertions, 3 deletions
diff --git a/source/slang/slang-ir-inline.cpp b/source/slang/slang-ir-inline.cpp
index 4308d16f0..5479a98ff 100644
--- a/source/slang/slang-ir-inline.cpp
+++ b/source/slang/slang-ir-inline.cpp
@@ -896,15 +896,39 @@ struct IntrinsicFunctionInliningPass : InliningPassBase
auto returnInst = as<IRReturn>(func->getFirstBlock()->getTerminator());
if (!returnInst)
return false;
- auto firstInst = as<IRSPIRVAsm>(func->getFirstBlock()->getFirstOrdinaryInst());
- return returnInst->getVal() == firstInst;
+
+ // If a function body has only asm blocks + trivial insts (load/store),
+ // this is considered as a pure asm function, and we can inline it.
+ bool hasSpvAsm = false;
+ for (auto inst = func->getFirstBlock()->getFirstOrdinaryInst(); inst != returnInst; inst = inst->getNextInst())
+ {
+ switch (inst->getOp())
+ {
+ case kIROp_SPIRVAsmOperandInst:
+ case kIROp_SPIRVAsm:
+ hasSpvAsm = true;
+ continue;
+ case kIROp_Load:
+ case kIROp_swizzle:
+ case kIROp_Store:
+ continue;
+ default:
+ return false;
+ }
+ }
+ return hasSpvAsm;
}
};
void performIntrinsicFunctionFunctionInlining(IRModule* module)
{
IntrinsicFunctionInliningPass pass(module);
- pass.considerAllCallSites();
+ bool changed = true;
+
+ while (changed)
+ {
+ changed = pass.considerAllCallSites();
+ }
}
struct CustomInliningPass : InliningPassBase