]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Handle addresses of more constants in IPA-CP
authorEric Botcazou <ebotcazou@adacore.com>
Sat, 11 Nov 2023 18:43:07 +0000 (19:43 +0100)
committerEric Botcazou <ebotcazou@adacore.com>
Sat, 11 Nov 2023 22:36:44 +0000 (23:36 +0100)
IPA-CP can handle addresses of scalar constants (CONST_DECL) so this extends
that to addresses of constants in the pool (DECL_IN_CONSTANT_POOL).  Again
this is helpful for so-called fat pointers in Ada, i.e. objects that are
semantically pointers but represented by structures made up of two pointers.

This also moves the unused function print_ipcp_constant_value from ipa-cp.cc
to ipa-prop.cc and renames it.

gcc/
* ipa-cp.cc (print_ipcp_constant_value): Move to...
(values_equal_for_ipcp_p): Deal with VAR_DECLs from the
constant pool.
* ipa-prop.cc (ipa_print_constant_value): ...here.  Likewise.
(ipa_print_node_jump_functions_for_edge): Call the function
ipa_print_constant_value to print IPA_JF_CONST elements.

gcc/ipa-cp.cc
gcc/ipa-prop.cc

index 788157ebd55e6118bc02b09d19d0d8865b63ca04..34fae065454beee13767d643788d8ffc01815b18 100644 (file)
@@ -478,31 +478,21 @@ values_equal_for_ipcp_p (tree x, tree y)
 
   if (TREE_CODE (x) == ADDR_EXPR
       && TREE_CODE (y) == ADDR_EXPR
-      && TREE_CODE (TREE_OPERAND (x, 0)) == CONST_DECL
-      && TREE_CODE (TREE_OPERAND (y, 0)) == CONST_DECL)
-    return operand_equal_p (DECL_INITIAL (TREE_OPERAND (x, 0)),
-                           DECL_INITIAL (TREE_OPERAND (y, 0)), 0);
+      && (TREE_CODE (TREE_OPERAND (x, 0)) == CONST_DECL
+         || (TREE_CODE (TREE_OPERAND (x, 0)) == VAR_DECL
+             && DECL_IN_CONSTANT_POOL (TREE_OPERAND (x, 0))))
+      && (TREE_CODE (TREE_OPERAND (y, 0)) == CONST_DECL
+         || (TREE_CODE (TREE_OPERAND (y, 0)) == VAR_DECL
+             && DECL_IN_CONSTANT_POOL (TREE_OPERAND (y, 0)))))
+    return TREE_OPERAND (x, 0) == TREE_OPERAND (y, 0)
+          || operand_equal_p (DECL_INITIAL (TREE_OPERAND (x, 0)),
+                              DECL_INITIAL (TREE_OPERAND (y, 0)), 0);
   else
     return operand_equal_p (x, y, 0);
 }
 
 /* Print V which is extracted from a value in a lattice to F.  */
 
-static void
-print_ipcp_constant_value (FILE * f, tree v)
-{
-  if (TREE_CODE (v) == ADDR_EXPR
-      && TREE_CODE (TREE_OPERAND (v, 0)) == CONST_DECL)
-    {
-      fprintf (f, "& ");
-      print_generic_expr (f, DECL_INITIAL (TREE_OPERAND (v, 0)));
-    }
-  else
-    print_generic_expr (f, v);
-}
-
-/* Print V which is extracted from a value in a lattice to F.  */
-
 static void
 print_ipcp_constant_value (FILE * f, ipa_polymorphic_call_context v)
 {
index 827bdb691baf9373ea4ddeeab26404d3dec8dd8f..7de2b788185b6720b9cc4e8f994a2107c6f7d8c8 100644 (file)
@@ -365,6 +365,24 @@ ipa_initialize_node_params (struct cgraph_node *node)
     ipa_populate_param_decls (node, *info->descriptors);
 }
 
+/* Print VAL which is extracted from a jump function to F.  */
+
+static void
+ipa_print_constant_value (FILE *f, tree val)
+{
+  print_generic_expr (f, val);
+
+  /* This is in keeping with values_equal_for_ipcp_p.  */
+  if (TREE_CODE (val) == ADDR_EXPR
+      && (TREE_CODE (TREE_OPERAND (val, 0)) == CONST_DECL
+         || (TREE_CODE (TREE_OPERAND (val, 0)) == VAR_DECL
+             && DECL_IN_CONSTANT_POOL (TREE_OPERAND (val, 0)))))
+    {
+      fputs (" -> ", f);
+      print_generic_expr (f, DECL_INITIAL (TREE_OPERAND (val, 0)));
+    }
+}
+
 /* Print the jump functions associated with call graph edge CS to file F.  */
 
 static void
@@ -386,15 +404,8 @@ ipa_print_node_jump_functions_for_edge (FILE *f, struct cgraph_edge *cs)
        fprintf (f, "UNKNOWN\n");
       else if (type == IPA_JF_CONST)
        {
-         tree val = jump_func->value.constant.value;
          fprintf (f, "CONST: ");
-         print_generic_expr (f, val);
-         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)));
-           }
+         ipa_print_constant_value (f, jump_func->value.constant.value);
          fprintf (f, "\n");
        }
       else if (type == IPA_JF_PASS_THROUGH)
@@ -468,7 +479,7 @@ ipa_print_node_jump_functions_for_edge (FILE *f, struct cgraph_edge *cs)
              else if (item->jftype == IPA_JF_CONST)
                {
                  fprintf (f, "CONST: ");
-                 print_generic_expr (f, item->value.constant);
+                 ipa_print_constant_value (f, item->value.constant);
                }
              else if (item->jftype == IPA_JF_UNKNOWN)
                fprintf (f, "UNKNOWN: " HOST_WIDE_INT_PRINT_DEC " bits",