diff options
author | Roger Sayle <roger@eyesopen.com> | 2004-03-20 23:03:03 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2004-03-20 23:03:03 +0000 |
commit | 8cce3d04c451595cc9f33a332a4dbeae2729b40e (patch) | |
tree | 715204d51caed06f5a32eb4eba6087472e7e2e33 | |
parent | 05fe5c6724457b820fb0750b3de07e90fba596f8 (diff) | |
download | gcc-8cce3d04c451595cc9f33a332a4dbeae2729b40e.zip gcc-8cce3d04c451595cc9f33a332a4dbeae2729b40e.tar.gz gcc-8cce3d04c451595cc9f33a332a4dbeae2729b40e.tar.bz2 |
re PR target/13889 (Assignment of an int to an int of different size in a struct gives ICE)
PR target/13889
* cse.c (fold_rtx): Avoid substituting constants into unary
convertion operations.
* gcc.c-torture/compile/pr13889.c: New test case.
From-SVN: r79762
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cse.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr13889.c | 7 |
4 files changed, 35 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f3de3ff..ccbe122 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-03-20 Roger Sayle <roger@eyesopen.com> + + PR target/13889 + * cse.c (fold_rtx): Avoid substituting constants into unary + convertion operations. + 2004-03-20 Kazu Hirata <kazu@cs.umass.edu> * fold-const.c (fold): Replace "expr" with "t". @@ -3662,6 +3662,23 @@ fold_rtx (rtx x, rtx insn) || (new_cost == old_cost && CONSTANT_P (XEXP (x, i)))) break; + /* It's not safe to substitute the operand of a conversion + operator with a constant, as the conversion's identity + depends upon the mode of it's operand. This optimization + is handled by the call to simplify_unary_operation. */ + if (GET_RTX_CLASS (code) == RTX_UNARY + && GET_MODE (replacements[j]) != mode_arg0 + && (code == ZERO_EXTEND + || code == SIGN_EXTEND + || code == TRUNCATE + || code == FLOAT_TRUNCATE + || code == FLOAT_EXTEND + || code == FLOAT + || code == FIX + || code == UNSIGNED_FLOAT + || code == UNSIGNED_FIX)) + continue; + if (validate_change (insn, &XEXP (x, i), replacements[j], 0)) break; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dc7239b..b53e941 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-03-20 Roger Sayle <roger@eyesopen.com> + + PR target/13889 + * gcc.c-torture/compile/pr13889.c: New test case. + 2004-03-20 Joseph S. Myers <jsm@polyomino.org.uk> PR c/14635 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr13889.c b/gcc/testsuite/gcc.c-torture/compile/pr13889.c new file mode 100644 index 0000000..d14bc9a --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr13889.c @@ -0,0 +1,7 @@ +/* PR target/13889 */ +struct { long long a; } *p; +void initNetFlowFunct(void) { + unsigned int b = (unsigned int)-1; + p->a = b; +} + |