shader: Fix conditional execution of exit instructions
This commit is contained in:
		| @@ -322,12 +322,13 @@ CFG::AnalysisState CFG::AnalyzeInst(Block* block, FunctionId function_id, Locati | |||||||
|         return AnalysisState::Continue; |         return AnalysisState::Continue; | ||||||
|     } |     } | ||||||
|     const IR::Condition cond{static_cast<IR::Pred>(pred.index), pred.negated}; |     const IR::Condition cond{static_cast<IR::Pred>(pred.index), pred.negated}; | ||||||
|     AnalyzeCondInst(block, function_id, pc, EndClass::Branch, cond); |     AnalyzeCondInst(block, function_id, pc, EndClass::Branch, cond, true); | ||||||
|     return AnalysisState::Branch; |     return AnalysisState::Branch; | ||||||
| } | } | ||||||
|  |  | ||||||
| void CFG::AnalyzeCondInst(Block* block, FunctionId function_id, Location pc, | void CFG::AnalyzeCondInst(Block* block, FunctionId function_id, Location pc, | ||||||
|                           EndClass insn_end_class, IR::Condition cond) { |                           EndClass insn_end_class, IR::Condition cond, | ||||||
|  |                           bool visit_conditional_inst) { | ||||||
|     if (block->begin != pc) { |     if (block->begin != pc) { | ||||||
|         // If the block doesn't start in the conditional instruction |         // If the block doesn't start in the conditional instruction | ||||||
|         // mark it as a label to visit it later |         // mark it as a label to visit it later | ||||||
| @@ -354,7 +355,7 @@ void CFG::AnalyzeCondInst(Block* block, FunctionId function_id, Location pc, | |||||||
|     // Impersonate the visited block with a virtual block |     // Impersonate the visited block with a virtual block | ||||||
|     *block = std::move(virtual_block); |     *block = std::move(virtual_block); | ||||||
|     // Set the end properties of the conditional instruction |     // Set the end properties of the conditional instruction | ||||||
|     conditional_block->end = pc + 1; |     conditional_block->end = visit_conditional_inst ? (pc + 1) : pc; | ||||||
|     conditional_block->end_class = insn_end_class; |     conditional_block->end_class = insn_end_class; | ||||||
|     // Add a label to the instruction after the conditional instruction |     // Add a label to the instruction after the conditional instruction | ||||||
|     Block* const endif_block{AddLabel(conditional_block, block->stack, pc + 1, function_id)}; |     Block* const endif_block{AddLabel(conditional_block, block->stack, pc + 1, function_id)}; | ||||||
| @@ -423,7 +424,7 @@ CFG::AnalysisState CFG::AnalyzeEXIT(Block* block, FunctionId function_id, Locati | |||||||
|             throw NotImplementedException("Conditional EXIT with PEXIT token"); |             throw NotImplementedException("Conditional EXIT with PEXIT token"); | ||||||
|         } |         } | ||||||
|         const IR::Condition cond{flow_test, static_cast<IR::Pred>(pred.index), pred.negated}; |         const IR::Condition cond{flow_test, static_cast<IR::Pred>(pred.index), pred.negated}; | ||||||
|         AnalyzeCondInst(block, function_id, pc, EndClass::Exit, cond); |         AnalyzeCondInst(block, function_id, pc, EndClass::Exit, cond, false); | ||||||
|         return AnalysisState::Branch; |         return AnalysisState::Branch; | ||||||
|     } |     } | ||||||
|     if (const std::optional<Location> exit_pc{block->stack.Peek(Token::PEXIT)}) { |     if (const std::optional<Location> exit_pc{block->stack.Peek(Token::PEXIT)}) { | ||||||
|   | |||||||
| @@ -128,7 +128,7 @@ private: | |||||||
|     AnalysisState AnalyzeInst(Block* block, FunctionId function_id, Location pc); |     AnalysisState AnalyzeInst(Block* block, FunctionId function_id, Location pc); | ||||||
|  |  | ||||||
|     void AnalyzeCondInst(Block* block, FunctionId function_id, Location pc, EndClass insn_end_class, |     void AnalyzeCondInst(Block* block, FunctionId function_id, Location pc, EndClass insn_end_class, | ||||||
|                          IR::Condition cond); |                          IR::Condition cond, bool visit_conditional_inst); | ||||||
|  |  | ||||||
|     /// Return true when the branch instruction is confirmed to be a branch |     /// Return true when the branch instruction is confirmed to be a branch | ||||||
|     bool AnalyzeBranch(Block* block, FunctionId function_id, Location pc, Instruction inst, |     bool AnalyzeBranch(Block* block, FunctionId function_id, Location pc, Instruction inst, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user