From 87eab55418a76e2912b8b2d1e1acb0f37c137017 Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Fri, 4 Jan 2013 14:20:38 +0100 Subject: [PATCH] re PR tree-optimization/55755 (Invalid VIEW_CONVERT_EXPR produced by SRA) 2013-01-04 Martin Jambor PR tree-optimization/55755 * tree-sra.c (sra_modify_assign): Do not check that an access has no children when trying to avoid producing a VIEW_CONVERT_EXPR. testsuite/ * gcc.dg/torture/pr55755.c: New test. * gcc.dg/tree-ssa/sra-13.c: Likewise. * gcc.dg/tree-ssa/pr45144.c: Update. From-SVN: r194905 --- gcc/ChangeLog | 6 ++ gcc/testsuite/ChangeLog | 7 ++ gcc/testsuite/gcc.dg/torture/pr55755.c | 43 +++++++++ gcc/testsuite/gcc.dg/tree-ssa/pr45144.c | 2 +- gcc/testsuite/gcc.dg/tree-ssa/sra-13.c | 114 ++++++++++++++++++++++++ gcc/tree-sra.c | 6 +- 6 files changed, 173 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr55755.c create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/sra-13.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e31d6e7e050..9a842c4b47a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-01-04 Martin Jambor + + PR tree-optimization/55755 + * tree-sra.c (sra_modify_assign): Do not check that an access has no + children when trying to avoid producing a VIEW_CONVERT_EXPR. + 2013-01-04 Marek Polacek PR middle-end/55859 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a4f4685f3d1..c9c434b2f6f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2013-01-04 Martin Jambor + + PR tree-optimization/55755 + * gcc.dg/torture/pr55755.c: New test. + * gcc.dg/tree-ssa/sra-13.c: Likewise. + * gcc.dg/tree-ssa/pr45144.c: Update. + 2013-01-04 Richard Biener PR middle-end/55863 diff --git a/gcc/testsuite/gcc.dg/torture/pr55755.c b/gcc/testsuite/gcc.dg/torture/pr55755.c new file mode 100644 index 00000000000..3c8bb6ba41a --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr55755.c @@ -0,0 +1,43 @@ +/* { dg-do run } */ +/* { dg-require-effective-target int32plus } */ + +struct S4 +{ + unsigned f0:24; +} __attribute__((__packed__)); + +struct S4 g_10 = { + 6210831 +}; + +struct S5 +{ + int i; + struct S4 l_8[2]; +} __attribute__((__packed__)); + +int a, b; + +struct S4 func_2 (int x) +{ + struct S5 l = { + 0, + {{0}, {0}} + }; + l.i = a; + g_10 = l.l_8[1]; + for (; x<2; x++) { + struct S4 tmp = { + 11936567 + }; + l.l_8[x] = tmp; + } + b = l.i; + return g_10; +} + +int main (void) +{ + func_2 (0); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr45144.c b/gcc/testsuite/gcc.dg/tree-ssa/pr45144.c index 85b2b159766..af23fb5970b 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr45144.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr45144.c @@ -43,5 +43,5 @@ bar (unsigned orig, unsigned *new) *new = foo (&a); } -/* { dg-final { scan-tree-dump " = VIEW_CONVERT_EXPR\\(a\\);" "optimized"} } */ +/* { dg-final { scan-tree-dump-not "unnamed-unsigned:19" "optimized"} } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/sra-13.c b/gcc/testsuite/gcc.dg/tree-ssa/sra-13.c new file mode 100644 index 00000000000..12b77fe2f27 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/sra-13.c @@ -0,0 +1,114 @@ +/* Test that SRA replacement can deal with assignments that have + sub-replacements on one side and a single scalar replacement on another. */ +/* { dg-do run } */ +/* { dg-options "-O1" } */ + +struct A +{ + int i1, i2; +}; + +struct B +{ + long long int l; +}; + +union U +{ + struct A a; + struct B b; +}; + +int b, gi; +long gl; +union U gu1, gu2; + +int __attribute__ ((noinline, noclone)) +foo (void) +{ + union U x, y; + int r; + + y = gu1; + if (b) + y.b.l = gl; + + x = y; + + if (!b) + r = x.a.i1; + else + r = 0; + + gu2 = x; + return r; +} + +long long int __attribute__ ((noinline, noclone)) +bar (void) +{ + union U x, y; + int r; + + y = gu1; + if (b) + y.a.i1 = gi; + + x = y; + + if (!b) + r = x.b.l; + else + r = 0; + + gu2 = x; + return r; +} + + +int +main (void) +{ + int r; + long long int s; + + b = 0; + gu1.a.i1 = 123; + gu1.a.i2 = 234; + r = foo (); + if (r != 123) + __builtin_abort (); + if (gu2.a.i1 != 123) + __builtin_abort (); + if (gu2.a.i2 != 234) + __builtin_abort (); + + b = 1; + gl = 10000001; + gu1.b.l = 10000000; + r = foo (); + if (r != 0) + __builtin_abort (); + if (gu2.b.l != 10000001) + __builtin_abort (); + + b = 0; + gu1.b.l = 20000000; + s = bar (); + if (s != 20000000) + __builtin_abort (); + if (gu2.b.l != 20000000) + __builtin_abort (); + + b = 1; + gi = 456; + gu1.a.i1 = 123; + gu1.a.i2 = 234; + s = bar (); + if (s != 0) + __builtin_abort (); + if (gu2.a.i1 != 456) + __builtin_abort (); + + return 0; +} diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 286ef266920..9c75393afae 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -3087,15 +3087,13 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi) ??? This should move to fold_stmt which we simply should call after building a VIEW_CONVERT_EXPR here. */ if (AGGREGATE_TYPE_P (TREE_TYPE (lhs)) - && !contains_bitfld_comp_ref_p (lhs) - && !access_has_children_p (lacc)) + && !contains_bitfld_comp_ref_p (lhs)) { lhs = build_ref_for_model (loc, lhs, 0, racc, gsi, false); gimple_assign_set_lhs (*stmt, lhs); } else if (AGGREGATE_TYPE_P (TREE_TYPE (rhs)) - && !contains_vce_or_bfcref_p (rhs) - && !access_has_children_p (racc)) + && !contains_vce_or_bfcref_p (rhs)) rhs = build_ref_for_model (loc, rhs, 0, lacc, gsi, false); if (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (rhs)))