Hi,

This patch fixes PR63664 and PR63574.  Problem is in NULL types for labels not 
handled by ICF properly.  I assume it is OK for labels to have NULL type and 
added check into ICF rather then fixed label generation.

Bootstrapped and checked on linux-x86_64.  OK for trunk?

Thanks,
Ilya
--
gcc/

2014-10-28  Ilya Enkovich  <ilya.enkov...@intel.com>

        PR ipa/63664
        PR bootstrap/63574
        * ipa-icf-gimple.c (func_checker::compatible_types_p): Allow NULL args.

gcc/testsuite/

2014-10-28  Ilya Enkovich  <ilya.enkov...@intel.com>

        PR ipa/63664
        * gcc.dg/ipa/pr63664.C: New.


diff --git a/gcc/ipa-icf-gimple.c b/gcc/ipa-icf-gimple.c
index 1369b74..afc0eeb 100644
--- a/gcc/ipa-icf-gimple.c
+++ b/gcc/ipa-icf-gimple.c
@@ -169,6 +169,11 @@ bool func_checker::compatible_types_p (tree t1, tree t2,
                                       bool compare_polymorphic,
                                       bool first_argument)
 {
+  if (!t1 && !t2)
+    return true;
+  else if (!t1 || !t2)
+    return false;
+
   if (TREE_CODE (t1) != TREE_CODE (t2))
     return return_false_with_msg ("different tree types");
 
diff --git a/gcc/testsuite/gcc.dg/ipa/pr63664.C 
b/gcc/testsuite/gcc.dg/ipa/pr63664.C
new file mode 100644
index 0000000..31d96d4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/ipa/pr63664.C
@@ -0,0 +1,43 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+class test {
+ public:
+  test (int val, int *p)
+    {
+      int_val = *p;
+      bool_val = (val != int_val);
+    }
+
+  ~test ()
+    {
+      if (!bool_val)
+       return;
+    }
+
+  int get_int_val () const { return int_val; }
+
+ private:
+  bool bool_val;
+  int int_val;
+};
+
+static int __attribute__ ((noinline))
+f1 (int i, int *p)
+{
+  test obj (i, p);
+  return obj.get_int_val ();
+}
+
+static int __attribute__ ((noinline))
+f2 (int i, int *p)
+{
+  test obj (i, p);
+  return obj.get_int_val ();
+}
+
+int
+f (int i, int *p)
+{
+  return f1 (i, p) + f2 (i, p);
+}

Reply via email to