diff options
| -rw-r--r-- | gcc/ChangeLog | 7 | ||||
| -rw-r--r-- | gcc/fold-const.c | 20 |
2 files changed, 19 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 879bbfc..8722e94 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,8 +1,13 @@ +2004-02-28 Eric Botcazou <ebotcazou@act-europe.fr> + + * fold-const.c (fold): Strip NOPs that change the signedness + for RSHIFT too. Expand comment. + 2004-02-27 Ian Lance Taylor <ian@wasabisystems.com> PR optimization/7871 * flow.c (mark_set_1): Don't add LOG_LINKS for global registers - from or to call insns. + from or to call insns. 2004-02-27 Eric Botcazou <ebotcazou@libertysurf.fr> diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 9178a344..04452de 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -5423,14 +5423,20 @@ fold (tree expr) if (op == 0) continue; /* Valid for CALL_EXPR, at least. */ - if (kind == '<' || code == RSHIFT_EXPR) - { - /* Signedness matters here. Perhaps we can refine this - later. */ - STRIP_SIGN_NOPS (op); - } + /* Strip any conversions that don't change the mode. This is + safe for every expression, except for a comparison expression + because its signedness is derived from its operands. So, in + the latter case, only strip conversions that don't change the + signedness. + + Note that this is done as an internal manipulation within the + constant folder, in order to find the simplest representation + of the arguments so that their form can be studied. In any + cases, the appropriate type conversions should be put back in + the tree that will get out of the constant folder. */ + if (kind == '<') + STRIP_SIGN_NOPS (op); else - /* Strip any conversions that don't change the mode. */ STRIP_NOPS (op); if (TREE_CODE (op) == COMPLEX_CST) |
