From 68a1a5da2b17865bb90a28ba13a117092b82b608 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sat, 28 Feb 2004 07:33:10 +0000 Subject: [PATCH] fold-const.c (fold): Strip NOPs that change the signedness for RSHIFT too. * fold-const.c (fold): Strip NOPs that change the signedness for RSHIFT too. Expand comment. From-SVN: r78603 --- gcc/ChangeLog | 7 ++++++- gcc/fold-const.c | 20 +++++++++++++------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 879bbfcf1705..8722e946c578 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,8 +1,13 @@ +2004-02-28 Eric Botcazou + + * fold-const.c (fold): Strip NOPs that change the signedness + for RSHIFT too. Expand comment. + 2004-02-27 Ian Lance Taylor 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 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 9178a3441782..04452de6c7f6 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) -- 2.47.2