[Mesa-dev] [PATCH] glsl: propagate max_array_access through function calls

Dominik Behr dbehr at chromium.org
Tue Aug 27 14:03:58 PDT 2013


Hi,
There was a lot of code everywhere that used iterators so it is not obvious
for a new person that the iterators are evil. And they do abstract the
implementation of the storage.
Also, I'd rather use ir_instruction and as_*() calls instead of exec_node
and explicit cast.
I am not sure about MAX2, is it guaranteed to be converted to branchless
conditional assignment?



On Tue, Aug 27, 2013 at 8:26 AM, Ian Romanick <idr at freedesktop.org> wrote:

> On 08/21/2013 05:57 PM, Dominik Behr wrote:
>
>> Fixes a bug where if an uniform array is passed to a function the accesses
>> to the array are not propagated so later all but the first vector of the
>> uniform array are removed in parcel_out_uniform_storage resulting in
>> broken shaders and out of bounds access to arrays in
>> brw::vec4_visitor::pack_**uniform_registers.
>>
>> Signed-off-by: Dominik Behr <dbehr at chromium.org>
>> ---
>>   src/glsl/link_functions.cpp | 26 ++++++++++++++++++++++++++
>>   1 file changed, 26 insertions(+)
>>
>> diff --git a/src/glsl/link_functions.cpp b/src/glsl/link_functions.cpp
>> index 6b3e154..32e2012 100644
>> --- a/src/glsl/link_functions.cpp
>> +++ b/src/glsl/link_functions.cpp
>> @@ -173,6 +173,32 @@ public:
>>         return visit_continue;
>>      }
>>
>> +   virtual ir_visitor_status visit_leave(ir_call *ir)
>> +   {
>> +      /* traverse list of function parameters, and for array parameters
>> +         propagate max_array_access, do it when leaving the node
>> +         so the childen would propagate their array accesses first */
>>
>                    children
>
> I also think this comment should be expanded.  On the first read of this
> code, it wasn't obvious to me why this was necessary.  It's worth
> mentioning that the important case is when the reference to the array at
> the call site does not reference a specific element.  In that case the
> access range of the from the callee is propagated back to the array passed
> in.
>
>
>  +      exec_list_iterator sig_param_iter = ir->callee->parameters.**
>> iterator();
>> +      exec_list_iterator param_iter = ir->actual_parameters.**
>> iterator();
>>
>
> While iterators are a fine design pattern, the implementation of them in
> the compiler front-end is garbage (and I made that implementation).  We
> stopped writing new code to use the iterators years ago.  There is other
> code that does a similar double-walk of the signature parameters and actual
> parameters lists.
>
> I think the best example is in lower_clip_distance_visitor::**visit_leave(ir_call
> *ir) in lower_clip_distance.cpp.
>
>
>  +      while (param_iter.has_next()) {
>> +         ir_variable *sig_param = (ir_variable *) sig_param_iter.get();
>> +         ir_rvalue *param = (ir_rvalue *) param_iter.get();
>> +         assert(sig_param);
>> +         assert(param);
>> +         if (sig_param->type->is_array()) {
>> +            ir_dereference_variable *deref = param->as_dereference_**
>> variable();
>> +            if (deref && deref->var && deref->var->type->is_array()) {
>> +               if (sig_param->max_array_access >
>> deref->var->max_array_access) {
>> +                   deref->var->max_array_access =
>> sig_param->max_array_access;
>> +               }
>>
>
> This should end up looking more similar to the code in
> call_link_visitor::visit(ir_**dereference_variable *ir) around line 200
> (without your patch).
>
>            var->max_array_access =
>                MAX2(var->max_array_access, ir->var->max_array_access);
>
>
>  +            }
>> +         }
>> +         sig_param_iter.next();
>> +         param_iter.next();
>> +      }
>> +      return visit_continue;
>> +   }
>> +
>>      virtual ir_visitor_status visit(ir_dereference_variable *ir)
>>      {
>>         if (hash_table_find(locals, ir->var) == NULL) {
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130827/dacbd5cc/attachment.html>


More information about the mesa-dev mailing list