diff options
Diffstat (limited to '3rdparty/bgfx/3rdparty/spirv-tools/source/opt/simplification_pass.cpp')
-rw-r--r-- | 3rdparty/bgfx/3rdparty/spirv-tools/source/opt/simplification_pass.cpp | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/3rdparty/bgfx/3rdparty/spirv-tools/source/opt/simplification_pass.cpp b/3rdparty/bgfx/3rdparty/spirv-tools/source/opt/simplification_pass.cpp index 7b0887c5561..001f35437a0 100644 --- a/3rdparty/bgfx/3rdparty/spirv-tools/source/opt/simplification_pass.cpp +++ b/3rdparty/bgfx/3rdparty/spirv-tools/source/opt/simplification_pass.cpp @@ -32,6 +32,18 @@ Pass::Status SimplificationPass::Process() { return (modified ? Status::SuccessWithChange : Status::SuccessWithoutChange); } +void SimplificationPass::AddNewOperands( + Instruction* folded_inst, std::unordered_set<Instruction*>* inst_seen, + std::vector<Instruction*>* work_list) { + analysis::DefUseManager* def_use_mgr = get_def_use_mgr(); + folded_inst->ForEachInId( + [&inst_seen, &def_use_mgr, &work_list](uint32_t* iid) { + Instruction* iid_inst = def_use_mgr->GetDef(*iid); + if (!inst_seen->insert(iid_inst).second) return; + work_list->push_back(iid_inst); + }); +} + bool SimplificationPass::SimplifyFunction(Function* function) { bool modified = false; // Phase 1: Traverse all instructions in dominance order. @@ -44,13 +56,15 @@ bool SimplificationPass::SimplifyFunction(Function* function) { std::unordered_set<Instruction*> process_phis; std::unordered_set<Instruction*> inst_to_kill; std::unordered_set<Instruction*> in_work_list; + std::unordered_set<Instruction*> inst_seen; const InstructionFolder& folder = context()->get_instruction_folder(); cfg()->ForEachBlockInReversePostOrder( function->entry().get(), [&modified, &process_phis, &work_list, &in_work_list, &inst_to_kill, - &folder, this](BasicBlock* bb) { + &folder, &inst_seen, this](BasicBlock* bb) { for (Instruction* inst = &*bb->begin(); inst; inst = inst->NextNode()) { + inst_seen.insert(inst); if (inst->opcode() == SpvOpPhi) { process_phis.insert(inst); } @@ -70,6 +84,9 @@ bool SimplificationPass::SimplifyFunction(Function* function) { work_list.push_back(use); } }); + + AddNewOperands(inst, &inst_seen, &work_list); + if (inst->opcode() == SpvOpCopyObject) { context()->ReplaceAllUsesWithPredicate( inst->result_id(), inst->GetSingleWordInOperand(0), @@ -97,6 +114,7 @@ bool SimplificationPass::SimplifyFunction(Function* function) { for (size_t i = 0; i < work_list.size(); ++i) { Instruction* inst = work_list[i]; in_work_list.erase(inst); + inst_seen.insert(inst); bool is_foldable_copy = inst->opcode() == SpvOpCopyObject && @@ -114,6 +132,8 @@ bool SimplificationPass::SimplifyFunction(Function* function) { } }); + AddNewOperands(inst, &inst_seen, &work_list); + if (inst->opcode() == SpvOpCopyObject) { context()->ReplaceAllUsesWithPredicate( inst->result_id(), inst->GetSingleWordInOperand(0), |