PR rtl-optimization/35371 * rtlanal.c: Update copyright year. (commutative_operand_precedence): Give SYMBOL_REF's the same precedence as REG_POINTER's and MEM_POINTER's. * emit-rtl.c: Update copyright year. (set_reg_attrs_from_value): Copy the REG_POINTER/MEM_POINTER attribute over to the new reg rtx. (gen_reg_rtx_copy): New function. * gcse.c: Update copyright year. (pre_delete): Call gen_reg_rtx_copy rather than gen_reg_rtx. (hoist_code): Likewise. (build_store_vectors): Likewise. (delete_store): Likewise. * loop-invariant.c: Update copyright year. (move_invariant_reg): Call gen_reg_rtx_copy rather than gen_reg_rtx. * rtl.h: Update copyright year. (gen_reg_rtx_copy): Add prototype. Index: rtlanal.c =================================================================== --- rtlanal.c (revision 132568) +++ rtlanal.c (working copy) @@ -1,6 +1,6 @@ /* Analyze RTL for GNU compiler. Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This file is part of GCC. @@ -2898,6 +2898,8 @@ commutative_operand_precedence (rtx op) switch (GET_RTX_CLASS (code)) { case RTX_CONST_OBJ: + if (code == SYMBOL_REF) + return -1; if (code == CONST_INT) return -6; if (code == CONST_DOUBLE) Index: gcse.c =================================================================== --- gcse.c (revision 132568) +++ gcse.c (working copy) @@ -1,7 +1,7 @@ /* Global common subexpression elimination/Partial redundancy elimination and global constant/copy propagation for GNU compiler. Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, - 2006, 2007 Free Software Foundation, Inc. + 2006, 2007, 2008 Free Software Foundation, Inc. This file is part of GCC. @@ -4456,8 +4456,7 @@ pre_delete (void) expressions into. Get the mode for the new pseudo from the mode of the original destination pseudo. */ if (expr->reaching_reg == NULL) - expr->reaching_reg - = gen_reg_rtx (GET_MODE (SET_DEST (set))); + expr->reaching_reg = gen_reg_rtx_copy (SET_DEST (set)); gcse_emit_move_after (expr->reaching_reg, SET_DEST (set), insn); delete_insn (insn); @@ -4981,7 +4980,7 @@ hoist_code (void) from the mode of the original destination pseudo. */ if (expr->reaching_reg == NULL) expr->reaching_reg - = gen_reg_rtx (GET_MODE (SET_DEST (set))); + = gen_reg_rtx_copy (SET_DEST (set)); gcse_emit_move_after (expr->reaching_reg, SET_DEST (set), insn); delete_insn (insn); @@ -6114,7 +6113,7 @@ build_store_vectors (void) are any side effects. */ if (TEST_BIT (ae_gen[bb->index], ptr->index)) { - rtx r = gen_reg_rtx (GET_MODE (ptr->pattern)); + rtx r = gen_reg_rtx_copy (ptr->pattern); if (dump_file) fprintf (dump_file, "Removing redundant store:\n"); replace_store_insn (r, XEXP (st, 0), bb, ptr); @@ -6437,7 +6436,7 @@ delete_store (struct ls_expr * expr, bas rtx reg, i, del; if (expr->reaching_reg == NULL_RTX) - expr->reaching_reg = gen_reg_rtx (GET_MODE (expr->pattern)); + expr->reaching_reg = gen_reg_rtx_copy (expr->pattern); reg = expr->reaching_reg; Index: emit-rtl.c =================================================================== --- emit-rtl.c (revision 132568) +++ emit-rtl.c (working copy) @@ -1,6 +1,6 @@ /* Emit RTL for the GCC expander. Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This file is part of GCC. @@ -961,11 +961,32 @@ set_reg_attrs_from_value (rtx reg, rtx x int offset; offset = byte_lowpart_offset (GET_MODE (reg), GET_MODE (x)); - if (MEM_P (x) && MEM_OFFSET (x) && GET_CODE (MEM_OFFSET (x)) == CONST_INT) - REG_ATTRS (reg) - = get_reg_attrs (MEM_EXPR (x), INTVAL (MEM_OFFSET (x)) + offset); - if (REG_P (x) && REG_ATTRS (x)) - update_reg_offset (reg, x, offset); + if (MEM_P (x)) + { + if (MEM_OFFSET (x) && GET_CODE (MEM_OFFSET (x)) == CONST_INT) + REG_ATTRS (reg) + = get_reg_attrs (MEM_EXPR (x), INTVAL (MEM_OFFSET (x)) + offset); + if (MEM_POINTER (x)) + mark_reg_pointer (reg, MEM_ALIGN (x)); + } + else if (REG_P (x)) + { + if (REG_ATTRS (x)) + update_reg_offset (reg, x, offset); + if (REG_POINTER (x)) + mark_reg_pointer (reg, REGNO_POINTER_ALIGN (REGNO (x))); + } +} + +/* Generate a REG rtx for a new pseudo register, copying the mode + and attributes from X. */ + +rtx +gen_reg_rtx_copy (rtx x) +{ + rtx reg = gen_reg_rtx (GET_MODE (x)); + set_reg_attrs_from_value (reg, x); + return reg; } /* Set the register attributes for registers contained in PARM_RTX. Index: loop-invariant.c =================================================================== --- loop-invariant.c (revision 132568) +++ loop-invariant.c (working copy) @@ -1,5 +1,5 @@ /* RTL-level loop invariant motion. - Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This file is part of GCC. @@ -1193,7 +1193,7 @@ move_invariant_reg (struct loop *loop, u need to create a temporary register. */ set = single_set (inv->insn); dest = SET_DEST (set); - reg = gen_reg_rtx (GET_MODE (dest)); + reg = gen_reg_rtx_copy (dest); /* Try replacing the destination by a new pseudoregister. */ if (!validate_change (inv->insn, &SET_DEST (set), reg, false)) Index: rtl.h =================================================================== --- rtl.h (revision 132568) +++ rtl.h (working copy) @@ -1,6 +1,6 @@ /* Register Transfer Language (RTL) definitions for GCC Copyright (C) 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 + 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This file is part of GCC. @@ -1509,6 +1509,7 @@ extern rtvec gen_rtvec_v (int, rtx *); extern rtx gen_reg_rtx (enum machine_mode); extern rtx gen_rtx_REG_offset (rtx, enum machine_mode, unsigned int, int); extern rtx gen_reg_rtx_offset (rtx, enum machine_mode, int); +extern rtx gen_reg_rtx_copy (rtx); extern rtx gen_label_rtx (void); extern rtx gen_lowpart_common (enum machine_mode, rtx);