summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/3rdparty/spirv-tools/source/opt/simplification_pass.cpp
diff options
context:
space:
mode:
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.cpp22
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),