summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/3rdparty/spirv-tools/source/opt/instrument_pass.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/3rdparty/spirv-tools/source/opt/instrument_pass.cpp')
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/instrument_pass.cpp53
1 files changed, 30 insertions, 23 deletions
diff --git a/3rdparty/bgfx/3rdparty/spirv-tools/source/opt/instrument_pass.cpp b/3rdparty/bgfx/3rdparty/spirv-tools/source/opt/instrument_pass.cpp
index 246cdbb4e61..2a3e7f06e9b 100644
--- a/3rdparty/bgfx/3rdparty/spirv-tools/source/opt/instrument_pass.cpp
+++ b/3rdparty/bgfx/3rdparty/spirv-tools/source/opt/instrument_pass.cpp
@@ -325,29 +325,36 @@ void InstrumentPass::CloneSameBlockOps(
std::unordered_map<uint32_t, uint32_t>* same_blk_post,
std::unordered_map<uint32_t, Instruction*>* same_blk_pre,
BasicBlock* block_ptr) {
- (*inst)->ForEachInId(
- [&same_blk_post, &same_blk_pre, &block_ptr, this](uint32_t* iid) {
- const auto map_itr = (*same_blk_post).find(*iid);
- if (map_itr == (*same_blk_post).end()) {
- const auto map_itr2 = (*same_blk_pre).find(*iid);
- if (map_itr2 != (*same_blk_pre).end()) {
- // Clone pre-call same-block ops, map result id.
- const Instruction* in_inst = map_itr2->second;
- std::unique_ptr<Instruction> sb_inst(in_inst->Clone(context()));
- CloneSameBlockOps(&sb_inst, same_blk_post, same_blk_pre, block_ptr);
- const uint32_t rid = sb_inst->result_id();
- const uint32_t nid = this->TakeNextId();
- get_decoration_mgr()->CloneDecorations(rid, nid);
- sb_inst->SetResultId(nid);
- (*same_blk_post)[rid] = nid;
- *iid = nid;
- block_ptr->AddInstruction(std::move(sb_inst));
- }
- } else {
- // Reset same-block op operand.
- *iid = map_itr->second;
- }
- });
+ bool changed = false;
+ (*inst)->ForEachInId([&same_blk_post, &same_blk_pre, &block_ptr, &changed,
+ this](uint32_t* iid) {
+ const auto map_itr = (*same_blk_post).find(*iid);
+ if (map_itr == (*same_blk_post).end()) {
+ const auto map_itr2 = (*same_blk_pre).find(*iid);
+ if (map_itr2 != (*same_blk_pre).end()) {
+ // Clone pre-call same-block ops, map result id.
+ const Instruction* in_inst = map_itr2->second;
+ std::unique_ptr<Instruction> sb_inst(in_inst->Clone(context()));
+ const uint32_t rid = sb_inst->result_id();
+ const uint32_t nid = this->TakeNextId();
+ get_decoration_mgr()->CloneDecorations(rid, nid);
+ sb_inst->SetResultId(nid);
+ get_def_use_mgr()->AnalyzeInstDefUse(&*sb_inst);
+ (*same_blk_post)[rid] = nid;
+ *iid = nid;
+ changed = true;
+ CloneSameBlockOps(&sb_inst, same_blk_post, same_blk_pre, block_ptr);
+ block_ptr->AddInstruction(std::move(sb_inst));
+ }
+ } else {
+ // Reset same-block op operand if necessary
+ if (*iid != map_itr->second) {
+ *iid = map_itr->second;
+ changed = true;
+ }
+ }
+ });
+ if (changed) get_def_use_mgr()->AnalyzeInstUse(&**inst);
}
void InstrumentPass::UpdateSucceedingPhis(