diff options
author | Steve Ellcey <sje@cup.hp.com> | 2008-05-09 18:26:57 +0000 |
---|---|---|
committer | Steve Ellcey <sje@cup.hp.com> | 2008-05-09 18:26:57 +0000 |
commit | 099fc5e342831cdd0c57d921313153ceb718a7b7 (patch) | |
tree | 39bb68b70269bce2b1d48abbeebca92443f4bfbc | |
parent | 39af7381a62f0296c26267129559085df2c451cc (diff) |
Backport from mainline:
2008-04-07 Peter Bergner <bergner@vnet.ibm.com>
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-08 Peter Bergner <bergner@vnet.ibm.com>
Revert
PR middle-end/PR28690
* rtlanal.c: (commutative_operand_precedence): Give SYMBOL_REF's the
same precedence as REG_POINTER and MEM_POINTER operands.
2008-04-09 Peter Bergner <bergner@vnet.ibm.com>
PR middle-end/PR28690
* explow.c (break_out_memory_refs): Use simplify_gen_binary rather
than gen_rtx_fmt_ee to perform more canonicalizations.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gcc-4_3-branch@135124 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 34 | ||||
-rw-r--r-- | gcc/emit-rtl.c | 31 | ||||
-rw-r--r-- | gcc/explow.c | 2 | ||||
-rw-r--r-- | gcc/gcse.c | 9 | ||||
-rw-r--r-- | gcc/loop-invariant.c | 2 | ||||
-rw-r--r-- | gcc/rtl.h | 1 |
6 files changed, 67 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 36ccc596f39..1f192ced66c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,40 @@ 2008-05-09 Steve Ellcey <sje@cup.hp.com> Backport from mainline: + + 2008-04-07 Peter Bergner <bergner@vnet.ibm.com> + + 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-08 Peter Bergner <bergner@vnet.ibm.com> + + Revert + PR middle-end/PR28690 + * rtlanal.c: (commutative_operand_precedence): Give SYMBOL_REF's the + same precedence as REG_POINTER and MEM_POINTER operands. + + 2008-04-09 Peter Bergner <bergner@vnet.ibm.com> + + PR middle-end/PR28690 + * explow.c (break_out_memory_refs): Use simplify_gen_binary rather + than gen_rtx_fmt_ee to perform more canonicalizations. + +2008-05-09 Steve Ellcey <sje@cup.hp.com> + + Backport from mainline: 2008-05-08 Steve Ellcey <sje@cup.hp.com> * stmt.c (expand_stack_restore): Change sa mode if needed. diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 1a9239ab8a5..2a0e81a24b7 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -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_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/explow.c b/gcc/explow.c index a5ed65b2e56..bab431a8b6d 100644 --- a/gcc/explow.c +++ b/gcc/explow.c @@ -305,7 +305,7 @@ break_out_memory_refs (rtx x) rtx op1 = break_out_memory_refs (XEXP (x, 1)); if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1)) - x = gen_rtx_fmt_ee (GET_CODE (x), Pmode, op0, op1); + x = simplify_gen_binary (GET_CODE (x), Pmode, op0, op1); } return x; diff --git a/gcc/gcse.c b/gcc/gcse.c index 8cb5d386702..0d63a962004 100644 --- a/gcc/gcse.c +++ b/gcc/gcse.c @@ -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_and_attrs (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_and_attrs (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_and_attrs (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, 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 ba1f2888b00..e0146a13247 100644 --- a/gcc/loop-invariant.c +++ b/gcc/loop-invariant.c @@ -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 f4aa35a387b..c70a07548d0 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -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_and_attrs (rtx); extern rtx gen_label_rtx (void); extern rtx gen_lowpart_common (enum machine_mode, rtx); |