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

Thomas Preud'homme <thopre01 at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |thopre01 at gcc dot gnu.org

--- Comment #8 from Thomas Preud'homme <thopre01 at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #7)
> Ok, so given we can't have PRE do as good as predcom and a "cost model" for
> PRE is out of the question for GCC 7 the following dumbs down PRE again.  It
> does so in the very much simplest way rather than trying to block this only
> during elimination / insertion.  This should be definitely revisited for GCC
> 8.
> 
> Index: gcc/tree-ssa-pre.c
> ===================================================================
> --- gcc/tree-ssa-pre.c  (revision 246026)
> +++ gcc/tree-ssa-pre.c  (working copy)
> @@ -1468,10 +1468,20 @@ phi_translate_1 (pre_expr expr, bitmap_s
>                    leader for it.  */
>                 if (constant->kind != CONSTANT)
>                   {
> -                   unsigned value_id = get_expr_value_id (constant);
> -                   constant = find_leader_in_sets (value_id, set1, set2);
> -                   if (constant)
> -                     return constant;
> +                   /* Do not allow simplifications to non-constants over
> +                      backedges as this will likely result in a loop PHI
> node
> +                      to be inserted and increased register pressure.
> +                      See PR77498 - this avoids doing predcoms work in
> +                      a less efficient way.  */
> +                   if (find_edge (pred, phiblock)->flags & EDGE_DFS_BACK)
> +                     ;
> +                   else
> +                     {
> +                       unsigned value_id = get_expr_value_id (constant);
> +                       constant = find_leader_in_sets (value_id, set1,
> set2);
> +                       if (constant)
> +                         return constant;
> +                     }
>                   }
>                 else
>                   return constant;

I don't know for Yuri's issue but at least it sadly does not help with the
problem reported by Andre for arm-none-eabi [1]. I'll try to come up with a
testcase next week.

[1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77498#c2

Reply via email to