re PR tree-optimization/63747 (icf mis-compares switch gimple)
authorMartin Liska <mliska@suse.cz>
Fri, 7 Nov 2014 12:35:43 +0000 (13:35 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Fri, 7 Nov 2014 12:35:43 +0000 (12:35 +0000)
PR ipa/63747
* gcc.dg/ipa/pr63747.c: New test.
* ipa-icf-gimple.c (func_checker::compare_gimple_switch):
Missing checking for CASE_LOW and CASE_HIGH added.

From-SVN: r217219

gcc/ChangeLog
gcc/ipa-icf-gimple.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/ipa/pr63747.c [new file with mode: 0644]

index 6fc91b5d66db3d37d701109ea048c2df9811d8cd..6e721a68b205ade515d300991394a3c6e73cfd8f 100644 (file)
@@ -1,3 +1,9 @@
+2014-11-07  Martin Liska  <mliska@suse.cz>
+
+       PR ipa/63747
+       * ipa-icf-gimple.c (func_checker::compare_gimple_switch):
+       Missing checking for CASE_LOW and CASE_HIGH added.
+
 2014-11-07  Martin Liska  <mliska@suse.cz>
 
        PR ipa/63595
index ecb96671fb76d164b03ea92c4a9f91f301f8e515..75b5cfbc202e97d5ea906197e433b21e05c3ce8a 100644 (file)
@@ -798,6 +798,19 @@ func_checker::compare_gimple_switch (gimple g1, gimple g2)
       tree label1 = gimple_switch_label (g1, i);
       tree label2 = gimple_switch_label (g2, i);
 
+      /* Label LOW and HIGH comparison.  */
+      tree low1 = CASE_LOW (label1);
+      tree low2 = CASE_LOW (label2);
+
+      if (!tree_int_cst_equal (low1, low2))
+       return return_false_with_msg ("case low values are different");
+
+      tree high1 = CASE_HIGH (label1);
+      tree high2 = CASE_HIGH (label2);
+
+      if (!tree_int_cst_equal (high1, high2))
+       return return_false_with_msg ("case high values are different");
+
       if (TREE_CODE (label1) == CASE_LABEL_EXPR
          && TREE_CODE (label2) == CASE_LABEL_EXPR)
        {
index 8575ba3e18028fc871f472d4043db29186ff1e1c..036d59d3013420cce4d04dede826dd19093e3d5b 100644 (file)
@@ -1,3 +1,8 @@
+2014-11-07  Martin Liska  <mliska@suse.cz>
+
+       PR ipa/63747
+       * gcc.dg/ipa/pr63747.c: New test.
+
 2014-11-07  Martin Liska  <mliska@suse.cz>
 
        PR ipa/63595
diff --git a/gcc/testsuite/gcc.dg/ipa/pr63747.c b/gcc/testsuite/gcc.dg/ipa/pr63747.c
new file mode 100644 (file)
index 0000000..7b5df4b
--- /dev/null
@@ -0,0 +1,40 @@
+/* { dg-options "-O2 -fdump-ipa-icf" } */
+/* { dg-do run } */
+
+static int __attribute__((noinline))
+foo(int i)
+{
+  switch (i)
+  {
+    case 0:
+    case 1:
+    case 2:
+    case 3:
+      return 0;
+    default:
+      return 1;
+  }
+}
+
+static int __attribute__((noinline))
+bar(int i)
+{
+  switch (i)
+  {
+    case 4:
+    case 5:
+    case 6:
+    case 7:
+      return 0;
+    default:
+      return 1;
+  }
+}
+
+int main()
+{
+  return foo(0) + bar(4);
+}
+
+/* { dg-final { scan-ipa-dump "Equal symbols: 0" "icf"  } } */
+/* { dg-final { cleanup-ipa-dump "icf" } } */