From: Jan Hubicka Date: Tue, 7 Sep 2004 20:59:18 +0000 (+0200) Subject: cse.c (fold_rtx): Avoid building of (CONST (MINUS (CONST_INT) (SYMBOL_REF))) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ec666d23ca0f507e0940bcdf0b65848bceb1af30;p=gcc.git cse.c (fold_rtx): Avoid building of (CONST (MINUS (CONST_INT) (SYMBOL_REF))) * cse.c (fold_rtx): Avoid building of (CONST (MINUS (CONST_INT) (SYMBOL_REF))) From-SVN: r87156 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d00cc21e104..3938e7a5695 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,8 @@ 2004-09-07 Jan Hubicka + * cse.c (fold_rtx): Avoid building of + (CONST (MINUS (CONST_INT) (SYMBOL_REF))) + * tree-ssa-pre.c (grand_bitmap_obstack): New. (value_insert_into_set_bitmap, bitmap_set_new): Use the obstack. (init_pre): Initialize obstack. diff --git a/gcc/cse.c b/gcc/cse.c index 7b540a6e6b2..fb963287556 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -3787,7 +3787,16 @@ fold_rtx (rtx x, rtx insn) new = simplify_unary_operation (code, mode, const_arg0 ? const_arg0 : folded_arg0, mode_arg0); - if (new != 0 && is_const) + /* 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); } break;