diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/shader_recompiler/backend/spirv/emit_spirv.cpp | 2 | ||||
| -rw-r--r-- | src/shader_recompiler/frontend/maxwell/control_flow.cpp | 10 |
2 files changed, 12 insertions, 0 deletions
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.cpp b/src/shader_recompiler/backend/spirv/emit_spirv.cpp index 9dc769307..b8e3b8527 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv.cpp | |||
| @@ -56,6 +56,8 @@ ArgType Arg(EmitContext& ctx, const IR::Value& arg) { | |||
| 56 | return arg.Label(); | 56 | return arg.Label(); |
| 57 | } else if constexpr (std::is_same_v<ArgType, IR::Attribute>) { | 57 | } else if constexpr (std::is_same_v<ArgType, IR::Attribute>) { |
| 58 | return arg.Attribute(); | 58 | return arg.Attribute(); |
| 59 | } else if constexpr (std::is_same_v<ArgType, IR::Reg>) { | ||
| 60 | return arg.Reg(); | ||
| 59 | } | 61 | } |
| 60 | } | 62 | } |
| 61 | 63 | ||
diff --git a/src/shader_recompiler/frontend/maxwell/control_flow.cpp b/src/shader_recompiler/frontend/maxwell/control_flow.cpp index 784f9df8a..ac8707847 100644 --- a/src/shader_recompiler/frontend/maxwell/control_flow.cpp +++ b/src/shader_recompiler/frontend/maxwell/control_flow.cpp | |||
| @@ -486,6 +486,16 @@ Block* CFG::AddLabel(Block* block, Stack stack, Location pc, FunctionId function | |||
| 486 | } | 486 | } |
| 487 | if (const auto it{function.blocks.find(pc, Compare{})}; it != function.blocks.end()) { | 487 | if (const auto it{function.blocks.find(pc, Compare{})}; it != function.blocks.end()) { |
| 488 | // Block already exists and it has been visited | 488 | // Block already exists and it has been visited |
| 489 | if (function.blocks.begin() != it) { | ||
| 490 | // Check if the previous node is the virtual variant of the label | ||
| 491 | // This won't exist if a virtual node is not needed or it hasn't been visited | ||
| 492 | // If it hasn't been visited and a virtual node is needed, this will still behave as | ||
| 493 | // expected because the node impersonated with its virtual node. | ||
| 494 | const auto prev{std::prev(it)}; | ||
| 495 | if (it->begin.Virtual() == prev->begin) { | ||
| 496 | return &*prev; | ||
| 497 | } | ||
| 498 | } | ||
| 489 | return &*it; | 499 | return &*it; |
| 490 | } | 500 | } |
| 491 | Block* const new_block{block_pool.Create(Block{ | 501 | Block* const new_block{block_pool.Create(Block{ |