summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-ir-ssa.cpp
diff options
context:
space:
mode:
authorSai Praveen Bangaru <31557731+saipraveenb25@users.noreply.github.com>2023-03-15 22:26:58 -0400
committerGitHub <noreply@github.com>2023-03-15 19:26:58 -0700
commit71efd949fa5276e2464416fcf237f8fd2c486281 (patch)
treea5b24cd077f2ecc3f74d4dd4671c8260eb6e9b67 /source/slang/slang-ir-ssa.cpp
parent38e62199cc75ce34608491c8dd299eb330bde518 (diff)
AD: Primal-Hoisting Rework + Checkpoint Policy Framework (#2702)
Diffstat (limited to 'source/slang/slang-ir-ssa.cpp')
-rw-r--r--source/slang/slang-ir-ssa.cpp45
1 files changed, 32 insertions, 13 deletions
diff --git a/source/slang/slang-ir-ssa.cpp b/source/slang/slang-ir-ssa.cpp
index d8246edae..9b50b9c30 100644
--- a/source/slang/slang-ir-ssa.cpp
+++ b/source/slang/slang-ir-ssa.cpp
@@ -802,6 +802,34 @@ IRInst* readVar(
return readVarRec(context, blockInfo, var);
}
+void collectInstsToRemove(
+ ConstructSSAContext* context,
+ IRBlock* block)
+{
+ IRInst* next = nullptr;
+ for (auto ii = block->getFirstInst(); ii; ii = next)
+ {
+ next = ii->getNextInst();
+
+ switch (ii->getOp())
+ {
+ default:
+ // Ordinary instruction -> leave as-is
+ break;
+ case kIROp_GetElementPtr:
+ case kIROp_FieldAddress:
+ {
+ auto ptrArg = ii->getOperand(0);
+ if (auto var = asPromotableVarAccessChain(context, ptrArg))
+ {
+ context->instsToRemove.add(ii);
+ }
+ }
+ break;
+ }
+ }
+}
+
void processBlock(
ConstructSSAContext* context,
IRBlock* block,
@@ -877,19 +905,6 @@ void processBlock(
}
}
break;
-
- case kIROp_GetElementPtr:
- case kIROp_FieldAddress:
- {
- auto ptrArg = ii->getOperand(0);
- if (auto var = asPromotableVarAccessChain(context, ptrArg))
- {
- context->instsToRemove.add(ii);
- }
- }
- break;
-
-
}
}
@@ -1078,6 +1093,10 @@ bool constructSSA(ConstructSSAContext* context)
context->blockInfos.Add(bb, blockInfo);
}
+
+ for(auto bb : globalVal->getBlocks())
+ collectInstsToRemove(context, bb);
+
for(auto bb : globalVal->getBlocks())
{
auto blockInfo = * context->blockInfos.TryGetValue(bb);