Zebediah Figura : d3dcompiler: Store the "then" and "else" instruction lists directly in the hlsl_ir_if structure.
Alexandre Julliard
julliard at winehq.org
Wed Jul 8 15:34:35 CDT 2020
Module: wine
Branch: master
Commit: 0a9f2d8b0a5394a0803c418c726ef4da488e15e6
URL: https://source.winehq.org/git/wine.git/?a=commit;h=0a9f2d8b0a5394a0803c418c726ef4da488e15e6
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Tue Jul 7 23:09:24 2020 +0200
d3dcompiler: Store the "then" and "else" instruction lists directly in the hlsl_ir_if structure.
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/d3dcompiler_43/d3dcompiler_private.h | 4 +--
dlls/d3dcompiler_43/hlsl.y | 51 +++++++++++++++----------------
dlls/d3dcompiler_43/utils.c | 18 +++++------
3 files changed, 36 insertions(+), 37 deletions(-)
diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h
index 3e91f74645..4bf1ce8f1b 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_private.h
+++ b/dlls/d3dcompiler_43/d3dcompiler_private.h
@@ -742,8 +742,8 @@ struct hlsl_ir_if
{
struct hlsl_ir_node node;
struct hlsl_src condition;
- struct list *then_instrs;
- struct list *else_instrs;
+ struct list then_instrs;
+ struct list else_instrs;
};
struct hlsl_ir_loop
diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y
index 475fd414fd..3c9f1bd604 100644
--- a/dlls/d3dcompiler_43/hlsl.y
+++ b/dlls/d3dcompiler_43/hlsl.y
@@ -284,6 +284,19 @@ static BOOL type_is_void(const struct hlsl_type *type)
return type->type == HLSL_CLASS_OBJECT && type->base_type == HLSL_TYPE_VOID;
}
+static struct hlsl_ir_if *new_if(struct hlsl_ir_node *condition, struct source_location loc)
+{
+ struct hlsl_ir_if *iff;
+
+ if (!(iff = d3dcompiler_alloc(sizeof(*iff))))
+ return NULL;
+ init_node(&iff->node, HLSL_IR_IF, NULL, loc);
+ hlsl_src_from_node(&iff->condition, condition);
+ list_init(&iff->then_instrs);
+ list_init(&iff->else_instrs);
+ return iff;
+}
+
static BOOL append_conditional_break(struct list *cond_list)
{
struct hlsl_ir_node *condition, *not;
@@ -302,22 +315,13 @@ static BOOL append_conditional_break(struct list *cond_list)
}
list_add_tail(cond_list, ¬->entry);
- if (!(iff = d3dcompiler_alloc(sizeof(*iff))))
+ if (!(iff = new_if(not, condition->loc)))
{
ERR("Out of memory.\n");
return FALSE;
}
- init_node(&iff->node, HLSL_IR_IF, NULL, condition->loc);
- hlsl_src_from_node(&iff->condition, not);
list_add_tail(cond_list, &iff->node.entry);
- if (!(iff->then_instrs = d3dcompiler_alloc(sizeof(*iff->then_instrs))))
- {
- ERR("Out of memory.\n");
- return FALSE;
- }
- list_init(iff->then_instrs);
-
if (!(jump = d3dcompiler_alloc(sizeof(*jump))))
{
ERR("Out of memory.\n");
@@ -325,7 +329,7 @@ static BOOL append_conditional_break(struct list *cond_list)
}
init_node(&jump->node, HLSL_IR_JUMP, NULL, condition->loc);
jump->type = HLSL_IR_JUMP_BREAK;
- list_add_head(iff->then_instrs, &jump->node.entry);
+ list_add_head(&iff->then_instrs, &jump->node.entry);
return TRUE;
}
@@ -2211,18 +2215,15 @@ jump_statement:
selection_statement: KW_IF '(' expr ')' if_body
{
- struct hlsl_ir_if *instr = d3dcompiler_alloc(sizeof(*instr));
struct hlsl_ir_node *condition = node_from_list($3);
+ struct hlsl_ir_if *instr;
- if (!instr)
- {
- ERR("Out of memory\n");
+ if (!(instr = new_if(condition, get_location(&@1))))
YYABORT;
- }
- init_node(&instr->node, HLSL_IR_IF, NULL, get_location(&@1));
- hlsl_src_from_node(&instr->condition, condition);
- instr->then_instrs = $5.then_instrs;
- instr->else_instrs = $5.else_instrs;
+ list_move_tail(&instr->then_instrs, $5.then_instrs);
+ list_move_tail(&instr->else_instrs, $5.else_instrs);
+ d3dcompiler_free($5.then_instrs);
+ d3dcompiler_free($5.else_instrs);
if (condition->data_type->dimx > 1 || condition->data_type->dimy > 1)
{
hlsl_report_message(instr->node.loc, HLSL_LEVEL_ERROR,
@@ -2851,9 +2852,8 @@ static unsigned int index_instructions(struct list *instrs, unsigned int index)
if (instr->type == HLSL_IR_IF)
{
struct hlsl_ir_if *iff = if_from_node(instr);
- index = index_instructions(iff->then_instrs, index);
- if (iff->else_instrs)
- index = index_instructions(iff->else_instrs, index);
+ index = index_instructions(&iff->then_instrs, index);
+ index = index_instructions(&iff->else_instrs, index);
}
else if (instr->type == HLSL_IR_LOOP)
{
@@ -2902,9 +2902,8 @@ static void compute_liveness_recurse(struct list *instrs, unsigned int loop_firs
case HLSL_IR_IF:
{
struct hlsl_ir_if *iff = if_from_node(instr);
- compute_liveness_recurse(iff->then_instrs, loop_first, loop_last);
- if (iff->else_instrs)
- compute_liveness_recurse(iff->else_instrs, loop_first, loop_last);
+ compute_liveness_recurse(&iff->then_instrs, loop_first, loop_last);
+ compute_liveness_recurse(&iff->else_instrs, loop_first, loop_last);
iff->condition.node->last_read = instr->index;
break;
}
diff --git a/dlls/d3dcompiler_43/utils.c b/dlls/d3dcompiler_43/utils.c
index 7f0c451ce9..8599ffe69a 100644
--- a/dlls/d3dcompiler_43/utils.c
+++ b/dlls/d3dcompiler_43/utils.c
@@ -2018,14 +2018,10 @@ static void debug_dump_ir_if(const struct hlsl_ir_if *if_node)
wine_dbg_printf("if (");
debug_dump_src(&if_node->condition);
wine_dbg_printf(")\n{\n");
- debug_dump_instr_list(if_node->then_instrs);
+ debug_dump_instr_list(&if_node->then_instrs);
+ wine_dbg_printf("}\nelse\n{\n");
+ debug_dump_instr_list(&if_node->else_instrs);
wine_dbg_printf("}\n");
- if (if_node->else_instrs)
- {
- wine_dbg_printf("else\n{\n");
- debug_dump_instr_list(if_node->else_instrs);
- wine_dbg_printf("}\n");
- }
}
static void debug_dump_ir_loop(const struct hlsl_ir_loop *loop)
@@ -2157,8 +2153,12 @@ static void free_ir_assignment(struct hlsl_ir_assignment *assignment)
static void free_ir_if(struct hlsl_ir_if *if_node)
{
- free_instr_list(if_node->then_instrs);
- free_instr_list(if_node->else_instrs);
+ struct hlsl_ir_node *node, *next_node;
+
+ LIST_FOR_EACH_ENTRY_SAFE(node, next_node, &if_node->then_instrs, struct hlsl_ir_node, entry)
+ free_instr(node);
+ LIST_FOR_EACH_ENTRY_SAFE(node, next_node, &if_node->else_instrs, struct hlsl_ir_node, entry)
+ free_instr(node);
hlsl_src_remove(&if_node->condition);
d3dcompiler_free(if_node);
}
More information about the wine-cvs
mailing list