On Fri, Aug 01, 2014 at 03:55:56PM +0200, Marek Olšák wrote:
> From: David Heidelberger <david.heidelber...@ixit.cz>
> 
> Get rid of error "Failed to build loop info" by fixing failure in cases
> like
> 4:   SGE temp[2].x, temp[0].xxxx, const[0].wwww;
> 5:   CMP temp[1].x, -temp[2].xxxx, const[0].zzzz, temp[1].xxxx;
> 6:   IF temp[1].xxxx;
> 
> On RS690
>  - fixes piglit glean "do-loop with continue and break"
>  - changes error from Failed to build loop info ->
>    Not a native swizzle: 00000e89
>    r300_fragprog_emit.c::begin_tex(): Too many texture indirections
>    for "discard statement in for loop"
>  - hide Failed to build loop info for
>    "precision log2", "while-loop with continue",
>    "for-loop with continue" and return "1 1 1 1" insted of "0 0 0 1"
> 
> Signed-off-by: David Heidelberger <david.heidelber...@ixit.cz>
> ---
> 
> I'm sending this on behalf of David. I'll commit it soon if there is no 
> review.
> 
>  .../drivers/r300/compiler/radeon_emulate_loops.c   | 27 
> +++++++++++++---------
>  1 file changed, 16 insertions(+), 11 deletions(-)
> 
> diff --git a/src/gallium/drivers/r300/compiler/radeon_emulate_loops.c 
> b/src/gallium/drivers/r300/compiler/radeon_emulate_loops.c
> index 91ed9d2..d1fae9a 100644
> --- a/src/gallium/drivers/r300/compiler/radeon_emulate_loops.c
> +++ b/src/gallium/drivers/r300/compiler/radeon_emulate_loops.c
> @@ -376,18 +376,23 @@ static int build_loop_info(struct radeon_compiler * c, 
> struct loop_info * loop,
>                       loop->Brk = ptr;
>                       loop->If = ptr->Prev;
>                       loop->EndIf = ptr->Next;
> -                     switch(loop->If->Prev->U.I.Opcode){
> -                     case RC_OPCODE_SLT:
> -                     case RC_OPCODE_SGE:
> -                     case RC_OPCODE_SGT:
> -                     case RC_OPCODE_SLE:
> -                     case RC_OPCODE_SEQ:
> -                     case RC_OPCODE_SNE:
> -                             break;
> -                     default:
> -                             return 0;
> -                     }
> +
>                       loop->Cond = loop->If->Prev;
> +                     while (loop->Cond->U.I.Opcode != RC_OPCODE_BGNLOOP) {
> +                             switch(loop->Cond->U.I.Opcode){
> +                                     case RC_OPCODE_SLT:
> +                                     case RC_OPCODE_SGE:
> +                                     case RC_OPCODE_SGT:
> +                                     case RC_OPCODE_SLE:
> +                                     case RC_OPCODE_SEQ:
> +                                     case RC_OPCODE_SNE:
> +                                             goto found;
> +                                     default:

You can't just look for any S* instruction here, you need to look for
the one that is defining the register used by IF.  I know I posted a patch
that does this, but I forgot what the problem was with it.

-Tom

> +                                             loop->Cond = loop->Cond->Prev;
> +                                             break;
> +                             }
> +                     }
> +                     found:
>                       break;
>  
>               case RC_OPCODE_ENDLOOP:
> -- 
> 1.9.1
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to