[Mesa-dev] [PATCH v2 019/103] i965/vec4: Fix DCE for VEC4_OPCODE_SET_{LOW, HIGH}_32BIT
Ian Romanick
idr at freedesktop.org
Wed Oct 19 00:37:27 UTC 2016
This patch is
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
On 10/11/2016 02:01 AM, Iago Toral Quiroga wrote:
> These align1 opcodes do partial writes of 64-bit data. The problem is that we
> want to use them to write on the same register to implement packDouble2x32 and
> from the point of view of DCE, since both opcodes write to the same register,
> only the last one stands and decides to eliminate the first, which is
> not correct, so prevent this from happening.
>
> v2: Make a helper in vec4_instruction to know if the instruction is an
> align1 partial write. This will come in handy when we implement a
> simd splitting pass in a later patch.
> ---
> src/mesa/drivers/dri/i965/brw_ir_vec4.h | 6 ++++++
> src/mesa/drivers/dri/i965/brw_vec4_dead_code_eliminate.cpp | 3 ++-
> 2 files changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_ir_vec4.h b/src/mesa/drivers/dri/i965/brw_ir_vec4.h
> index a8e5f4a..7451f44 100644
> --- a/src/mesa/drivers/dri/i965/brw_ir_vec4.h
> +++ b/src/mesa/drivers/dri/i965/brw_ir_vec4.h
> @@ -232,6 +232,12 @@ public:
> bool can_change_types() const;
> bool has_source_and_destination_hazard() const;
>
> + bool is_align1_partial_write()
> + {
> + return opcode == VEC4_OPCODE_SET_LOW_32BIT ||
> + opcode == VEC4_OPCODE_SET_HIGH_32BIT;
> + }
> +
> bool reads_flag()
> {
> return predicate || opcode == VS_OPCODE_UNPACK_FLAGS_SIMD4X2;
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_dead_code_eliminate.cpp b/src/mesa/drivers/dri/i965/brw_vec4_dead_code_eliminate.cpp
> index 50706a9..950c6c8 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_dead_code_eliminate.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_dead_code_eliminate.cpp
> @@ -109,7 +109,8 @@ vec4_visitor::dead_code_eliminate()
> }
> }
>
> - if (inst->dst.file == VGRF && !inst->predicate) {
> + if (inst->dst.file == VGRF && !inst->predicate &&
> + !inst->is_align1_partial_write()) {
> for (unsigned i = 0; i < regs_written(inst); i++) {
> for (int c = 0; c < 4; c++) {
> if (inst->dst.writemask & (1 << c)) {
>
More information about the mesa-dev
mailing list