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

--- Comment #16 from Martin Jambor <jamborm at gcc dot gnu.org> ---
For the IPA-CP ICE, I am still running some tests, but I am currently leaning
towards the following.  It might in theory disable IPA-CP in some strange K&R
corner cases (I am searching for those with the tests), but I cannot say I care
too much even if it does:

diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
index 167913cb927..4c8b76c09be 100644
--- a/gcc/ipa-cp.c
+++ b/gcc/ipa-cp.c
@@ -1186,6 +1186,20 @@ set_single_call_flag (cgraph_node *node, void *)
   return false;
 }

+/* Return true if the Ith formal parameter in function described by INFO has a
+   type that is known and safe to accept constants.  */
+
+static bool
+ipa_cp_param_has_safe_type_p (ipa_node_params *info, int i)
+{
+  tree t = ipa_get_type (info, i);
+  if (!t)
+    return false;
+  /* Attempting to propagate to parameters that are VLAs runs afoul
limitations
+     of how clone materialization implementation.  */
+  return TREE_CODE (TYPE_SIZE (t)) == INTEGER_CST;
+}
+
 /* Initialize ipcp_lattices.  */

 static void
@@ -1277,7 +1291,8 @@ initialize_node_lattices (struct cgraph_node *node)
       ipcp_param_lattices *plats = ipa_get_parm_lattices (info, i);
       if (disable
          || (pre_modified && (surviving_params.length () <= (unsigned) i
-                              || !surviving_params[i])))
+                              || !surviving_params[i]))
+         || !ipa_cp_param_has_safe_type_p (info, i))
        {
          plats->itself.set_to_bottom ();
          plats->ctxlat.set_to_bottom ();

Reply via email to