Commit 644dbf06 authored by Zebediah Figura's avatar Zebediah Figura Committed by Alexandre Julliard

d3dcompiler: Store the loop body directly in the hlsr_ir_loop structure.

parent 0a9f2d8b
...@@ -750,7 +750,7 @@ struct hlsl_ir_loop ...@@ -750,7 +750,7 @@ struct hlsl_ir_loop
{ {
struct hlsl_ir_node node; struct hlsl_ir_node node;
/* loop condition is stored in the body (as "if (!condition) break;") */ /* loop condition is stored in the body (as "if (!condition) break;") */
struct list *body; struct list body;
unsigned int next_index; /* liveness index of the end of the loop */ unsigned int next_index; /* liveness index of the end of the loop */
}; };
......
...@@ -360,24 +360,21 @@ static struct list *create_loop(enum loop_type type, struct list *init, struct l ...@@ -360,24 +360,21 @@ static struct list *create_loop(enum loop_type type, struct list *init, struct l
goto oom; goto oom;
init_node(&loop->node, HLSL_IR_LOOP, NULL, loc); init_node(&loop->node, HLSL_IR_LOOP, NULL, loc);
list_add_tail(list, &loop->node.entry); list_add_tail(list, &loop->node.entry);
loop->body = d3dcompiler_alloc(sizeof(*loop->body)); list_init(&loop->body);
if (!loop->body)
goto oom;
list_init(loop->body);
if (!append_conditional_break(cond)) if (!append_conditional_break(cond))
goto oom; goto oom;
if (type != LOOP_DO_WHILE) if (type != LOOP_DO_WHILE)
list_move_tail(loop->body, cond); list_move_tail(&loop->body, cond);
list_move_tail(loop->body, body); list_move_tail(&loop->body, body);
if (iter) if (iter)
list_move_tail(loop->body, iter); list_move_tail(&loop->body, iter);
if (type == LOOP_DO_WHILE) if (type == LOOP_DO_WHILE)
list_move_tail(loop->body, cond); list_move_tail(&loop->body, cond);
d3dcompiler_free(init); d3dcompiler_free(init);
d3dcompiler_free(cond); d3dcompiler_free(cond);
...@@ -386,8 +383,6 @@ static struct list *create_loop(enum loop_type type, struct list *init, struct l ...@@ -386,8 +383,6 @@ static struct list *create_loop(enum loop_type type, struct list *init, struct l
oom: oom:
ERR("Out of memory.\n"); ERR("Out of memory.\n");
if (loop)
d3dcompiler_free(loop->body);
d3dcompiler_free(loop); d3dcompiler_free(loop);
d3dcompiler_free(cond_jump); d3dcompiler_free(cond_jump);
d3dcompiler_free(list); d3dcompiler_free(list);
...@@ -2857,7 +2852,7 @@ static unsigned int index_instructions(struct list *instrs, unsigned int index) ...@@ -2857,7 +2852,7 @@ static unsigned int index_instructions(struct list *instrs, unsigned int index)
} }
else if (instr->type == HLSL_IR_LOOP) else if (instr->type == HLSL_IR_LOOP)
{ {
index = index_instructions(loop_from_node(instr)->body, index); index = index_instructions(&loop_from_node(instr)->body, index);
loop_from_node(instr)->next_index = index; loop_from_node(instr)->next_index = index;
} }
} }
...@@ -2919,7 +2914,7 @@ static void compute_liveness_recurse(struct list *instrs, unsigned int loop_firs ...@@ -2919,7 +2914,7 @@ static void compute_liveness_recurse(struct list *instrs, unsigned int loop_firs
case HLSL_IR_LOOP: case HLSL_IR_LOOP:
{ {
struct hlsl_ir_loop *loop = loop_from_node(instr); struct hlsl_ir_loop *loop = loop_from_node(instr);
compute_liveness_recurse(loop->body, loop_first ? loop_first : instr->index, compute_liveness_recurse(&loop->body, loop_first ? loop_first : instr->index,
loop_last ? loop_last : loop->next_index); loop_last ? loop_last : loop->next_index);
break; break;
} }
......
...@@ -2027,7 +2027,7 @@ static void debug_dump_ir_if(const struct hlsl_ir_if *if_node) ...@@ -2027,7 +2027,7 @@ static void debug_dump_ir_if(const struct hlsl_ir_if *if_node)
static void debug_dump_ir_loop(const struct hlsl_ir_loop *loop) static void debug_dump_ir_loop(const struct hlsl_ir_loop *loop)
{ {
wine_dbg_printf("for (;;)\n{\n"); wine_dbg_printf("for (;;)\n{\n");
debug_dump_instr_list(loop->body); debug_dump_instr_list(&loop->body);
wine_dbg_printf("}\n"); wine_dbg_printf("}\n");
} }
...@@ -2165,7 +2165,10 @@ static void free_ir_if(struct hlsl_ir_if *if_node) ...@@ -2165,7 +2165,10 @@ static void free_ir_if(struct hlsl_ir_if *if_node)
static void free_ir_loop(struct hlsl_ir_loop *loop) static void free_ir_loop(struct hlsl_ir_loop *loop)
{ {
free_instr_list(loop->body); struct hlsl_ir_node *node, *next_node;
LIST_FOR_EACH_ENTRY_SAFE(node, next_node, &loop->body, struct hlsl_ir_node, entry)
free_instr(node);
d3dcompiler_free(loop); d3dcompiler_free(loop);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment