Zebediah Figura : vkd3d-shader/hlsl: Use last_read for resource loads.

Alexandre Julliard julliard at winehq.org
Mon Nov 1 16:33:19 CDT 2021


Module: vkd3d
Branch: master
Commit: 5e3b8b70fce316716a99574eca5a8fb9ebdb7770
URL:    https://source.winehq.org/git/vkd3d.git/?a=commit;h=5e3b8b70fce316716a99574eca5a8fb9ebdb7770

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Fri Oct 15 16:54:07 2021 -0500

vkd3d-shader/hlsl: Use last_read for resource loads.

This fixes DCE.

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 libs/vkd3d-shader/hlsl.h         |  1 -
 libs/vkd3d-shader/hlsl_codegen.c | 14 +++++++-------
 2 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h
index 31b7ddb..93191e5 100644
--- a/libs/vkd3d-shader/hlsl.h
+++ b/libs/vkd3d-shader/hlsl.h
@@ -240,7 +240,6 @@ struct hlsl_ir_var
     uint32_t is_output_semantic : 1;
     uint32_t is_uniform : 1;
     uint32_t is_param : 1;
-    uint32_t has_resource_access : 1;
 };
 
 struct hlsl_ir_function
diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c
index bf93a03..b7b0cd1 100644
--- a/libs/vkd3d-shader/hlsl_codegen.c
+++ b/libs/vkd3d-shader/hlsl_codegen.c
@@ -591,6 +591,8 @@ static void compute_liveness_recurse(struct list *instrs, unsigned int loop_firs
 
     LIST_FOR_EACH_ENTRY(instr, instrs, struct hlsl_ir_node, entry)
     {
+        const unsigned int var_last_read = loop_last ? max(instr->index, loop_last) : instr->index;
+
         switch (instr->type)
         {
         case HLSL_IR_STORE:
@@ -628,7 +630,7 @@ static void compute_liveness_recurse(struct list *instrs, unsigned int loop_firs
             struct hlsl_ir_load *load = hlsl_ir_load(instr);
 
             var = load->src.var;
-            var->last_read = max(var->last_read, loop_last ? max(instr->index, loop_last) : instr->index);
+            var->last_read = max(var->last_read, var_last_read);
             if (load->src.offset.node)
                 load->src.offset.node->last_read = instr->index;
             break;
@@ -645,7 +647,8 @@ static void compute_liveness_recurse(struct list *instrs, unsigned int loop_firs
         {
             struct hlsl_ir_resource_load *load = hlsl_ir_resource_load(instr);
 
-            load->resource.var->has_resource_access = 1;
+            var = load->resource.var;
+            var->last_read = max(var->last_read, var_last_read);
             if (load->resource.offset.node)
                 load->resource.offset.node->last_read = instr->index;
             load->coords.node->last_read = instr->index;
@@ -676,10 +679,7 @@ static void compute_liveness(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl
     LIST_FOR_EACH_ENTRY(scope, &ctx->scopes, struct hlsl_scope, entry)
     {
         LIST_FOR_EACH_ENTRY(var, &scope->vars, struct hlsl_ir_var, scope_entry)
-        {
             var->first_write = var->last_read = 0;
-            var->has_resource_access = 0;
-        }
     }
 
     LIST_FOR_EACH_ENTRY(var, &ctx->extern_vars, struct hlsl_ir_var, extern_entry)
@@ -1203,7 +1203,7 @@ static const struct hlsl_ir_var *get_reserved_texture(struct hlsl_ctx *ctx, uint
 
     LIST_FOR_EACH_ENTRY(var, &ctx->extern_vars, const struct hlsl_ir_var, extern_entry)
     {
-        if (var->has_resource_access && var->reg_reservation.type == 't' && var->reg_reservation.index == index)
+        if (var->last_read && var->reg_reservation.type == 't' && var->reg_reservation.index == index)
             return var;
     }
     return NULL;
@@ -1216,7 +1216,7 @@ static void allocate_textures(struct hlsl_ctx *ctx)
 
     LIST_FOR_EACH_ENTRY(var, &ctx->extern_vars, struct hlsl_ir_var, extern_entry)
     {
-        if (!var->has_resource_access || var->data_type->type != HLSL_CLASS_OBJECT
+        if (!var->last_read || var->data_type->type != HLSL_CLASS_OBJECT
                 || var->data_type->base_type != HLSL_TYPE_TEXTURE)
             continue;
 




More information about the wine-cvs mailing list