[Mesa-dev] [PATCH] st/glsl_to_tgsi: reduce stack explosion in recursive expression visitor

Ilia Mirkin imirkin at alum.mit.edu
Fri Apr 29 00:51:32 UTC 2016


On Tue, Apr 26, 2016 at 11:25 AM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> In optimized builds, visit(ir_expression *) experiences inlining with gcc that
> leads the function to have a roughly 32KB stack frame. This is a problem given
> that the function is called recursively. In non-optimized builds, the stack
> frame is much smaller, hence one gets crashes that happen only in optimized
> builds.
>
> Arguably there is a compiler bug or at least severe misfeature here. In any
> case, the easy thing to do for now seems to be moving the bulk of the
> non-recursive code into a separate function. This is sufficient to convince my
> version of gcc not to blow up the stack frame of the recursive part. Just to be
> sure, add the gcc-specific noinline attribute to prevent this bug from
> reoccuring if inliner heuristics change.
>
> Cc: "11.1 11.2" <mesa-stable at lists.freedesktop.org>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=95133
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=95026
> ---
>  src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 24 ++++++++++++++++++++----
>  1 file changed, 20 insertions(+), 4 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index ad818a8..958b2c0 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -450,6 +450,12 @@ public:
>     virtual void visit(ir_barrier *);
>     /*@}*/
>
> +   void visit_expression(ir_expression *, st_src_reg *)
> +#if defined(__GNUC__)
> +      __attribute__((noinline))
> +#endif

As mentioned on IRC, there's something of a precedent for sticking
these things into src/util/macros.h and
src/gallium/include/pipe/p_compiler.h (although the src one appears
more appropriate. There's even a

src/mapi/glapi/gen/gl_XML.py:#    define NOINLINE __attribute__((noinline))

However you choose to resolve this,

Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>

> +      ;
> +
>     void visit_atomic_counter_intrinsic(ir_call *);
>     void visit_ssbo_intrinsic(ir_call *);
>     void visit_membar_intrinsic(ir_call *);
> @@ -1535,10 +1541,7 @@ glsl_to_tgsi_visitor::reladdr_to_temp(ir_instruction *ir,
>  void
>  glsl_to_tgsi_visitor::visit(ir_expression *ir)
>  {
> -   unsigned int operand;
>     st_src_reg op[ARRAY_SIZE(ir->operands)];
> -   st_src_reg result_src;
> -   st_dst_reg result_dst;
>
>     /* Quick peephole: Emit MAD(a, b, c) instead of ADD(MUL(a, b), c)
>      */
> @@ -1561,7 +1564,7 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir)
>     if (ir->operation == ir_quadop_vector)
>        assert(!"ir_quadop_vector should have been lowered");
>
> -   for (operand = 0; operand < ir->get_num_operands(); operand++) {
> +   for (unsigned int operand = 0; operand < ir->get_num_operands(); operand++) {
>        this->result.file = PROGRAM_UNDEFINED;
>        ir->operands[operand]->accept(this);
>        if (this->result.file == PROGRAM_UNDEFINED) {
> @@ -1578,6 +1581,19 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir)
>        assert(!ir->operands[operand]->type->is_matrix());
>     }
>
> +   visit_expression(ir, op);
> +}
> +
> +/* The non-recursive part of the expression visitor lives in a separate
> + * function and should be prevented from being inlined, to avoid a stack
> + * explosion when deeply nested expressions are visited.
> + */
> +void
> +glsl_to_tgsi_visitor::visit_expression(ir_expression* ir, st_src_reg *op)
> +{
> +   st_src_reg result_src;
> +   st_dst_reg result_dst;
> +
>     int vector_elements = ir->operands[0]->type->vector_elements;
>     if (ir->operands[1]) {
>        vector_elements = MAX2(vector_elements,
> --
> 2.5.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list