diff options
author | Martin Jambor <mjambor@suse.cz> | 2013-01-04 14:20:38 +0100 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2013-01-04 14:20:38 +0100 |
commit | 87eab55418a76e2912b8b2d1e1acb0f37c137017 (patch) | |
tree | 36dbf3acb2f58a0929719fd035fe57a3dfc6e32c | |
parent | 90d04a445cb821407e109da069ac93cd5ff3031f (diff) | |
download | gcc-87eab55418a76e2912b8b2d1e1acb0f37c137017.zip gcc-87eab55418a76e2912b8b2d1e1acb0f37c137017.tar.gz gcc-87eab55418a76e2912b8b2d1e1acb0f37c137017.tar.bz2 |
re PR tree-optimization/55755 (Invalid VIEW_CONVERT_EXPR produced by SRA)
2013-01-04 Martin Jambor <mjambor@suse.cz>
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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr55755.c | 43 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr45144.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/sra-13.c | 114 | ||||
-rw-r--r-- | gcc/tree-sra.c | 6 |
6 files changed, 173 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e31d6e7..9a842c4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-01-04 Martin Jambor <mjambor@suse.cz> + + 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 <polacek@redhat.com> PR middle-end/55859 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a4f4685..c9c434b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2013-01-04 Martin Jambor <mjambor@suse.cz> + + 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 <rguenther@suse.de> 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 0000000..3c8bb6b --- /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 85b2b15..af23fb5 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<unsigned int>\\(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 0000000..12b77fe --- /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 286ef26..9c75393 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))) |