OSDN Git Service

2010-04-19 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 19 Apr 2010 13:36:54 +0000 (13:36 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 19 Apr 2010 13:36:54 +0000 (13:36 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158517 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr43783.c [new file with mode: 0644]
gcc/tree-ssa-pre.c

index f33e38f..3b7b3fc 100644 (file)
@@ -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
index 06f9bf3..d13ba3a 100644 (file)
@@ -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 (file)
index 0000000..3880026
--- /dev/null
@@ -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;
+}
index ae630df..dd9fb96 100644 (file)
@@ -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);