summaryrefslogtreecommitdiffstats
path: root/src/glsl/ast.h
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2014-03-05 17:05:54 -0800
committerEric Anholt <[email protected]>2014-04-08 00:59:47 -0700
commite9822f77a9cc024f528d30382fd5ad21c73a173b (patch)
treea4ac719a37841c77a8112d598323a9a1752a5758 /src/glsl/ast.h
parentdff3439fef8690192bcc40108729da711fcf706b (diff)
glsl: Skip making a temporary for assignments when we don't need one.
While we wish our optimization passes could identify all the cases where we can coalesce our variables, we miss out on a lot of opportunities. total instructions in shared programs: 1673849 -> 1673166 (-0.04%) instructions in affected programs: 299521 -> 298838 (-0.23%) GAINED: 7 LOST: 0 Note that many programs are "hurt". The notable ones are where we produce unrolling in cases we didn't before (presumably just because of the lower instruction count). But there are also some cases where pushing things right into the variables prevents copy propagation and tree grafting, since we don't split our variable usage webs apart. Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/glsl/ast.h')
-rw-r--r--src/glsl/ast.h13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/glsl/ast.h b/src/glsl/ast.h
index ae70b003cfe..6b136f51879 100644
--- a/src/glsl/ast.h
+++ b/src/glsl/ast.h
@@ -217,6 +217,13 @@ public:
virtual ir_rvalue *hir(exec_list *instructions,
struct _mesa_glsl_parse_state *state);
+ virtual void hir_no_rvalue(exec_list *instructions,
+ struct _mesa_glsl_parse_state *state);
+
+ ir_rvalue *do_hir(exec_list *instructions,
+ struct _mesa_glsl_parse_state *state,
+ bool needs_rvalue);
+
virtual void print(void) const;
enum ast_operators oper;
@@ -287,6 +294,9 @@ public:
virtual ir_rvalue *hir(exec_list *instructions,
struct _mesa_glsl_parse_state *state);
+ virtual void hir_no_rvalue(exec_list *instructions,
+ struct _mesa_glsl_parse_state *state);
+
private:
/**
* Is this function call actually a constructor?
@@ -359,6 +369,9 @@ public:
virtual ir_rvalue *hir(exec_list *instructions,
struct _mesa_glsl_parse_state *state);
+
+ virtual void hir_no_rvalue(exec_list *instructions,
+ struct _mesa_glsl_parse_state *state);
};
/**