http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46076

--- Comment #15 from Martin Jambor <jamborm at gcc dot gnu.org> 2011-01-04 
17:39:45 UTC ---
I'd also prefer a general solution and would not actually mind very
much if we regressed in cases like this.  Nevertheless, if we have a
consensus that we should avoid regressing in 4.6, an ipa-prop.c
specific handling of this situation would probably look very much like
the patch below.  Given the discussion above I am not 100% sure it is
always safe but it passes bootstrap and testing (though I do not know
how much it exercises the code path).  I'll be happy to submit the
patch with a testcase and a change log and stuff if any maintainer
thinks it is a good idea.

Index: gcc/ipa-prop.c
===================================================================
--- gcc/ipa-prop.c    (revision 168424)
+++ gcc/ipa-prop.c    (working copy)
@@ -396,6 +396,25 @@ compute_complex_assign_jump_func (struct
     }
       return;
     }
+  else if (!op2 && is_gimple_ip_invariant (op1))
+    {
+      tree name_type = TREE_TYPE (name);
+      tree op_type = TREE_TYPE (op1);
+
+      if (useless_type_conversion_p (name_type, op_type)
+      || (POINTER_TYPE_P (name_type)
+          && POINTER_TYPE_P (op_type)
+          && TREE_CODE (TREE_TYPE (name_type)) == FUNCTION_TYPE
+          && TREE_CODE (TREE_TYPE (op_type)) == FUNCTION_TYPE
+          && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (name_type)))
+          == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (op_type))))
+          && TYPE_ARG_TYPES (TREE_TYPE (name_type)) == void_list_node
+          && !TYPE_ARG_TYPES (TREE_TYPE (op_type))))
+    {
+      jfunc->type = IPA_JF_CONST;
+      jfunc->value.constant = op1;
+    }
+    }

   if (TREE_CODE (op1) != ADDR_EXPR)
     return;

Reply via email to