From e8e9e1cda43a2b56618172896acb62103cd6bab8 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 26 Nov 2013 09:04:44 +0000 Subject: [PATCH] re PR tree-optimization/59287 (points-to analysis confused by union accesses) 2013-11-26 Richard Biener PR tree-optimization/59287 * tree-ssa-structalias.c (get_constraint_for_component_ref): Remove no longer necessary special-casing of union accesses. * gcc.dg/tree-ssa/alias-29.c: New testcase. From-SVN: r205380 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/tree-ssa/alias-29.c | 27 ++++++++++++++++++++++++ gcc/tree-ssa-structalias.c | 23 -------------------- 4 files changed, 38 insertions(+), 23 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/alias-29.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 17fafa121f0..9a820b50302 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-11-26 Richard Biener + + PR tree-optimization/59287 + * tree-ssa-structalias.c (get_constraint_for_component_ref): + Remove no longer necessary special-casing of union accesses. + 2013-11-26 Richard Biener * pretty-print.c (output_buffer::~output_buffer): Really diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2e9ff158fb2..25d88733d2c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-11-26 Richard Biener + + PR tree-optimization/59287 + * gcc.dg/tree-ssa/alias-29.c: New testcase. + 2013-11-25 Paolo Carlini PR c++/54485 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/alias-29.c b/gcc/testsuite/gcc.dg/tree-ssa/alias-29.c new file mode 100644 index 00000000000..4d57ca8f8f0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/alias-29.c @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +union X { + int i; + void *p; +}; +void bar (int); + +int * __attribute__((noinline,noclone)) +baz (int *p) { return p; } + +void foo (union X *x) +{ + struct Y { int i; } ystruct = {}; + ystruct.i = * baz (&ystruct.i); + bar (x->i); +} + +/* DSE and then DCE should be able to remove all uses of ystruct. + Formerly the union access for the parameter to bar let 'anything' + escape which made the call to bar possibly use ystruct and thus + prevent the store to ystruct.i from being eliminated. The call to + baz makes sure that ystruct has its address taken. */ + +/* { dg-final { scan-tree-dump-not "ystruct" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 2851eae438d..6482e68c04f 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -3163,29 +3163,6 @@ get_constraint_for_component_ref (tree t, vec *results, return; } - /* Handle type-punning through unions. If we are extracting a pointer - from a union via a possibly type-punning access that pointer - points to anything, similar to a conversion of an integer to - a pointer. */ - if (!lhs_p) - { - tree u; - for (u = t; - TREE_CODE (u) == COMPONENT_REF || TREE_CODE (u) == ARRAY_REF; - u = TREE_OPERAND (u, 0)) - if (TREE_CODE (u) == COMPONENT_REF - && TREE_CODE (TREE_TYPE (TREE_OPERAND (u, 0))) == UNION_TYPE) - { - struct constraint_expr temp; - - temp.offset = 0; - temp.var = anything_id; - temp.type = ADDRESSOF; - results->safe_push (temp); - return; - } - } - t = get_ref_base_and_extent (t, &bitpos, &bitsize, &bitmaxsize); /* Pretend to take the address of the base, we'll take care of