if (!u_vector_init(&bi->instructions,
sizeof(nir_alu_instr *),
- 8 * sizeof(nir_alu_instr *)))
+ 8 * sizeof(nir_alu_instr *))) {
+ free(bi);
return NULL;
+ }
exec_list_push_tail(&bq->blocks, &bi->node);
case nir_op_flt:
case nir_op_fge:
- case nir_op_fne:
+ case nir_op_fneu:
case nir_op_feq:
/* If the instruction is a comparison that is used by an if-statement
* and neither operand is immediate value 0, add it to the set.
*/
if (is_used_by_if(alu) &&
- is_not_const_zero(alu, 0, 1, swizzle) &&
- is_not_const_zero(alu, 1, 1, swizzle))
+ is_not_const_zero(NULL, alu, 0, 1, swizzle) &&
+ is_not_const_zero(NULL, alu, 1, 1, swizzle))
add_instruction_for_block(bi, alu);
break;
return progress;
}
-static bool
+bool
nir_opt_comparison_pre_impl(nir_function_impl *impl)
{
struct block_queue bq;
block_queue_finish(&bq);
- if (progress)
+ if (progress) {
nir_metadata_preserve(impl, nir_metadata_block_index |
nir_metadata_dominance);
+ } else {
+ nir_metadata_preserve(impl, nir_metadata_all);
+ }
return progress;
}