From 7aa62ea1f86d6126485a01b7e91efe85544cc877 Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Thu, 30 Jun 2011 15:24:19 +0200 Subject: [PATCH] re PR tree-optimization/49094 (ARM aligned(1) attribute is sometimes dropped) 2011-06-30 Martin Jambor PR tree-optimization/49094 * tree-sra.c (tree_non_mode_aligned_mem_p): New function. (build_accesses_from_assign): Use it. * testsuite/gcc.dg/tree-ssa/pr49094.c: New test. From-SVN: r175703 --- gcc/ChangeLog | 6 ++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.dg/tree-ssa/pr49094.c | 38 +++++++++++++++++++++++++ gcc/tree-sra.c | 26 ++++++++++++++++- 4 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr49094.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cf9bfa218da..17f1cd8681a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-06-30 Martin Jambor + + PR tree-optimization/49094 + * tree-sra.c (tree_non_mode_aligned_mem_p): New function. + (build_accesses_from_assign): Use it. + 2011-06-30 Jakub Jelinek * tree-ssa-structalias.c (find_func_aliases_for_builtin_call): Fix diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d2e9ee67875..ead74b9055a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-06-30 Martin Jambor + + PR tree-optimization/49094 + * gcc.dg/tree-ssa/pr49094.c: New test. + 2011-06-30 Jakub Jelinek PR fortran/49540 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr49094.c b/gcc/testsuite/gcc.dg/tree-ssa/pr49094.c new file mode 100644 index 00000000000..5e565f786f4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr49094.c @@ -0,0 +1,38 @@ +/* { dg-do run } */ +/* { dg-options "-O" } */ + +struct in_addr { + unsigned int s_addr; +}; + +struct ip { + unsigned char ip_p; + unsigned short ip_sum; + struct in_addr ip_src,ip_dst; +} __attribute__ ((aligned(1), packed)); + +struct ip ip_fw_fwd_addr; + +int test_alignment( char *m ) +{ + struct ip *ip = (struct ip *) m; + struct in_addr pkt_dst; + pkt_dst = ip->ip_dst ; + if( pkt_dst.s_addr == 0 ) + return 1; + else + return 0; +} + +int __attribute__ ((noinline, noclone)) +intermediary (char *p) +{ + return test_alignment (p); +} + +int +main (int argc, char *argv[]) +{ + ip_fw_fwd_addr.ip_dst.s_addr = 1; + return intermediary ((void *) &ip_fw_fwd_addr); +} diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 45ebd93698d..e45ff8a0272 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -1050,6 +1050,26 @@ disqualify_ops_if_throwing_stmt (gimple stmt, tree lhs, tree rhs) return false; } +/* Return true iff type of EXP is not sufficiently aligned. */ + +static bool +tree_non_mode_aligned_mem_p (tree exp) +{ + enum machine_mode mode = TYPE_MODE (TREE_TYPE (exp)); + unsigned int align; + + if (TREE_CODE (exp) == SSA_NAME + || mode == BLKmode + || !STRICT_ALIGNMENT) + return false; + + align = get_object_alignment (exp, BIGGEST_ALIGNMENT); + if (GET_MODE_ALIGNMENT (mode) > align) + return true; + + return false; +} + /* Scan expressions occuring in STMT, create access structures for all accesses to candidates for scalarization and remove those candidates which occur in statements or expressions that prevent them from being split apart. Return @@ -1074,7 +1094,10 @@ build_accesses_from_assign (gimple stmt) lacc = build_access_from_expr_1 (lhs, stmt, true); if (lacc) - lacc->grp_assignment_write = 1; + { + lacc->grp_assignment_write = 1; + lacc->grp_unscalarizable_region |= tree_non_mode_aligned_mem_p (rhs); + } if (racc) { @@ -1082,6 +1105,7 @@ build_accesses_from_assign (gimple stmt) if (should_scalarize_away_bitmap && !gimple_has_volatile_ops (stmt) && !is_gimple_reg_type (racc->type)) bitmap_set_bit (should_scalarize_away_bitmap, DECL_UID (racc->base)); + racc->grp_unscalarizable_region |= tree_non_mode_aligned_mem_p (lhs); } if (lacc && racc -- 2.30.2