On Thu, 3 Aug 2017, Jakub Jelinek wrote:

> Hi!
> 
> For the PR81588 testcase, on targets with branch cost 1, we end up with:
>   b.0_1 = b;
>   _2 = (long long int) b.0_1;
>   a.1_3 = a;
>   _4 = _2 > a.1_3;
>   _5 = (int) _4;
>   if (a.1_3 < 0)
>     goto <bb 4>; [36.00%] [count: INV]
>   else
>     goto <bb 3>; [64.00%] [count: INV]
> 
>   <bb 3> [64.00%] [count: INV]:
>   if (_4 != 1)
>     goto <bb 4>; [46.88%] [count: INV]
>   else
>     goto <bb 5>; [53.13%] [count: INV]
> 
>   <bb 4> [66.00%] [count: INV]:
>   c = 0;
> 
>   <bb 5> [100.00%] [count: INV]:
> The reason why we punt is the unexpected _4 != 1 condition, the code
> is prepared to handle just _4 == 0 (or _4 != 0) where _4 == 0 is equivalent
> to _4 != 1 for boolean type.

Hmm, I thought we had code to canonicalize boolean compares (but I can't 
find that right now).  Some is in 
forwprop:forward_propagate_into_gimple_cond where it canonicalizes
!= 1 to == 0.

> The following patch handles even comparison with 1 if the type is
> unsigned 1-bit precision.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Ok.

Thanks,
Richard.

> 2017-08-03  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR tree-optimization/81655
>       PR tree-optimization/81588
>       * tree-ssa-reassoc.c (optimize_range_tests_var_bound): Handle also
>       the case when ranges[i].low and high are 1 for unsigned type with
>       precision 1.
> 
> --- gcc/tree-ssa-reassoc.c.jj 2017-08-01 10:28:50.000000000 +0200
> +++ gcc/tree-ssa-reassoc.c    2017-08-02 11:28:44.789134681 +0200
> @@ -2918,11 +2918,22 @@ optimize_range_tests_var_bound (enum tre
>  
>    for (i = 0; i < length; i++)
>      {
> +      bool in_p = ranges[i].in_p;
>        if (ranges[i].low == NULL_TREE
> -       || ranges[i].high == NULL_TREE
> -       || !integer_zerop (ranges[i].low)
> -       || !integer_zerop (ranges[i].high))
> +       || ranges[i].high == NULL_TREE)
>       continue;
> +      if (!integer_zerop (ranges[i].low)
> +       || !integer_zerop (ranges[i].high))
> +     {
> +       if (ranges[i].exp
> +           && TYPE_PRECISION (TREE_TYPE (ranges[i].exp)) == 1
> +           && TYPE_UNSIGNED (TREE_TYPE (ranges[i].exp))
> +           && integer_onep (ranges[i].low)
> +           && integer_onep (ranges[i].high))
> +         in_p = !in_p;
> +       else
> +         continue;
> +     }
>  
>        gimple *stmt;
>        tree_code ccode;
> @@ -2964,7 +2975,7 @@ optimize_range_tests_var_bound (enum tre
>       default:
>         continue;
>       }
> -      if (ranges[i].in_p)
> +      if (in_p)
>       ccode = invert_tree_comparison (ccode, false);
>        switch (ccode)
>       {
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
21284 (AG Nuernberg)

Reply via email to