glsl: use the linear allocator in opt_dead_code_local

Tested-by: Edmondo Tommasina <edmondo.tommasina@gmail.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
Marek Olšák
2016-10-07 20:57:04 +02:00
parent 23e373eb4f
commit 9c19dedff0

View File

@@ -45,6 +45,9 @@ namespace {
class assignment_entry : public exec_node class assignment_entry : public exec_node
{ {
public: public:
/* override operator new from exec_node */
DECLARE_LINEAR_ZALLOC_CXX_OPERATORS(assignment_entry)
assignment_entry(ir_variable *lhs, ir_assignment *ir) assignment_entry(ir_variable *lhs, ir_assignment *ir)
{ {
assert(lhs); assert(lhs);
@@ -161,7 +164,7 @@ public:
* of a variable to a variable. * of a variable to a variable.
*/ */
static bool static bool
process_assignment(void *ctx, ir_assignment *ir, exec_list *assignments) process_assignment(void *lin_ctx, ir_assignment *ir, exec_list *assignments)
{ {
ir_variable *var = NULL; ir_variable *var = NULL;
bool progress = false; bool progress = false;
@@ -271,7 +274,7 @@ process_assignment(void *ctx, ir_assignment *ir, exec_list *assignments)
} }
/* Add this instruction to the assignment list available to be removed. */ /* Add this instruction to the assignment list available to be removed. */
assignment_entry *entry = new(ctx) assignment_entry(var, ir); assignment_entry *entry = new(lin_ctx) assignment_entry(var, ir);
assignments->push_tail(entry); assignments->push_tail(entry);
if (debug) { if (debug) {
@@ -298,6 +301,8 @@ dead_code_local_basic_block(ir_instruction *first,
bool progress = false; bool progress = false;
void *ctx = ralloc_context(NULL); void *ctx = ralloc_context(NULL);
void *lin_ctx = linear_alloc_parent(ctx, 0);
/* Safe looping, since process_assignment */ /* Safe looping, since process_assignment */
for (ir = first, ir_next = (ir_instruction *)first->next;; for (ir = first, ir_next = (ir_instruction *)first->next;;
ir = ir_next, ir_next = (ir_instruction *)ir->next) { ir = ir_next, ir_next = (ir_instruction *)ir->next) {
@@ -309,7 +314,8 @@ dead_code_local_basic_block(ir_instruction *first,
} }
if (ir_assign) { if (ir_assign) {
progress = process_assignment(ctx, ir_assign, &assignments) || progress; progress = process_assignment(lin_ctx, ir_assign, &assignments) ||
progress;
} else { } else {
kill_for_derefs_visitor kill(&assignments); kill_for_derefs_visitor kill(&assignments);
ir->accept(&kill); ir->accept(&kill);