From 46b71b0354e0eba0e0b176a80434bb3a953aadb6 Mon Sep 17 00:00:00 2001 From: Peter Bergner Date: Mon, 7 Apr 2008 12:36:59 -0500 Subject: [PATCH] PR middle-end/PR28690 PR middle-end/PR28690 * rtlanal.c: Update copyright years. (commutative_operand_precedence): Give SYMBOL_REF's the same precedence as REG_POINTER and MEM_POINTER operands. * emit-rtl.c (gen_reg_rtx_and_attrs): New function. (set_reg_attrs_from_value): Call mark_reg_pointer as appropriate. * rtl.h (gen_reg_rtx_and_attrs): Add prototype for new function. * gcse.c: Update copyright years. (pre_delete): Call gen_reg_rtx_and_attrs. (hoist_code): Likewise. (build_store_vectors): Likewise. (delete_store): Likewise. * loop-invariant.c (move_invariant_reg): Likewise. Update copyright years. From-SVN: r133985 --- gcc/ChangeLog | 17 +++++++++++++++++ gcc/emit-rtl.c | 31 ++++++++++++++++++++++++++----- gcc/gcse.c | 11 +++++------ gcc/loop-invariant.c | 4 ++-- gcc/rtl.h | 1 + gcc/rtlanal.c | 4 +++- 6 files changed, 54 insertions(+), 14 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e350b846907..e60847d6bfc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,20 @@ +2008-04-07 Peter Bergner + + PR middle-end/PR28690 + * rtlanal.c: Update copyright years. + (commutative_operand_precedence): Give SYMBOL_REF's the same precedence + as REG_POINTER and MEM_POINTER operands. + * emit-rtl.c (gen_reg_rtx_and_attrs): New function. + (set_reg_attrs_from_value): Call mark_reg_pointer as appropriate. + * rtl.h (gen_reg_rtx_and_attrs): Add prototype for new function. + * gcse.c: Update copyright years. + (pre_delete): Call gen_reg_rtx_and_attrs. + (hoist_code): Likewise. + (build_store_vectors): Likewise. + (delete_store): Likewise. + * loop-invariant.c (move_invariant_reg): Likewise. + Update copyright years. + 2008-04-07 Uros Bizjak * config/i386/i386.md ("*sse_prologue_save_insn"): Use braced output diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index fd26d015763..2fe91163346 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -964,11 +964,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_and_attrs (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. diff --git a/gcc/gcse.c b/gcc/gcse.c index 201e42c5a97..20bb0804d2e 100644 --- a/gcc/gcse.c +++ b/gcc/gcse.c @@ -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. @@ -4463,8 +4463,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_and_attrs (SET_DEST (set)); gcse_emit_move_after (expr->reaching_reg, SET_DEST (set), insn); delete_insn (insn); @@ -4988,7 +4987,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_and_attrs (SET_DEST (set)); gcse_emit_move_after (expr->reaching_reg, SET_DEST (set), insn); delete_insn (insn); @@ -6121,7 +6120,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_and_attrs (ptr->pattern); if (dump_file) fprintf (dump_file, "Removing redundant store:\n"); replace_store_insn (r, XEXP (st, 0), bb, ptr); @@ -6444,7 +6443,7 @@ delete_store (struct ls_expr * expr, basic_block bb) 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_and_attrs (expr->pattern); reg = expr->reaching_reg; diff --git a/gcc/loop-invariant.c b/gcc/loop-invariant.c index 64c16a98423..f043884b15a 100644 --- a/gcc/loop-invariant.c +++ b/gcc/loop-invariant.c @@ -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, unsigned invno) 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_and_attrs (dest); /* Try replacing the destination by a new pseudoregister. */ if (!validate_change (inv->insn, &SET_DEST (set), reg, false)) diff --git a/gcc/rtl.h b/gcc/rtl.h index 604d0967895..aaa1a925a9d 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -1502,6 +1502,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_and_attrs (rtx); extern rtx gen_label_rtx (void); extern rtx gen_lowpart_common (enum machine_mode, rtx); diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 804d6c88e5c..f80d0ed1754 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -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) -- 2.30.2