diff --git a/src/amd/compiler/aco_builder_h.py b/src/amd/compiler/aco_builder_h.py index 608949811b8..f13f1624c75 100644 --- a/src/amd/compiler/aco_builder_h.py +++ b/src/amd/compiler/aco_builder_h.py @@ -213,6 +213,9 @@ public: std::vector> *instructions; std::vector>::iterator it; bool is_precise = false; + bool is_sz_preserve = false; + bool is_inf_preserve = false; + bool is_nan_preserve = false; bool is_nuw = false; Builder(Program *pgm) : program(pgm), use_iterator(false), start(false), lm(pgm ? pgm->lane_mask : s2), instructions(NULL) {} @@ -617,6 +620,9 @@ formats = [(f if len(f) == 5 else f + ('',)) for f in formats] % for i in range(num_definitions): instr->definitions[${i}] = def${i}; instr->definitions[${i}].setPrecise(is_precise); + instr->definitions[${i}].setSZPreserve(is_sz_preserve); + instr->definitions[${i}].setInfPreserve(is_inf_preserve); + instr->definitions[${i}].setNaNPreserve(is_nan_preserve); instr->definitions[${i}].setNUW(is_nuw); % endfor % for i in range(num_operands): diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 635609bfa00..2a27d5bb971 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -121,6 +121,9 @@ create_alu_builder(isel_context* ctx, nir_alu_instr* instr) { Builder bld(ctx->program, ctx->block); bld.is_precise = instr->exact; + bld.is_sz_preserve = nir_alu_instr_is_signed_zero_preserve(instr); + bld.is_inf_preserve = nir_alu_instr_is_inf_preserve(instr); + bld.is_nan_preserve = nir_alu_instr_is_nan_preserve(instr); return bld; }