From 217c08c57118c5afc573dbaa4bcef5874787616f Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Wed, 14 Jan 2015 11:35:13 +0100 Subject: [PATCH] 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. From-SVN: r219586 --- gcc/ChangeLog | 5 +++++ gcc/ipa-icf-gimple.c | 14 ++++++++++++- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/ipa/pr64307.c | 32 ++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/ipa/pr64307.c 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 + + * 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 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 + + * gcc.dg/ipa/pr64307.c: New test. + 2015-01-14 Tejas Belagod * 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 + +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" } } */ -- 2.30.2