On Tue, 20 Sep 2011 18:28:17 -0700, Kenneth Graunke <kenn...@whitecape.org> 
wrote:
> This begins the process of cleaning up and un-muddling our IR.
> 
> 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 <kenn...@whitecape.org>

I spent most of my review time on this looking at the optimization pass
changes, so I haven't done as much coverage of the ast-level changes.

Reviewed-by: Eric Anholt <e...@anholt.net>

> diff --git a/src/glsl/ir_expression_flattening.cpp 
> b/src/glsl/ir_expression_flattening.cpp
> index 0b7c537..3922da8 100644
> --- a/src/glsl/ir_expression_flattening.cpp
> +++ b/src/glsl/ir_expression_flattening.cpp
> @@ -27,10 +27,8 @@
>   * Takes the leaves of expression trees and makes them dereferences of
>   * assignments of the leaves to temporaries, according to a predicate.
>   *
> - * This is 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.
> + * This is used for breaking down matrix operations, where it's easier to
> + * create a temporary and work on each of its vectory components 
> individually.

"vector".

Attachment: pgp6aJLRunWqR.pgp
Description: PGP signature

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to