summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authormarxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4>2015-01-14 10:35:13 +0000
committermarxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4>2015-01-14 10:35:13 +0000
commitcadb17daec6ac57c49e1fe596f770c02f1abdba6 (patch)
tree9f702d94b0a0ab657939adb1fa1b6c7431d3b8d2 /gcc
parent3a487db5ceb67f9eb5568696a6d247e9061078d4 (diff)
downloadgcc-cadb17daec6ac57c49e1fe596f770c02f1abdba6.tar.gz
IPA ICF: handle IMAGPART_EXPR and REALPART_EXPR.
* gcc.dg/ipa/pr64307.c: New test. * ipa-icf-gimple.c (func_checker::compare_operand): Add support for IMAGPART_EXPR and REALPART_EXPR and fix BIT_FIELD_REF comparison. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@219586 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/ipa-icf-gimple.c14
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/ipa/pr64307.c32
4 files changed, 54 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 611f0a7bd49..3d4c8ab640e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2015-01-14 Martin Liska <mliska@suse.cz>
+
+ * ipa-icf-gimple.c (func_checker::compare_operand): Add support for
+ IMAGPART_EXPR and REALPART_EXPR and fix BIT_FIELD_REF comparison.
+
2015-01-14 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR target/64460
diff --git a/gcc/ipa-icf-gimple.c b/gcc/ipa-icf-gimple.c
index ed3cdf56ccb..05c2a23bd6f 100644
--- a/gcc/ipa-icf-gimple.c
+++ b/gcc/ipa-icf-gimple.c
@@ -448,6 +448,8 @@ func_checker::compare_operand (tree t1, tree t2)
return return_with_debug (ret);
}
+ case IMAGPART_EXPR:
+ case REALPART_EXPR:
case ADDR_EXPR:
{
x1 = TREE_OPERAND (t1, 0);
@@ -458,7 +460,17 @@ func_checker::compare_operand (tree t1, tree t2)
}
case BIT_FIELD_REF:
{
- ret = compare_decl (t1, t2);
+ x1 = TREE_OPERAND (t1, 0);
+ x2 = TREE_OPERAND (t2, 0);
+ y1 = TREE_OPERAND (t1, 1);
+ y2 = TREE_OPERAND (t2, 1);
+ z1 = TREE_OPERAND (t1, 2);
+ z2 = TREE_OPERAND (t2, 2);
+
+ ret = compare_operand (x1, x2)
+ && compare_cst_or_decl (y1, y2)
+ && compare_cst_or_decl (z1, z2);
+
return return_with_debug (ret);
}
case SSA_NAME:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4f3ed20941a..efb7c378b95 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2015-01-14 Martin Liska <mliska@suse.cz>
+
+ * gcc.dg/ipa/pr64307.c: New test.
+
2015-01-14 Tejas Belagod <tejas.belagod@arm.com>
* gcc.target/aarch64/vect-movi.c: Check for vectorization for
diff --git a/gcc/testsuite/gcc.dg/ipa/pr64307.c b/gcc/testsuite/gcc.dg/ipa/pr64307.c
new file mode 100644
index 00000000000..66a5df46a40
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/ipa/pr64307.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O0 -fipa-icf -fdump-ipa-icf" } */
+
+#include <complex.h>
+
+typedef _Complex float COMPLEX_FLOAT;
+
+__attribute__ ((noinline))
+static float real_part(COMPLEX_FLOAT a)
+{
+ return *(float*)(&a);
+}
+
+__attribute__ ((noinline))
+static float real_part_2(COMPLEX_FLOAT a)
+{
+ return ((float*)(&a))[0];
+}
+
+int main()
+{
+ COMPLEX_FLOAT f = 1.0f + _Complex_I;
+
+ float r1 = real_part(f);
+ float r2 = real_part_2(f);
+
+ return r1 - r2;
+}
+
+/* { dg-final { scan-ipa-dump "Semantic equality hit:real_part_2->real_part" "icf" } } */
+/* { dg-final { scan-ipa-dump "Equal symbols: 1" "icf" } } */
+/* { dg-final { cleanup-ipa-dump "icf" } } */