diff options
Diffstat (limited to 'gcc/cse.c')
-rw-r--r-- | gcc/cse.c | 40 |
1 files changed, 24 insertions, 16 deletions
diff --git a/gcc/cse.c b/gcc/cse.c index 5e6c9e40b17..a4847a857b3 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -929,7 +929,7 @@ get_cse_reg_info (unsigned int regno) cse_reg_info_free_list = p->next; } else - p = (struct cse_reg_info *) xmalloc (sizeof (struct cse_reg_info)); + p = xmalloc (sizeof (struct cse_reg_info)); /* Insert into hash table. */ p->hash_next = *hash_head; @@ -967,7 +967,7 @@ new_basic_block (void) /* Clear out hash table state for this pass. */ - memset ((char *) reg_hash, 0, sizeof reg_hash); + memset (reg_hash, 0, sizeof reg_hash); if (cse_reg_info_used_list) { @@ -1540,7 +1540,7 @@ insert (rtx x, struct table_elt *classp, unsigned int hash, enum machine_mode mo else { n_elements_made++; - elt = (struct table_elt *) xmalloc (sizeof (struct table_elt)); + elt = xmalloc (sizeof (struct table_elt)); } elt->exp = x; @@ -3783,10 +3783,11 @@ fold_rtx (rtx x, rtx insn) || code == LTGT || code == UNEQ || code == ORDERED || code == UNORDERED) { - if (must_swap || (const_arg0 - && (const_arg1 == 0 - || (GET_CODE (const_arg0) == CONST_INT - && GET_CODE (const_arg1) != CONST_INT)))) + if (must_swap + || swap_commutative_operands_p (const_arg0 ? const_arg0 + : XEXP (x, 0), + const_arg1 ? const_arg1 + : XEXP (x, 1))) { rtx tem = XEXP (x, 0); @@ -4692,7 +4693,7 @@ cse_insn (rtx insn, rtx libcall_insn) if (GET_CODE (x) == SET) { - sets = (struct set *) alloca (sizeof (struct set)); + sets = alloca (sizeof (struct set)); sets[0].rtl = x; /* Ignore SETs that are unconditional jumps. @@ -4727,7 +4728,7 @@ cse_insn (rtx insn, rtx libcall_insn) { int lim = XVECLEN (x, 0); - sets = (struct set *) alloca (lim * sizeof (struct set)); + sets = alloca (lim * sizeof (struct set)); /* Find all regs explicitly clobbered in this insn, and ensure they are not replaced with any other regs @@ -6939,8 +6940,7 @@ cse_main (rtx f, int nregs, int after_loop, FILE *file) max_insn_uid = get_max_uid (); - reg_eqv_table = (struct reg_eqv_elem *) - xmalloc (nregs * sizeof (struct reg_eqv_elem)); + reg_eqv_table = xmalloc (nregs * sizeof (struct reg_eqv_elem)); #ifdef LOAD_EXTEND_OP @@ -6956,7 +6956,7 @@ cse_main (rtx f, int nregs, int after_loop, FILE *file) /* Find the largest uid. */ max_uid = get_max_uid (); - uid_cuid = (int *) xcalloc (max_uid + 1, sizeof (int)); + uid_cuid = xcalloc (max_uid + 1, sizeof (int)); /* Compute the mapping from uids to cuids. CUIDs are numbers assigned to insns, like uids, @@ -7075,9 +7075,7 @@ cse_basic_block (rtx from, rtx to, struct branch_path *next_branch, /* This array is undefined before max_reg, so only allocate the space actually needed and adjust the start. */ - qty_table - = (struct qty_table_elem *) xmalloc ((max_qty - max_reg) - * sizeof (struct qty_table_elem)); + qty_table = xmalloc ((max_qty - max_reg) * sizeof (struct qty_table_elem)); qty_table -= max_reg; new_basic_block (); @@ -7386,6 +7384,16 @@ count_reg_usage (rtx x, int *counts, rtx dest, int incr) count_reg_usage (XEXP (x, 1), counts, NULL_RTX, incr); return; + case ASM_OPERANDS: + /* If the asm is volatile, then this insn cannot be deleted, + and so the inputs *must* be live. */ + if (MEM_VOLATILE_P (x)) + dest = NULL_RTX; + /* Iterate over just the inputs, not the constraints as well. */ + for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--) + count_reg_usage (ASM_OPERANDS_INPUT (x, i), counts, dest, incr); + return; + case INSN_LIST: abort (); @@ -7536,7 +7544,7 @@ delete_trivially_dead_insns (rtx insns, int nreg) timevar_push (TV_DELETE_TRIVIALLY_DEAD); /* First count the number of times each register is used. */ - counts = (int *) xcalloc (nreg, sizeof (int)); + counts = xcalloc (nreg, sizeof (int)); for (insn = next_real_insn (insns); insn; insn = next_real_insn (insn)) count_reg_usage (insn, counts, NULL_RTX, 1); |