diff options
author | Richard Guenther <rguenther@suse.de> | 2010-04-19 13:36:54 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2010-04-19 13:36:54 +0000 |
commit | d53bed0b2cf5072df636ea3578c46d9d88e906e6 (patch) | |
tree | abc95b452bb0ec3c0f5823a4ec430430ab30b999 | |
parent | 90f775a9c7afd62cbd338b973ec9711354440c6c (diff) | |
download | gcc-d53bed0b2cf5072df636ea3578c46d9d88e906e6.zip gcc-d53bed0b2cf5072df636ea3578c46d9d88e906e6.tar.gz gcc-d53bed0b2cf5072df636ea3578c46d9d88e906e6.tar.bz2 |
re PR tree-optimization/43783 (-O -ftree-pre options compile libbid wrong)
2010-04-19 Richard Guenther <rguenther@suse.de>
PR tree-optimization/43783
* tree-ssa-pre.c (create_component_ref_by_pieces_1): Drop
constant ARRAY_REF operands two and three if possible.
* gcc.c-torture/execute/pr43783.c: New testcase.
From-SVN: r158517
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr43783.c | 21 | ||||
-rw-r--r-- | gcc/tree-ssa-pre.c | 39 |
4 files changed, 59 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f33e38f..3b7b3fc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-04-19 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/43783 + * tree-ssa-pre.c (create_component_ref_by_pieces_1): Drop + constant ARRAY_REF operands two and three if possible. + 2010-04-19 Uros Bizjak <ubizjak@gmail.com> PR target/43766 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 06f9bf3..d13ba3a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-04-19 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/43783 + * gcc.c-torture/execute/pr43783.c: New testcase. + 2010-04-19 Uros Bizjak <ubizjak@gmail.com> PR target/43766 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr43783.c b/gcc/testsuite/gcc.c-torture/execute/pr43783.c new file mode 100644 index 0000000..3880026 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr43783.c @@ -0,0 +1,21 @@ +typedef __attribute__((aligned(16))) +struct { + unsigned long long w[3]; +} UINT192; + +UINT192 bid_Kx192[32]; + +extern void abort (void); + +int main() +{ + int i = 0; + unsigned long x = 0; + for (i = 0; i < 32; ++i) + bid_Kx192[i].w[1] = i == 1; + for (i = 0; i < 32; ++i) + x += bid_Kx192[1].w[1]; + if (x != 32) + abort (); + return 0; +} diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index ae630df..dd9fb96 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -2779,22 +2779,37 @@ create_component_ref_by_pieces_1 (basic_block block, vn_reference_t ref, return NULL_TREE; if (genop2) { - op2expr = get_or_alloc_expr_for (genop2); - genop2 = find_or_generate_expression (block, op2expr, stmts, - domstmt); - if (!genop2) - return NULL_TREE; + /* Drop zero minimum index. */ + if (tree_int_cst_equal (genop2, integer_zero_node)) + genop2 = NULL_TREE; + else + { + op2expr = get_or_alloc_expr_for (genop2); + genop2 = find_or_generate_expression (block, op2expr, stmts, + domstmt); + if (!genop2) + return NULL_TREE; + } } if (genop3) { tree elmt_type = TREE_TYPE (TREE_TYPE (genop0)); - genop3 = size_binop (EXACT_DIV_EXPR, genop3, - size_int (TYPE_ALIGN_UNIT (elmt_type))); - op3expr = get_or_alloc_expr_for (genop3); - genop3 = find_or_generate_expression (block, op3expr, stmts, - domstmt); - if (!genop3) - return NULL_TREE; + /* We can't always put a size in units of the element alignment + here as the element alignment may be not visible. See + PR43783. Simply drop the element size for constant + sizes. */ + if (tree_int_cst_equal (genop3, TYPE_SIZE_UNIT (elmt_type))) + genop3 = NULL_TREE; + else + { + genop3 = size_binop (EXACT_DIV_EXPR, genop3, + size_int (TYPE_ALIGN_UNIT (elmt_type))); + op3expr = get_or_alloc_expr_for (genop3); + genop3 = find_or_generate_expression (block, op3expr, stmts, + domstmt); + if (!genop3) + return NULL_TREE; + } } return build4 (currop->opcode, currop->type, genop0, genop1, genop2, genop3); |