diff --git a/gcc/cse.cc b/gcc/cse.cc index 86403b95938..2bb63ac4105 100644 --- a/gcc/cse.cc +++ b/gcc/cse.cc @@ -511,8 +511,8 @@ static void new_basic_block (void); static void make_new_qty (unsigned int, machine_mode); static void make_regs_eqv (unsigned int, unsigned int); static void delete_reg_equiv (unsigned int); -static int mention_regs (rtx); -static int insert_regs (rtx, struct table_elt *, int); +static bool mention_regs (rtx); +static bool insert_regs (rtx, struct table_elt *, bool); static void remove_from_table (struct table_elt *, unsigned); static void remove_pseudo_from_table (rtx, unsigned); static struct table_elt *lookup (rtx, unsigned, machine_mode); @@ -542,8 +542,7 @@ static enum rtx_code find_comparison_args (enum rtx_code, rtx *, rtx *, static rtx fold_rtx (rtx, rtx_insn *); static rtx equiv_constant (rtx); static void record_jump_equiv (rtx_insn *, bool); -static void record_jump_cond (enum rtx_code, machine_mode, rtx, rtx, - int); +static void record_jump_cond (enum rtx_code, machine_mode, rtx, rtx); static void cse_insn (rtx_insn *); static void cse_prescan_path (struct cse_basic_block_data *); static void invalidate_from_clobbers (rtx_insn *); @@ -967,19 +966,19 @@ delete_reg_equiv (unsigned int reg) mention_regs is not called when a register itself is being stored in the table. - Return 1 if we have done something that may have changed the hash code - of X. */ + Return true if we have done something that may have changed + the hash code of X. */ -static int +static bool mention_regs (rtx x) { enum rtx_code code; int i, j; const char *fmt; - int changed = 0; + bool changed = false; if (x == 0) - return 0; + return false; code = GET_CODE (x); if (code == REG) @@ -997,7 +996,7 @@ mention_regs (rtx x) SUBREG_TICKED (i) = -1; } - return 0; + return false; } /* If this is a SUBREG, we don't want to discard other SUBREGs of the same @@ -1024,7 +1023,7 @@ mention_regs (rtx x) REG_IN_TABLE (i) = REG_TICK (i); SUBREG_TICKED (i) = REGNO (SUBREG_REG (x)); - return 0; + return false; } /* If X is a comparison or a COMPARE and either operand is a register @@ -1041,28 +1040,32 @@ mention_regs (rtx x) { if (REG_P (XEXP (x, 0)) && ! REGNO_QTY_VALID_P (REGNO (XEXP (x, 0)))) - if (insert_regs (XEXP (x, 0), NULL, 0)) + if (insert_regs (XEXP (x, 0), NULL, false)) { rehash_using_reg (XEXP (x, 0)); - changed = 1; + changed = true; } if (REG_P (XEXP (x, 1)) && ! REGNO_QTY_VALID_P (REGNO (XEXP (x, 1)))) - if (insert_regs (XEXP (x, 1), NULL, 0)) + if (insert_regs (XEXP (x, 1), NULL, false)) { rehash_using_reg (XEXP (x, 1)); - changed = 1; + changed = true; } } fmt = GET_RTX_FORMAT (code); for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) if (fmt[i] == 'e') - changed |= mention_regs (XEXP (x, i)); + { + if (mention_regs (XEXP (x, i))) + changed = true; + } else if (fmt[i] == 'E') for (j = 0; j < XVECLEN (x, i); j++) - changed |= mention_regs (XVECEXP (x, i, j)); + if (mention_regs (XVECEXP (x, i, j))) + changed = true; return changed; } @@ -1070,15 +1073,15 @@ mention_regs (rtx x) /* Update the register quantities for inserting X into the hash table with a value equivalent to CLASSP. (If the class does not contain a REG, it is irrelevant.) - If MODIFIED is nonzero, X is a destination; it is being modified. + If MODIFIED is true, X is a destination; it is being modified. Note that delete_reg_equiv should be called on a register before insert_regs is done on that register with MODIFIED != 0. - Nonzero value means that elements of reg_qty have changed + True value means that elements of reg_qty have changed so X's hash code may be different. */ -static int -insert_regs (rtx x, struct table_elt *classp, int modified) +static bool +insert_regs (rtx x, struct table_elt *classp, bool modified) { if (REG_P (x)) { @@ -1094,7 +1097,7 @@ insert_regs (rtx x, struct table_elt *classp, int modified) struct qty_table_elem *ent = &qty_table[REG_QTY (regno)]; if (ent->mode != GET_MODE (x)) - return 0; + return false; } if (modified || ! qty_valid) @@ -1124,7 +1127,7 @@ insert_regs (rtx x, struct table_elt *classp, int modified) continue; make_regs_eqv (regno, c_regno); - return 1; + return true; } /* Mention_regs for a SUBREG checks if REG_TICK is exactly one larger @@ -1141,10 +1144,10 @@ insert_regs (rtx x, struct table_elt *classp, int modified) && REG_TICK (regno) == REG_IN_TABLE (regno) + 1) REG_TICK (regno)++; make_new_qty (regno, GET_MODE (x)); - return 1; + return true; } - return 0; + return false; } /* If X is a SUBREG, we will likely be inserting the inner register in the @@ -1156,9 +1159,9 @@ insert_regs (rtx x, struct table_elt *classp, int modified) else if (GET_CODE (x) == SUBREG && REG_P (SUBREG_REG (x)) && ! REGNO_QTY_VALID_P (REGNO (SUBREG_REG (x)))) { - insert_regs (SUBREG_REG (x), NULL, 0); + insert_regs (SUBREG_REG (x), NULL, false); mention_regs (x); - return 1; + return true; } else return mention_regs (x); @@ -1753,7 +1756,7 @@ merge_equiv_classes (struct table_elt *class1, struct table_elt *class2) else remove_from_table (elt, hash); - if (insert_regs (exp, class1, 0) || need_rehash) + if (insert_regs (exp, class1, false) || need_rehash) { rehash_using_reg (exp); hash = HASH (exp, mode); @@ -2577,7 +2580,7 @@ safe_hash (rtx x, machine_mode mode) return hash_rtx (x, mode, &dummy_do_not_record, NULL, true); } -/* Return 1 iff X and Y would canonicalize into the same thing, +/* Return true iff X and Y would canonicalize into the same thing, without actually constructing the canonicalization of either one. If VALIDATE is nonzero, we assume X is an expression being processed from the rtl @@ -2586,7 +2589,7 @@ safe_hash (rtx x, machine_mode mode) If FOR_GCSE is true, we compare X and Y for equivalence for GCSE. */ -int +bool exp_equiv_p (const_rtx x, const_rtx y, int validate, bool for_gcse) { int i, j; @@ -2596,22 +2599,22 @@ exp_equiv_p (const_rtx x, const_rtx y, int validate, bool for_gcse) /* Note: it is incorrect to assume an expression is equivalent to itself if VALIDATE is nonzero. */ if (x == y && !validate) - return 1; + return true; if (x == 0 || y == 0) return x == y; code = GET_CODE (x); if (code != GET_CODE (y)) - return 0; + return false; /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent. */ if (GET_MODE (x) != GET_MODE (y)) - return 0; + return false; /* MEMs referring to different address space are not equivalent. */ if (code == MEM && MEM_ADDR_SPACE (x) != MEM_ADDR_SPACE (y)) - return 0; + return false; switch (code) { @@ -2644,16 +2647,16 @@ exp_equiv_p (const_rtx x, const_rtx y, int validate, bool for_gcse) are equivalent. Otherwise, ensure all regs are up-to-date. */ if (REG_QTY (REGNO (x)) != REG_QTY (regno)) - return 0; + return false; if (! validate) - return 1; + return true; for (i = regno; i < endregno; i++) if (REG_IN_TABLE (i) != REG_TICK (i)) - return 0; + return false; - return 1; + return true; } case MEM: @@ -2662,7 +2665,7 @@ exp_equiv_p (const_rtx x, const_rtx y, int validate, bool for_gcse) /* A volatile mem should not be considered equivalent to any other. */ if (MEM_VOLATILE_P (x) || MEM_VOLATILE_P (y)) - return 0; + return false; /* Can't merge two expressions in different alias sets, since we can decide that the expression is transparent in a block when @@ -2678,14 +2681,14 @@ exp_equiv_p (const_rtx x, const_rtx y, int validate, bool for_gcse) equivalent MEMs, we just use the invariant that MEMs that have the same attributes share the same mem_attrs data structure. */ if (!mem_attrs_eq_p (MEM_ATTRS (x), MEM_ATTRS (y))) - return 0; + return false; /* If we are handling exceptions, we cannot consider two expressions with different trapping status as equivalent, because simple_mem might accept one and reject the other. */ if (cfun->can_throw_non_call_exceptions && (MEM_NOTRAP_P (x) != MEM_NOTRAP_P (y))) - return 0; + return false; } break; @@ -2712,7 +2715,7 @@ exp_equiv_p (const_rtx x, const_rtx y, int validate, bool for_gcse) /* A volatile asm isn't equivalent to any other. */ if (MEM_VOLATILE_P (x) || MEM_VOLATILE_P (y)) - return 0; + return false; if (GET_MODE (x) != GET_MODE (y) || strcmp (ASM_OPERANDS_TEMPLATE (x), ASM_OPERANDS_TEMPLATE (y)) @@ -2720,7 +2723,7 @@ exp_equiv_p (const_rtx x, const_rtx y, int validate, bool for_gcse) ASM_OPERANDS_OUTPUT_CONSTRAINT (y)) || ASM_OPERANDS_OUTPUT_IDX (x) != ASM_OPERANDS_OUTPUT_IDX (y) || ASM_OPERANDS_INPUT_LENGTH (x) != ASM_OPERANDS_INPUT_LENGTH (y)) - return 0; + return false; if (ASM_OPERANDS_INPUT_LENGTH (x)) { @@ -2730,10 +2733,10 @@ exp_equiv_p (const_rtx x, const_rtx y, int validate, bool for_gcse) validate, for_gcse) || strcmp (ASM_OPERANDS_INPUT_CONSTRAINT (x, i), ASM_OPERANDS_INPUT_CONSTRAINT (y, i))) - return 0; + return false; } - return 1; + return true; default: break; @@ -2750,7 +2753,7 @@ exp_equiv_p (const_rtx x, const_rtx y, int validate, bool for_gcse) case 'e': if (! exp_equiv_p (XEXP (x, i), XEXP (y, i), validate, for_gcse)) - return 0; + return false; break; case 'E': @@ -2759,27 +2762,27 @@ exp_equiv_p (const_rtx x, const_rtx y, int validate, bool for_gcse) for (j = 0; j < XVECLEN (x, i); j++) if (! exp_equiv_p (XVECEXP (x, i, j), XVECEXP (y, i, j), validate, for_gcse)) - return 0; + return false; break; case 's': if (strcmp (XSTR (x, i), XSTR (y, i))) - return 0; + return false; break; case 'i': if (XINT (x, i) != XINT (y, i)) - return 0; + return false; break; case 'w': if (XWINT (x, i) != XWINT (y, i)) - return 0; + return false; break; case 'p': if (maybe_ne (SUBREG_BYTE (x), SUBREG_BYTE (y))) - return 0; + return false; break; case '0': @@ -2791,7 +2794,7 @@ exp_equiv_p (const_rtx x, const_rtx y, int validate, bool for_gcse) } } - return 1; + return true; } /* Subroutine of canon_reg. Pass *XLOC through canon_reg, and validate @@ -3104,7 +3107,7 @@ fold_rtx (rtx x, rtx_insn *insn) const char *fmt; int i; rtx new_rtx = 0; - int changed = 0; + bool changed = false; poly_int64 xval; /* Operands of X. */ @@ -3273,7 +3276,7 @@ fold_rtx (rtx x, rtx_insn *insn) if (insn == NULL_RTX && !changed) x = copy_rtx (x); - changed = 1; + changed = true; validate_unshare_change (insn, &XEXP (x, i), folded_arg, 1); } @@ -3853,7 +3856,6 @@ record_jump_equiv (rtx_insn *insn, bool taken) rtx op0, op1; rtx set; machine_mode mode, mode0, mode1; - int reversed_nonequality = 0; enum rtx_code code; /* Ensure this is the right kind of insn. */ @@ -3893,7 +3895,7 @@ record_jump_equiv (rtx_insn *insn, bool taken) if (mode1 != VOIDmode) mode = mode1; - record_jump_cond (code, mode, op0, op1, reversed_nonequality); + record_jump_cond (code, mode, op0, op1); } /* Yet another form of subreg creation. In this case, we want something in @@ -3909,13 +3911,11 @@ record_jump_cond_subreg (machine_mode mode, rtx op) } /* We know that comparison CODE applied to OP0 and OP1 in MODE is true. - REVERSED_NONEQUALITY is nonzero if CODE had to be swapped. Make any useful entries we can with that information. Called from above function and called recursively. */ static void -record_jump_cond (enum rtx_code code, machine_mode mode, rtx op0, - rtx op1, int reversed_nonequality) +record_jump_cond (enum rtx_code code, machine_mode mode, rtx op0, rtx op1) { unsigned op0_hash, op1_hash; int op0_in_memory, op1_in_memory; @@ -3932,8 +3932,7 @@ record_jump_cond (enum rtx_code code, machine_mode mode, rtx op0, machine_mode inner_mode = GET_MODE (SUBREG_REG (op0)); rtx tem = record_jump_cond_subreg (inner_mode, op1); if (tem) - record_jump_cond (code, mode, SUBREG_REG (op0), tem, - reversed_nonequality); + record_jump_cond (code, mode, SUBREG_REG (op0), tem); } if (code == EQ && paradoxical_subreg_p (op1)) @@ -3941,8 +3940,7 @@ record_jump_cond (enum rtx_code code, machine_mode mode, rtx op0, machine_mode inner_mode = GET_MODE (SUBREG_REG (op1)); rtx tem = record_jump_cond_subreg (inner_mode, op0); if (tem) - record_jump_cond (code, mode, SUBREG_REG (op1), tem, - reversed_nonequality); + record_jump_cond (code, mode, SUBREG_REG (op1), tem); } /* Similarly, if this is an NE comparison, and either is a SUBREG @@ -3959,8 +3957,7 @@ record_jump_cond (enum rtx_code code, machine_mode mode, rtx op0, machine_mode inner_mode = GET_MODE (SUBREG_REG (op0)); rtx tem = record_jump_cond_subreg (inner_mode, op1); if (tem) - record_jump_cond (code, mode, SUBREG_REG (op0), tem, - reversed_nonequality); + record_jump_cond (code, mode, SUBREG_REG (op0), tem); } if (code == NE @@ -3970,8 +3967,7 @@ record_jump_cond (enum rtx_code code, machine_mode mode, rtx op0, machine_mode inner_mode = GET_MODE (SUBREG_REG (op1)); rtx tem = record_jump_cond_subreg (inner_mode, op0); if (tem) - record_jump_cond (code, mode, SUBREG_REG (op1), tem, - reversed_nonequality); + record_jump_cond (code, mode, SUBREG_REG (op1), tem); } /* Hash both operands. */ @@ -4014,22 +4010,20 @@ record_jump_cond (enum rtx_code code, machine_mode mode, rtx op0, struct qty_table_elem *ent; int qty; - /* If we reversed a floating-point comparison, if OP0 is not a - register, or if OP1 is neither a register or constant, we can't - do anything. */ + /* If OP0 is not a register, or if OP1 is neither a register + or constant, we can't do anything. */ if (!REG_P (op1)) op1 = equiv_constant (op1); - if ((reversed_nonequality && FLOAT_MODE_P (mode)) - || !REG_P (op0) || op1 == 0) + if (!REG_P (op0) || op1 == 0) return; /* Put OP0 in the hash table if it isn't already. This gives it a new quantity number. */ if (op0_elt == 0) { - if (insert_regs (op0, NULL, 0)) + if (insert_regs (op0, NULL, false)) { rehash_using_reg (op0); op0_hash = HASH (op0, mode); @@ -4057,7 +4051,7 @@ record_jump_cond (enum rtx_code code, machine_mode mode, rtx op0, /* Put OP1 in the hash table so it gets a new quantity number. */ if (op1_elt == 0) { - if (insert_regs (op1, NULL, 0)) + if (insert_regs (op1, NULL, false)) { rehash_using_reg (op1); op1_hash = HASH (op1, mode); @@ -4084,7 +4078,7 @@ record_jump_cond (enum rtx_code code, machine_mode mode, rtx op0, if (op0_elt == 0) { - if (insert_regs (op0, NULL, 0)) + if (insert_regs (op0, NULL, false)) { rehash_using_reg (op0); op0_hash = HASH (op0, mode); @@ -4096,7 +4090,7 @@ record_jump_cond (enum rtx_code code, machine_mode mode, rtx op0, if (op1_elt == 0) { - if (insert_regs (op1, NULL, 0)) + if (insert_regs (op1, NULL, false)) { rehash_using_reg (op1); op1_hash = HASH (op1, mode); @@ -5677,7 +5671,7 @@ cse_insn (rtx_insn *insn) eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0))); classp = 0; } - if (insert_regs (src_eqv, classp, 0)) + if (insert_regs (src_eqv, classp, false)) { rehash_using_reg (src_eqv); src_eqv_hash = HASH (src_eqv, eqvmode); @@ -5736,7 +5730,7 @@ cse_insn (rtx_insn *insn) /* Note that these insert_regs calls cannot remove any of the src_elt's, because they would have failed to match if not still valid. */ - if (insert_regs (src, classp, 0)) + if (insert_regs (src, classp, false)) { rehash_using_reg (src); sets[i].src_hash = HASH (src, mode); @@ -5783,7 +5777,7 @@ cse_insn (rtx_insn *insn) elt = lookup (x, hash, mode); if (!elt) { - if (insert_regs (x, NULL, 0)) + if (insert_regs (x, NULL, false)) { rtx dest = SET_DEST (sets[i].rtl); @@ -5960,7 +5954,7 @@ cse_insn (rtx_insn *insn) if (REG_P (dest) || GET_CODE (dest) == SUBREG) /* Registers must also be inserted into chains for quantities. */ - if (insert_regs (dest, sets[i].src_elt, 1)) + if (insert_regs (dest, sets[i].src_elt, true)) { /* If `insert_regs' changes something, the hash code must be recalculated. */ @@ -6053,7 +6047,7 @@ cse_insn (rtx_insn *insn) already. */ if (src_elt == 0) { - if (insert_regs (new_src, classp, 0)) + if (insert_regs (new_src, classp, false)) { rehash_using_reg (new_src); src_hash = HASH (new_src, new_mode); @@ -6862,7 +6856,7 @@ count_reg_usage (rtx x, int *counts, rtx dest, int incr) /* Return true if X is a dead register. */ -static inline int +static inline bool is_dead_reg (const_rtx x, int *counts) { return (REG_P (x) diff --git a/gcc/rtl.h b/gcc/rtl.h index 6eaa52d531b..caef74a75b2 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -4141,7 +4141,7 @@ extern int rtx_to_tree_code (enum rtx_code); /* In cse.cc */ extern int delete_trivially_dead_insns (rtx_insn *, int); -extern int exp_equiv_p (const_rtx, const_rtx, int, bool); +extern bool exp_equiv_p (const_rtx, const_rtx, int, bool); extern unsigned hash_rtx (const_rtx x, machine_mode, int *, int *, bool); /* In dse.cc */