aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Bergner <bergner@vnet.ibm.com>2007-07-23 16:43:24 +0000
committerPeter Bergner <bergner@vnet.ibm.com>2007-07-23 16:43:24 +0000
commit384dff278b4b2677d1b916e80c249c9c7f181ad0 (patch)
treeff49113424954fc128f22d29310fdf6c0c984bbc
parenta0fec52acae61a2ebf275df4a9aa8ef5b8d8c6a0 (diff)
PR middle-end/PR28690
* optabs.c (expand_binop): (emit_cmp_and_jump_insns): Allow EQ compares. * rtlanal.c (commutative_operand_precedence): Prefer both REG_POINTER and MEM_POINTER operands over REG and MEM operands. (swap_commutative_operands_p): Change return value to bool. * rtl.h: Update the corresponding prototype. * tree-ssa-address.c (gen_addr_rtx): Use simplify_gen_binary instead of gen_rtx_PLUS. * simplify-rtx.c (simplify_plus_minus_op_data_cmp): Change return value to bool. Change function arguments to rtx's and update code to match. (simplify_plus_minus): Update the simplify_plus_minus_op_data_cmp calls to match the new declaration. * simplify-rtx.c (simplify_associative_operation): Don't reorder simplify_binary_operation arguments. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@126852 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog19
-rw-r--r--gcc/optabs.c8
-rw-r--r--gcc/rtl.h2
-rw-r--r--gcc/rtlanal.c22
-rw-r--r--gcc/simplify-rtx.c32
-rw-r--r--gcc/tree-ssa-address.c2
6 files changed, 51 insertions, 34 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ad37fca1c92..a40140f7a2e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,22 @@
+2007-07-23 Peter Bergner <bergner@vnet.ibm.com>
+ Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/PR28690
+ * optabs.c (expand_binop): (emit_cmp_and_jump_insns): Allow EQ compares.
+ * rtlanal.c (commutative_operand_precedence): Prefer both REG_POINTER
+ and MEM_POINTER operands over REG and MEM operands.
+ (swap_commutative_operands_p): Change return value to bool.
+ * rtl.h: Update the corresponding prototype.
+ * tree-ssa-address.c (gen_addr_rtx): Use simplify_gen_binary
+ instead of gen_rtx_PLUS.
+ * simplify-rtx.c (simplify_plus_minus_op_data_cmp): Change return
+ value to bool. Change function arguments to rtx's and update code
+ to match.
+ (simplify_plus_minus): Update the simplify_plus_minus_op_data_cmp
+ calls to match the new declaration.
+ * simplify-rtx.c (simplify_associative_operation): Don't
+ reorder simplify_binary_operation arguments.
+
2007-07-23 Richard Sandiford <richard@codesourcery.com>
* config/mips/mips.c (override_options): Use mips_costs to derive
diff --git a/gcc/optabs.c b/gcc/optabs.c
index c754544f10f..b65d6002f2b 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -4070,9 +4070,11 @@ emit_cmp_and_jump_insns (rtx x, rtx y, enum rtx_code comparison, rtx size,
/* Swap operands and condition to ensure canonical RTL. */
if (swap_commutative_operands_p (x, y))
{
- /* If we're not emitting a branch, this means some caller
- is out of sync. */
- gcc_assert (label);
+ /* If we're not emitting a branch, callers are required to pass
+ operands in an order conforming to canonical RTL. We relax this
+ for commutative comparsions so callers using EQ don't need to do
+ swapping by hand. */
+ gcc_assert (label || (comparison == swap_condition (comparison)));
op0 = y, op1 = x;
comparison = swap_condition (comparison);
diff --git a/gcc/rtl.h b/gcc/rtl.h
index 63f65730d10..b658ff0d6ae 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1690,7 +1690,7 @@ extern int reg_referenced_p (rtx, rtx);
extern int reg_used_between_p (rtx, rtx, rtx);
extern int reg_set_between_p (rtx, rtx, rtx);
extern int commutative_operand_precedence (rtx);
-extern int swap_commutative_operands_p (rtx, rtx);
+extern bool swap_commutative_operands_p (rtx, rtx);
extern int modified_between_p (rtx, rtx, rtx);
extern int no_labels_between_p (rtx, rtx);
extern int modified_in_p (rtx, rtx);
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c
index 9535104e707..d948a08d421 100644
--- a/gcc/rtlanal.c
+++ b/gcc/rtlanal.c
@@ -2877,9 +2877,9 @@ commutative_operand_precedence (rtx op)
/* Constants always come the second operand. Prefer "nice" constants. */
if (code == CONST_INT)
- return -7;
+ return -8;
if (code == CONST_DOUBLE)
- return -6;
+ return -7;
op = avoid_constant_pool_reference (op);
code = GET_CODE (op);
@@ -2887,22 +2887,24 @@ commutative_operand_precedence (rtx op)
{
case RTX_CONST_OBJ:
if (code == CONST_INT)
- return -5;
+ return -6;
if (code == CONST_DOUBLE)
- return -4;
- return -3;
+ return -5;
+ return -4;
case RTX_EXTRA:
/* SUBREGs of objects should come second. */
if (code == SUBREG && OBJECT_P (SUBREG_REG (op)))
- return -2;
-
+ return -3;
return 0;
case RTX_OBJ:
/* Complex expressions should be the first, so decrease priority
- of objects. */
- return -1;
+ of objects. Prefer pointer objects over non pointer objects. */
+ if ((REG_P (op) && REG_POINTER (op))
+ || (MEM_P (op) && MEM_POINTER (op)))
+ return -1;
+ return -2;
case RTX_COMM_ARITH:
/* Prefer operands that are themselves commutative to be first.
@@ -2929,7 +2931,7 @@ commutative_operand_precedence (rtx op)
/* Return 1 iff it is necessary to swap operands of commutative operation
in order to canonicalize expression. */
-int
+bool
swap_commutative_operands_p (rtx x, rtx y)
{
return (commutative_operand_precedence (x)
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index 9b27bbdbd70..40fedde9a0b 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -52,7 +52,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
static rtx neg_const_int (enum machine_mode, rtx);
static bool plus_minus_operand_p (rtx);
-static int simplify_plus_minus_op_data_cmp (const void *, const void *);
+static bool simplify_plus_minus_op_data_cmp (rtx, rtx);
static rtx simplify_plus_minus (enum rtx_code, enum machine_mode, rtx, rtx);
static rtx simplify_immed_subreg (enum machine_mode, rtx, enum machine_mode,
unsigned int);
@@ -1499,16 +1499,12 @@ simplify_associative_operation (enum rtx_code code, enum machine_mode mode,
}
/* Attempt to simplify "(a op b) op c" as "a op (b op c)". */
- tem = swap_commutative_operands_p (XEXP (op0, 1), op1)
- ? simplify_binary_operation (code, mode, op1, XEXP (op0, 1))
- : simplify_binary_operation (code, mode, XEXP (op0, 1), op1);
+ tem = simplify_binary_operation (code, mode, XEXP (op0, 1), op1);
if (tem != 0)
return simplify_gen_binary (code, mode, XEXP (op0, 0), tem);
/* Attempt to simplify "(a op b) op c" as "(a op c) op b". */
- tem = swap_commutative_operands_p (XEXP (op0, 0), op1)
- ? simplify_binary_operation (code, mode, op1, XEXP (op0, 0))
- : simplify_binary_operation (code, mode, XEXP (op0, 0), op1);
+ tem = simplify_binary_operation (code, mode, XEXP (op0, 0), op1);
if (tem != 0)
return simplify_gen_binary (code, mode, tem, XEXP (op0, 1));
}
@@ -3313,23 +3309,21 @@ struct simplify_plus_minus_op_data
short neg;
};
-static int
-simplify_plus_minus_op_data_cmp (const void *p1, const void *p2)
+static bool
+simplify_plus_minus_op_data_cmp (rtx x, rtx y)
{
- const struct simplify_plus_minus_op_data *d1 = p1;
- const struct simplify_plus_minus_op_data *d2 = p2;
int result;
- result = (commutative_operand_precedence (d2->op)
- - commutative_operand_precedence (d1->op));
+ result = (commutative_operand_precedence (y)
+ - commutative_operand_precedence (x));
if (result)
- return result;
+ return result > 0;
/* Group together equal REGs to do more simplification. */
- if (REG_P (d1->op) && REG_P (d2->op))
- return REGNO (d1->op) - REGNO (d2->op);
+ if (REG_P (x) && REG_P (y))
+ return REGNO (x) > REGNO (y);
else
- return 0;
+ return false;
}
static rtx
@@ -3473,14 +3467,14 @@ simplify_plus_minus (enum rtx_code code, enum machine_mode mode, rtx op0,
{
struct simplify_plus_minus_op_data save;
j = i - 1;
- if (simplify_plus_minus_op_data_cmp (&ops[j], &ops[i]) < 0)
+ if (!simplify_plus_minus_op_data_cmp (ops[j].op, ops[i].op))
continue;
canonicalized = 1;
save = ops[i];
do
ops[j + 1] = ops[j];
- while (j-- && simplify_plus_minus_op_data_cmp (&ops[j], &save) > 0);
+ while (j-- && simplify_plus_minus_op_data_cmp (ops[j].op, save.op));
ops[j + 1] = save;
}
diff --git a/gcc/tree-ssa-address.c b/gcc/tree-ssa-address.c
index 7904b1af333..b81135b636a 100644
--- a/gcc/tree-ssa-address.c
+++ b/gcc/tree-ssa-address.c
@@ -125,7 +125,7 @@ gen_addr_rtx (rtx symbol, rtx base, rtx index, rtx step, rtx offset,
if (base)
{
if (*addr)
- *addr = gen_rtx_PLUS (Pmode, *addr, base);
+ *addr = simplify_gen_binary (PLUS, Pmode, base, *addr);
else
*addr = base;
}