https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63259

--- Comment #10 from thopre01 at gcc dot gnu.org ---
(In reply to Oleg Endo from comment #9)
> (In reply to thopre01 from comment #7)
> > 
> > Strange, could you show the output of -fdump-tree-bswap?
> 
> Not so strange at all. 

What is strange is that it should detect such bswap pattern.

> After looking at the RTL dumps, I've noticed that
> the swap.b insn is generated by the combine pass.  I've got a few combine
> patterns for matching byte swaps on SH.  The pattern for swap.b doesn't
> combine well with other ops around/on it.  -fdump-tree-bswap says:
> 
> ;; Function test_08 (test_08, funcdef_no=1, decl_uid=1333, cgraph_uid=1,
> symbol_order=1)
> 
> test_08 (short unsigned int a, short unsigned int b)
> {
>   short unsigned int _2;
>   signed short _3;
>   int _4;
>   int _5;
>   signed short _6;
>   signed short _7;
>   short unsigned int _8;
>   short unsigned int _10;
> 
>   <bb 2>:
>   _2 = a_1(D) >> 8;
>   _3 = (signed short) _2;
>   _4 = (int) a_1(D);
>   _5 = _4 << 8;
>   _6 = (signed short) _5;
>   _7 = _3 | _6;
>   _8 = (short unsigned int) _7;
>   _10 = _8 + b_9(D);
>   return _10;
> 
> }

I have the same gimple and for me the bswap is correctly detected. Can you
break at find_bswap_or_nop just after calling find_bswap_or_nop_1 on the if
(!source_stmt) and show me the output of p/x n->n ?

> 
> 
> > > Byte swapping of signed short types seems to be not working:
> > > 
> > > short test_func_111 (short a, short b, short c)
> > > {
> > >   return (((a & 0xFF00) >> 8) | ((a & 0xFF) << 8));
> > > }
> > > 
> > >         exts.w  r4,r4
> > >         mov     r4,r0
> > >         shlr8   r0
> > >         extu.b  r0,r0
> > >         shll8   r4
> > >         or      r0,r4
> > >         rts
> > >         exts.w  r4,r0
> > 
> > That's expected. Think about what happens if a = 0x8001. Doing a right shift
> > by 8 bit would give 0xFF80 (due to the most significant bit being 1). The
> > right part of the bitwise OR would give 0x0100 as expected and the result
> > would be 0xFF80, so not a byte swap. It would work with an int though as the
> > highest bit would then be 0, or with unsigned short as a right shift would
> > introduce 0 in the most significant bits.
> 
> As Andreas mentioned, 'a' is promoted to int, so this should be a byte swap.

Indeed, my mistake. Ok I tested a bit and found that the problem is the depth
at which it's looking. Try to recompile tree-ssa-math-opts.c after increasing
the limit number in find_bswap_or_nop. Right now the limit will evaluate to 4
and the gimple I have has a depth of 5.

Reply via email to