Add is_a <scalar_int_mode> checks before load_extend_op/ LOAD_EXTEND_OP calls, if that becomes useful for later patches. (load_extend_op will return UNKNOWN for any other type of mode.)
gcc/ 2016-11-24 Richard Sandiford <richard.sandif...@arm.com> Alan Hayward <alan.hayw...@arm.com> David Sherwood <david.sherw...@arm.com> * cse.c (cse_insn): Add is_a <scalar_int_mode> checks. * reload.c (push_reload): Likewise. diff --git a/gcc/cse.c b/gcc/cse.c index cc29d4a..e3fda8e 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -4923,7 +4923,8 @@ cse_insn (rtx_insn *insn) rtx_code extend_op; if (flag_expensive_optimizations && src_related == 0 && MEM_P (src) && ! do_not_record - && (extend_op = load_extend_op (mode)) != UNKNOWN) + && is_a <scalar_int_mode> (mode, &int_mode) + && (extend_op = load_extend_op (int_mode)) != UNKNOWN) { struct rtx_def memory_extend_buf; rtx memory_extend_rtx = &memory_extend_buf; @@ -4935,7 +4936,7 @@ cse_insn (rtx_insn *insn) PUT_CODE (memory_extend_rtx, extend_op); XEXP (memory_extend_rtx, 0) = src; - FOR_EACH_WIDER_MODE (tmode, mode) + FOR_EACH_WIDER_MODE (tmode, int_mode) { struct table_elt *larger_elt; @@ -4952,7 +4953,7 @@ cse_insn (rtx_insn *insn) larger_elt; larger_elt = larger_elt->next_same_value) if (REG_P (larger_elt->exp)) { - src_related = gen_lowpart (mode, larger_elt->exp); + src_related = gen_lowpart (int_mode, larger_elt->exp); break; } diff --git a/gcc/reload.c b/gcc/reload.c index 4d75fda..a513cf4 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -1050,6 +1050,9 @@ push_reload (rtx in, rtx out, rtx *inloc, rtx *outloc, register class. But if it is inside a STRICT_LOW_PART, we have no choice, so we hope we do get the right register class there. */ +#ifdef LOAD_EXTEND_OP + scalar_int_mode inner_int_mode; +#endif if (in != 0 && GET_CODE (in) == SUBREG && (subreg_lowpart_p (in) || strict_low) #ifdef CANNOT_CHANGE_MODE_CLASS @@ -1065,12 +1068,12 @@ push_reload (rtx in, rtx out, rtx *inloc, rtx *outloc, && ((GET_MODE_PRECISION (inmode) > GET_MODE_PRECISION (GET_MODE (SUBREG_REG (in)))) || (GET_MODE_SIZE (inmode) <= UNITS_PER_WORD - && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (in))) - <= UNITS_PER_WORD) + && is_a <scalar_int_mode> (GET_MODE (SUBREG_REG (in)), + &inner_int_mode) + && GET_MODE_SIZE (inner_int_mode) <= UNITS_PER_WORD && (GET_MODE_PRECISION (inmode) - > GET_MODE_PRECISION (GET_MODE (SUBREG_REG (in)))) - && INTEGRAL_MODE_P (GET_MODE (SUBREG_REG (in))) - && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (in))) != UNKNOWN) + > GET_MODE_PRECISION (inner_int_mode)) + && LOAD_EXTEND_OP (inner_int_mode) != UNKNOWN) || (WORD_REGISTER_OPERATIONS && (GET_MODE_PRECISION (inmode) < GET_MODE_PRECISION (GET_MODE (SUBREG_REG (in)))) @@ -3108,6 +3111,9 @@ find_reloads (rtx_insn *insn, int replace, int ind_levels, int live_known, operand = SUBREG_REG (operand); /* Force reload if this is a constant or PLUS or if there may be a problem accessing OPERAND in the outer mode. */ +#ifdef LOAD_EXTEND_OP + scalar_int_mode int_mode; +#endif if (CONSTANT_P (operand) || GET_CODE (operand) == PLUS /* We must force a reload of paradoxical SUBREGs @@ -3145,13 +3151,13 @@ find_reloads (rtx_insn *insn, int replace, int ind_levels, int live_known, || BYTES_BIG_ENDIAN || ((GET_MODE_SIZE (operand_mode[i]) <= UNITS_PER_WORD) - && (GET_MODE_SIZE (GET_MODE (operand)) + && (is_a <scalar_int_mode> + (GET_MODE (operand), &int_mode)) + && (GET_MODE_SIZE (int_mode) <= UNITS_PER_WORD) && (GET_MODE_SIZE (operand_mode[i]) - > GET_MODE_SIZE (GET_MODE (operand))) - && INTEGRAL_MODE_P (GET_MODE (operand)) - && LOAD_EXTEND_OP (GET_MODE (operand)) - != UNKNOWN))) + > GET_MODE_SIZE (int_mode)) + && LOAD_EXTEND_OP (int_mode) != UNKNOWN))) ) force_reload = 1; }