[PATCH, 4.6] Enable IPA-CP to propagate &CONST_DECLs

Richard Guenther richard.guenther@gmail.com
Fri Mar 19 13:25:00 GMT 2010


On Fri, Mar 19, 2010 at 2:02 PM, Martin Jambor <mjambor@suse.cz> wrote:
> Hi,
>
> I thought that IPA-CP was already able to propagate fortran
> &CONST_DECLs but yesterday I have observed it cannot.  I also found
> out the only piece that was missing was the lattice meet operation
> which did not consider the same constants as equal.
>
> The patch below adds this capability and with it (and -fwhole-program
> -flto) I can see such constants propagated in every polyhedron
> benchmark (I have not got to any execution-time measurements though).
>
> Bootstrapped and regression tested on current trunk, I'd like to
> commit it once stage 1 opens again (I have added this to the queue
> before my devirtualization patches, many of them need some very slight
> changes because of the thunks in dumping).

This is ok for stage1.

Thanks,
Richard.

> Thanks,
>
> Martin
>
>
> 2010-03-18  Martin Jambor  <mjambor@suse.cz>
>
>        * ipa-cp.c (ipcp_lats_are_equal): Return true also if the two
>        lattices are addresses of CONST_DECLs with the same initial value.
>        (ipcp_print_all_lattices): Print values of CONST_DECLs.
>        * ipa-prop.c (ipa_print_node_jump_functions): Likewise.
>
> Index: icln/gcc/ipa-cp.c
> ===================================================================
> --- icln.orig/gcc/ipa-cp.c
> +++ icln/gcc/ipa-cp.c
> @@ -226,10 +226,14 @@ ipcp_lats_are_equal (struct ipcp_lattice
>   if (lat1->type != lat2->type)
>     return false;
>
> -  if (operand_equal_p (lat1->constant, lat2->constant, 0))
> -    return true;
> -
> -  return false;
> +  if (TREE_CODE (lat1->constant) ==  ADDR_EXPR
> +      && TREE_CODE (lat2->constant) ==  ADDR_EXPR
> +      && TREE_CODE (TREE_OPERAND (lat1->constant, 0)) == CONST_DECL
> +      && TREE_CODE (TREE_OPERAND (lat2->constant, 0)) == CONST_DECL)
> +    return operand_equal_p (DECL_INITIAL (TREE_OPERAND (lat1->constant, 0)),
> +                           DECL_INITIAL (TREE_OPERAND (lat2->constant, 0)), 0);
> +  else
> +    return operand_equal_p (lat1->constant, lat2->constant, 0);
>  }
>
>  /* Compute Meet arithmetics:
> @@ -385,8 +389,16 @@ ipcp_print_all_lattices (FILE * f)
>          fprintf (f, "    param [%d]: ", i);
>          if (lat->type == IPA_CONST_VALUE)
>            {
> +             tree cst = lat->constant;
>              fprintf (f, "type is CONST ");
> -             print_generic_expr (f, lat->constant, 0);
> +             print_generic_expr (f, cst, 0);
> +             if (TREE_CODE (cst) == ADDR_EXPR
> +                 && TREE_CODE (TREE_OPERAND (cst, 0)) == CONST_DECL)
> +               {
> +                 fprintf (f, " -> ");
> +                 print_generic_expr (f, DECL_INITIAL (TREE_OPERAND (cst, 0)),
> +                                                      0);
> +               }
>              fprintf (f, "\n");
>            }
>          else if (lat->type == IPA_TOP)
> Index: icln/gcc/ipa-prop.c
> ===================================================================
> --- icln.orig/gcc/ipa-prop.c
> +++ icln/gcc/ipa-prop.c
> @@ -288,6 +288,13 @@ ipa_print_node_jump_functions (FILE *f,
>              tree val = jump_func->value.constant;
>              fprintf (f, "CONST: ");
>              print_generic_expr (f, val, 0);
> +             if (TREE_CODE (val) == ADDR_EXPR
> +                 && TREE_CODE (TREE_OPERAND (val, 0)) == CONST_DECL)
> +               {
> +                 fprintf (f, " -> ");
> +                 print_generic_expr (f, DECL_INITIAL (TREE_OPERAND (val, 0)),
> +                                                      0);
> +               }
>              fprintf (f, "\n");
>            }
>          else if (type == IPA_JF_CONST_MEMBER_PTR)
>



More information about the Gcc-patches mailing list