case nir_op_flt32:
case nir_op_fge32:
case nir_op_feq32:
- case nir_op_fne32:
+ case nir_op_fneu32:
case nir_op_ilt32:
case nir_op_ult32:
case nir_op_ige32:
* bcsel that must come before any break.
*
* For more details, see
- * https://gitlab.freedesktop.org/mesa/mesa/merge_requests/170#note_110305
+ * https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/170#note_110305
*/
nir_foreach_instr_safe(instr, header_block) {
if (instr->type != nir_instr_type_alu)
nir_block *then_block = nir_if_last_then_block(nif);
nir_block *else_block = nir_if_last_else_block(nif);
+ if (nir_block_ends_in_jump(else_block)) {
+ /* Even though this if statement has a jump on one side, we may still have
+ * phis afterwards. Single-source phis can be produced by loop unrolling
+ * or dead control-flow passes and are perfectly legal. Run a quick phi
+ * removal on the block after the if to clean up any such phis.
+ */
+ nir_block *const next_block =
+ nir_cf_node_as_block(nir_cf_node_next(&nif->cf_node));
+ nir_opt_remove_phis_block(next_block);
+ }
+
rewrite_phi_predecessor_blocks(nif, then_block, else_block, else_block,
then_block);
if (preserve) {
nir_metadata_preserve(function->impl, nir_metadata_none);
} else {
- #ifndef NDEBUG
- function->impl->valid_metadata &= ~nir_metadata_not_properly_reset;
- #endif
+ nir_metadata_preserve(function->impl, nir_metadata_all);
}
}