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

--- Comment #3 from Michael_S <already5chosen at yahoo dot com> ---
(In reply to sandra from comment #1)
> I'm not sure what command-line options you were using, but with -O2 the bad2
> case now generates the expected code.
> 

With 8.2.0 the problem exists both with -O2 and with -Os.
So, may be, a newer version got lucky and some other change eliminated my
problem.

> Looking at the bad1 case, this is what's coming out of the tree optimizers,
> and what the back end has to deal with for RTL expansion:
> 
> bad1 (const signed char * str, int * res)
> {
>   int c;
>   signed char _1;
>   int _2;
>   int _11;
>   signed char _12;
>   _Bool _13;
> 
>   <bb 2> [local count: 1073741824]:
>   _1 = *str_6(D);
>   c_8 = (int) _1;
>   _2 = c_8 + -48;
>   *res_9(D) = _2;
>   _12 = _1 & -33;
>   _13 = _12 == 69;
>   _11 = (int) _13;
>   return _11;
> 
> }
> 
> The code coming out of RTL expand is a mess too; there's no QImode "and"
> instruction, it can't use the SImode "andi" instruction because that it only
> accepts small unsigned constants (not -33), and then it has to sign-extend
> the QImode result it computed because the comparison instructions need
> SImode too.
> 
> FWIW I think the real bug here is in the tree reassoc1 pass: it shouldn't
> attempt this optimization if there is no optab support for bitwise AND in
> the appropriate mode.  So I'm reclassifying this as a tree-optimization bug
> rather than a target bug; if the maintainers dispute that, feel free to
> switch it back and I will take another look see if I can do something in the
> backend to recombine the insns.

I am not a compiler expert. Never understood functionality of each and every
gcc  pass. Sorry.
The only thing I know, at least on simple targets, like Nios2, is which code I
would like for compiler to generate.

Reply via email to