diff options
-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; +} + |