shader: Reorder phi nodes when redefined as undefined opcodes
This commit is contained in:
		| @@ -181,8 +181,16 @@ private: | ||||
|         } | ||||
|         if (same.IsEmpty()) { | ||||
|             // The phi is unreachable or in the start block | ||||
|             const auto first_not_phi{std::ranges::find_if_not(block->Instructions(), IsPhi)}; | ||||
|             // First remove the phi node from the block, it will be reinserted | ||||
|             IR::Block::InstructionList& list{block->Instructions()}; | ||||
|             list.erase(IR::Block::InstructionList::s_iterator_to(phi)); | ||||
|  | ||||
|             // Insert an undef instruction after all phi nodes (to keep phi instructions on top) | ||||
|             const auto first_not_phi{std::ranges::find_if_not(list, IsPhi)}; | ||||
|             same = IR::Value{&*block->PrependNewInst(first_not_phi, undef_opcode)}; | ||||
|  | ||||
|             // Insert the phi node after the undef opcode, this will be replaced with an identity | ||||
|             list.insert(first_not_phi, phi); | ||||
|         } | ||||
|         // Reroute all uses of phi to same and remove phi | ||||
|         phi.ReplaceUsesWith(same); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user