diff options
author | Peter Bergner <bergner@vnet.ibm.com> | 2007-07-23 11:43:24 -0500 |
---|---|---|
committer | Peter Bergner <bergner@gcc.gnu.org> | 2007-07-23 11:43:24 -0500 |
commit | 7e0b4eaea174caaaae3a50074623b58d1cdfe410 (patch) | |
tree | ff49113424954fc128f22d29310fdf6c0c984bbc /gcc | |
parent | de2b3a07713724618330b6bde404a32d0af811c0 (diff) | |
download | gcc-7e0b4eaea174caaaae3a50074623b58d1cdfe410.tar.gz |
PR middle-end/PR28690
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.
Co-Authored-By: Jakub Jelinek <jakub@redhat.com>
From-SVN: r126852
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 19 | ||||
-rw-r--r-- | gcc/optabs.c | 8 | ||||
-rw-r--r-- | gcc/rtl.h | 2 | ||||
-rw-r--r-- | gcc/rtlanal.c | 22 | ||||
-rw-r--r-- | gcc/simplify-rtx.c | 32 | ||||
-rw-r--r-- | gcc/tree-ssa-address.c | 2 |
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; } |