diff options
author | Martin Jambor <mjambor@suse.cz> | 2009-06-16 12:16:40 +0200 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2009-06-16 12:16:40 +0200 |
commit | 0ec19b8c10ff2565ff2ffbff4d98fa3162d297d5 (patch) | |
tree | 1ca541eee9b0e36e38c0220a24d44f841ccf3b3e /gcc | |
parent | 3bc462c29cd9ec12f5a74c4b08bbd646e658e4a1 (diff) | |
download | gcc-0ec19b8c10ff2565ff2ffbff4d98fa3162d297d5.zip gcc-0ec19b8c10ff2565ff2ffbff4d98fa3162d297d5.tar.gz gcc-0ec19b8c10ff2565ff2ffbff4d98fa3162d297d5.tar.bz2 |
re PR tree-optimization/40432 (verify_stmts failed with -O2: non-register as LHS of unary operation)
2009-06-16 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/40432
* tree-sra.c (sra_modify_assign): When creating VIEW_CONVERT_EXPR,
check whether we need to force gimple register operand.
* testsuite/gcc.c-torture/compile/pr40432.c: New file.
From-SVN: r148522
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr40432.c | 17 | ||||
-rw-r--r-- | gcc/tree-sra.c | 6 |
4 files changed, 32 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 36aa10b..b016481 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2009-06-16 Martin Jambor <mjambor@suse.cz> + PR tree-optimization/40432 + * tree-sra.c (sra_modify_assign): When creating VIEW_CONVERT_EXPR, + check whether we need to force gimple register operand. + +2009-06-16 Martin Jambor <mjambor@suse.cz> + PR tree-optimization/40413 * tree-sra.c (load_assign_lhs_subreplacements): Pass offset to build_ref_for_offset. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d882c6c..02f87d0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2009-06-16 Martin Jambor <mjambor@suse.cz> + * testsuite/gcc.c-torture/compile/pr40432.c: New file. + +2009-06-16 Martin Jambor <mjambor@suse.cz> + * testsuite/gfortran.fortran-torture/compile/pr40413.f90: New file. 2009-06-16 Janus Weil <janus@gcc.gnu.org> diff --git a/gcc/testsuite/gcc.c-torture/compile/pr40432.c b/gcc/testsuite/gcc.c-torture/compile/pr40432.c new file mode 100644 index 0000000..767f594 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr40432.c @@ -0,0 +1,17 @@ +/* Test that SRA produces valid gimple when handling both type punning by means + of VCE and creating an access to a union. */ + +union U { + struct something *sth; + void *nothing; +}; + +void +foo (union U *target, void *p) +{ + union U u; + + u.nothing = p; + *target = u; + return; +} diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index ddb015c..a2f783a 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -2096,7 +2096,11 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi, rhs = expr; } if (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (rhs))) - rhs = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (lhs), rhs); + { + rhs = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (lhs), rhs); + if (!is_gimple_reg (lhs)) + force_gimple_rhs = true; + } } if (force_gimple_rhs) |