Paolo Bonzini <[EMAIL PROTECTED]> writes:
> Index: cse.c
> ===================================================================
> --- cse.c     (revision 134435)
> +++ cse.c     (working copy)
> @@ -3161,10 +3161,8 @@ fold_rtx (rtx x, rtx insn)
>          FIXME: those ports should be fixed.  */
>       if (new != 0 && is_const
>           && GET_CODE (new) == PLUS
> -         && (GET_CODE (XEXP (new, 0)) == SYMBOL_REF
> -             || GET_CODE (XEXP (new, 0)) == LABEL_REF)
>           && GET_CODE (XEXP (new, 1)) == CONST_INT)
> -       new = gen_rtx_CONST (mode, new);
> +       new = plus_constant (XEXP (new, 0), XEXP (new, 1));
> +     else
> +       new = plus_constant (new, 0);
>        }
>        break;

I'm not sure about this bit.

First of all, isn't the whole of the original "if" statement
redundant these days?  "new" is the result of simplify_unary_operation,
and I'd have expected that function to return:

   (const (plus [symbol_ref|label_ref] (const_int X)))

rather than:

   (plus [symbol_ref|label_ref] (const_int X))

I think the same true of the revised "if" statement too: if plus_constant
could add a CONST, simplify_unary_operation should already have done that.

(The "else" bit isn't safe against "new" being NULL, btw.)

Couldn't:

      {
        int is_const = 0;

        /* We can't simplify extension ops unless we know the
           original mode.  */
        if ((code == ZERO_EXTEND || code == SIGN_EXTEND)
            && mode_arg0 == VOIDmode)
          break;

        /* If we had a CONST, strip it off and put it back later if we
           fold.  */
        if (const_arg0 != 0 && GET_CODE (const_arg0) == CONST)
          is_const = 1, const_arg0 = XEXP (const_arg0, 0);

        new = simplify_unary_operation (code, mode,
                                        const_arg0 ? const_arg0 : folded_arg0,
                                        mode_arg0);
        /* NEG of PLUS could be converted into MINUS, but that causes
           expressions of the form
           (CONST (MINUS (CONST_INT) (SYMBOL_REF)))
           which many ports mistakenly treat as LEGITIMATE_CONSTANT_P.
           FIXME: those ports should be fixed.  */
        if (new != 0 && is_const
            && GET_CODE (new) == PLUS
            && (GET_CODE (XEXP (new, 0)) == SYMBOL_REF
                || GET_CODE (XEXP (new, 0)) == LABEL_REF)
            && GET_CODE (XEXP (new, 1)) == CONST_INT)
          new = gen_rtx_CONST (mode, new);
      }

simply be replaced by:

      /* We can't simplify extension ops unless we know the
         original mode.  */
      if ((code == ZERO_EXTEND || code == SIGN_EXTEND)
          && mode_arg0 == VOIDmode)
        break;

      new = simplify_unary_operation (code, mode,
                                      const_arg0 ? const_arg0 : folded_arg0,
                                      mode_arg0);
?

(Sorry if I'm repeating earlier discussion here.)

Richard

Reply via email to