diff mbox

Fix for ipa/63747

Message ID 545CAD66.9060901@suse.cz
State New
Headers show

Commit Message

Martin Liška Nov. 7, 2014, 11:30 a.m. UTC
Hello.

Following patch introduces LOW/HIGH checking in IPA ICF. Patch can bootstrap on x86_64-linux and regression has been introduced.
The patch was pre-approved by Honza.

Thanks,
Martin
gcc/testsuite/ChangeLog:

2014-11-07  Martin Liska  <mliska@suse.cz>

	PR ipa/63747
	* gcc.dg/ipa/pr63747.c: New test.

gcc/ChangeLog:

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.
diff mbox

Patch

diff --git a/gcc/ipa-icf-gimple.c b/gcc/ipa-icf-gimple.c
index ecb9667..75b5cfb 100644
--- a/gcc/ipa-icf-gimple.c
+++ b/gcc/ipa-icf-gimple.c
@@ -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)
 	{
diff --git a/gcc/testsuite/gcc.dg/ipa/pr63747.c b/gcc/testsuite/gcc.dg/ipa/pr63747.c
new file mode 100644
index 0000000..7b5df4b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/ipa/pr63747.c
@@ -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" } } */