summaryrefslogtreecommitdiffstats
path: root/src/glsl/ir_expression_flattening.cpp
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2012-03-20 15:56:37 -0700
committerKenneth Graunke <kenneth@whitecape.org>2012-04-02 14:15:41 -0700
commitd884f60861f270cdcf7d9d47765efcf1e1de30b6 (patch)
tree9041472738a13510a6cce1073cf64064eea294ec /src/glsl/ir_expression_flattening.cpp
parent622eed075092a0325e0927bf2f9ef29f20bbf416 (diff)
downloadexternal_mesa3d-d884f60861f270cdcf7d9d47765efcf1e1de30b6.zip
external_mesa3d-d884f60861f270cdcf7d9d47765efcf1e1de30b6.tar.gz
external_mesa3d-d884f60861f270cdcf7d9d47765efcf1e1de30b6.tar.bz2
glsl: Convert ir_call to be a statement rather than a value.
Aside from ir_call, our IR is cleanly split into two classes: - Statements (typeless; used for side effects, control flow) - Values (deeply nestable, pure, typed expression trees) Unfortunately, ir_call confused all this: - For void functions, we placed ir_call directly in the instruction stream, treating it as an untyped statement. Yet, it was a subclass of ir_rvalue, and no other ir_rvalue could be used in this way. - For functions with a return value, ir_call could be placed in arbitrary expression trees. While this fit naturally with the source language, it meant that expressions might not be pure, making it difficult to transform and optimize them. To combat this, we always emitted ir_call directly in the RHS of an ir_assignment, only using a temporary variable in expression trees. Many passes relied on this assumption; the acos and atan built-ins violated it. This patch makes ir_call a statement (ir_instruction) rather than a value (ir_rvalue). Non-void calls now take a ir_dereference of a variable, and store the return value there---effectively a call and assignment rolled into one. They cannot be embedded in expressions. All expression trees are now pure, without exception. Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Eric Anholt <eric@anholt.net> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Diffstat (limited to 'src/glsl/ir_expression_flattening.cpp')
-rw-r--r--src/glsl/ir_expression_flattening.cpp5
1 files changed, 0 insertions, 5 deletions
diff --git a/src/glsl/ir_expression_flattening.cpp b/src/glsl/ir_expression_flattening.cpp
index bd4ac67..b44e68c 100644
--- a/src/glsl/ir_expression_flattening.cpp
+++ b/src/glsl/ir_expression_flattening.cpp
@@ -29,11 +29,6 @@
*
* This is used for breaking down matrix operations, where it's easier to
* create a temporary and work on each of its vector components individually.
- *
- * It is also used for automatic function inlining, where we want to take
- * an expression containing a call and move the call out to its own
- * assignment so that we can inline it at the appropriate place in the
- * instruction stream.
*/
#include "ir.h"