diff --git a/src/amd/compiler/aco_insert_exec_mask.cpp b/src/amd/compiler/aco_insert_exec_mask.cpp index 47106daeb94..f679c2eb41f 100644 --- a/src/amd/compiler/aco_insert_exec_mask.cpp +++ b/src/amd/compiler/aco_insert_exec_mask.cpp @@ -214,7 +214,8 @@ void get_block_needs(wqm_ctx &ctx, exec_ctx &exec_ctx, Block* block) aco_ptr& instr = block->instructions[i]; WQMState needs = needs_exact(instr) ? Exact : Unspecified; - bool propagate_wqm = instr->opcode == aco_opcode::p_wqm; + bool propagate_wqm = instr->opcode == aco_opcode::p_wqm || + instr->opcode == aco_opcode::p_as_uniform; bool preserve_wqm = instr->opcode == aco_opcode::p_discard_if; bool pred_by_exec = pred_by_exec_mask(instr); for (const Definition& definition : instr->definitions) { diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index a928bf9f915..9c6976a4ff7 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -713,8 +713,10 @@ Temp convert_pointer_to_64_bit(isel_context *ctx, Temp ptr) if (ptr.size() == 2) return ptr; Builder bld(ctx->program, ctx->block); - if (ptr.type() == RegType::vgpr) + if (ptr.type() == RegType::vgpr) { ptr = bld.vop1(aco_opcode::v_readfirstlane_b32, bld.def(s1), ptr); + ptr = emit_wqm(ctx, ptr); + } return bld.pseudo(aco_opcode::p_create_vector, bld.def(s2), ptr, Operand((unsigned)ctx->options->address32_hi)); } @@ -5498,8 +5500,10 @@ Temp get_sampler_desc(isel_context *ctx, nir_deref_instr *deref_instr, constant_index += array_size * const_value->u32; } else { Temp indirect = get_ssa_temp(ctx, deref_instr->arr.index.ssa); - if (indirect.type() == RegType::vgpr) + if (indirect.type() == RegType::vgpr) { indirect = bld.vop1(aco_opcode::v_readfirstlane_b32, bld.def(s1), indirect); + indirect = emit_wqm(ctx, indirect); + } if (array_size != 1) indirect = bld.sop2(aco_opcode::s_mul_i32, bld.def(s1), Operand(array_size), indirect);