aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Ellcey <sje@cup.hp.com>2008-05-09 18:26:57 +0000
committerSteve Ellcey <sje@cup.hp.com>2008-05-09 18:26:57 +0000
commit099fc5e342831cdd0c57d921313153ceb718a7b7 (patch)
tree39bb68b70269bce2b1d48abbeebca92443f4bfbc
parent39af7381a62f0296c26267129559085df2c451cc (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/ChangeLog34
-rw-r--r--gcc/emit-rtl.c31
-rw-r--r--gcc/explow.c2
-rw-r--r--gcc/gcse.c9
-rw-r--r--gcc/loop-invariant.c2
-rw-r--r--gcc/rtl.h1
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);