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

--- Comment #25 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
As a temporary fix for GCC 15, I think we could always do something like
--- gcc/cgraph.h.jj     2025-04-08 14:08:48.517319926 +0200
+++ gcc/cgraph.h        2025-04-10 10:07:19.059246243 +0200
@@ -896,8 +896,8 @@ struct GTY((tag ("SYMTAB_FUNCTION"))) cg
       indirect_calls (NULL),
       next_sibling_clone (NULL), prev_sibling_clone (NULL), clones (NULL),
       clone_of (NULL), call_site_hash (NULL), former_clone_of (NULL),
-      simdclone (NULL), simd_clones (NULL), ipa_transforms_to_apply (vNULL),
-      inlined_to (NULL), rtl (NULL),
+      singleton_retval (NULL), simdclone (NULL), simd_clones (NULL),
+      ipa_transforms_to_apply (vNULL), inlined_to (NULL), rtl (NULL),
       count (profile_count::uninitialized ()),
       count_materialization_scale (REG_BR_PROB_BASE), profile_id (0),
       unit_id (0), tp_first_run (0), thunk (false),
@@ -1408,6 +1408,9 @@ struct GTY((tag ("SYMTAB_FUNCTION"))) cg
   hash_table<cgraph_edge_hasher> *GTY(()) call_site_hash;
   /* Declaration node used to be clone of. */
   tree former_clone_of;
+  /* If ipa_return_value_sum range for this function is a CONSTANT_CLASS_P
+     singleton, store it here.  */
+  tree singleton_retval;

   /* If this is a SIMD clone, this points to the SIMD specific
      information for it.  */
--- gcc/lto-cgraph.cc.jj        2025-04-08 14:08:51.978271745 +0200
+++ gcc/lto-cgraph.cc   2025-04-10 10:29:12.536028532 +0200
@@ -474,6 +474,8 @@ lto_output_node (struct lto_simple_outpu
   FOR_EACH_VEC_ELT (node->ipa_transforms_to_apply, i, pass)
     streamer_write_hwi_stream (ob->main_stream, pass->static_pass_number);

+//  stream_write_tree (ob, node->singleton_retval, true);
+
   if (tag == LTO_symtab_analyzed_node)
     {
       if (node->inlined_to)
@@ -1334,6 +1336,8 @@ input_node (struct lto_file_decl_data *f
       node->ipa_transforms_to_apply.safe_push ((ipa_opt_pass_d *) pass);
     }

+//  node->singleton_retval = stream_read_tree (...);
+
   if (tag == LTO_symtab_analyzed_node)
     ref = streamer_read_hwi (ib);

--- gcc/ipa-prop.cc.jj  2025-04-08 14:08:51.869273262 +0200
+++ gcc/ipa-prop.cc     2025-04-10 11:20:37.071218021 +0200
@@ -6158,6 +6158,13 @@ ipa_record_return_value_range (value_ran
       ipa_return_value_sum->disable_insertion_hook ();
     }
   ipa_return_value_sum->get_create (n)->vr = ipa_get_value_range (val);
+  tree valr;
+  if (val.singleton_p (&valr)
+      && CONSTANT_CLASS_P (valr)
+      && !tree_expr_nan_p (valr))
+    n->singleton_retval = valr;
+  else
+    n->singleton_retval = NULL_TREE;
   if (dump_file && (dump_flags & TDF_DETAILS))
     {
       fprintf (dump_file, "Recording return range ");
@@ -6172,7 +6179,7 @@ bool
 ipa_return_value_range (value_range &range, tree decl)
 {
   cgraph_node *n = cgraph_node::get (decl);
-  if (!n || !ipa_return_value_sum)
+  if (!n)
     return false;
   enum availability avail;
   n = n->ultimate_alias_target (&avail);
@@ -6180,11 +6187,21 @@ ipa_return_value_range (value_range &ran
     return false;
   if (n->decl != decl && !useless_type_conversion_p (TREE_TYPE (decl),
TREE_TYPE (n->decl)))
     return false;
-  ipa_return_value_summary *v = ipa_return_value_sum->get (n);
-  if (!v)
-    return false;
-  v->vr->get_vrange (range);
-  return true;
+  if (ipa_return_value_sum)
+    if (ipa_return_value_summary *v = ipa_return_value_sum->get (n))
+      {
+       v->vr->get_vrange (range);
+       return true;
+      }
+  if (n->singleton_retval)
+    {
+      value_range vr (n->singleton_retval, n->singleton_retval);
+      if (is_a <frange> (vr))
+       (as_a <frange> (vr)).clear_nan ();
+      range = vr;
+      return true;
+    }
+  return false;
 }

 /* Reset all state within ipa-prop.cc so that we can rerun the compiler

except that I'd need help with the lto-cgraph.cc stuff how to stream
node->singleton_retval out and then back in.
Tested with non-LTO (and doing the n->singleton_retval handling in the last
hunk in precedence over ipa_return_value_sum).

Reply via email to