aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-04-19 13:36:54 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-04-19 13:36:54 +0000
commitd53bed0b2cf5072df636ea3578c46d9d88e906e6 (patch)
treeabc95b452bb0ec3c0f5823a4ec430430ab30b999 /gcc
parent90f775a9c7afd62cbd338b973ec9711354440c6c (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr43783.c21
-rw-r--r--gcc/tree-ssa-pre.c39
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);