cse.c (fold_rtx): Avoid building of (CONST (MINUS (CONST_INT) (SYMBOL_REF)))
authorJan Hubicka <jh@suse.cz>
Tue, 7 Sep 2004 20:59:18 +0000 (22:59 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 7 Sep 2004 20:59:18 +0000 (20:59 +0000)
* cse.c (fold_rtx):  Avoid building of
(CONST (MINUS (CONST_INT) (SYMBOL_REF)))

From-SVN: r87156

gcc/ChangeLog
gcc/cse.c

index d00cc21e1048f3e9593e1f4826298a3d9d4376b4..3938e7a569519052f70af786cb7d5452aa39fe1c 100644 (file)
@@ -1,5 +1,8 @@
 2004-09-07  Jan Hubicka  <jh@suse.cz>
 
+       * 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.
index 7b540a6e6b2dfeddadb6c996511a2f9411d785a2..fb9632875561ccfebdb1d828df47bdd682a90135 100644 (file)
--- 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;