combine.c (sign_extend_short_imm): New.

2015-04-27  Thomas Preud'homme  <thomas.preudhomme@arm.com>

    * combine.c (sign_extend_short_imm): New.
    (set_nonzero_bits_and_sign_copies): Use above new function for sign
    extension of src short immediate.
    (reg_nonzero_bits_for_combine): Likewise for tem.

From-SVN: r222457
This commit is contained in:
Thomas Preud'homme 2015-04-27 11:02:34 +00:00 committed by Thomas Preud'homme
parent 232f1f97ad
commit 97d87f7502
2 changed files with 32 additions and 28 deletions

View File

@ -1,3 +1,10 @@
2015-04-27 Thomas Preud'homme <thomas.preudhomme@arm.com>
* combine.c (sign_extend_short_imm): New.
(set_nonzero_bits_and_sign_copies): Use above new function for sign
extension of src short immediate.
(reg_nonzero_bits_for_combine): Likewise for tem.
2015-04-27 Eric Botcazou <ebotcazou@adacore.com>
* stor-layout.c (self_referential_component_ref_p): New predicate.

View File

@ -1646,6 +1646,28 @@ setup_incoming_promotions (rtx_insn *first)
}
}
#ifdef SHORT_IMMEDIATES_SIGN_EXTEND
/* If MODE has a precision lower than PREC and SRC is a non-negative constant
that would appear negative in MODE, sign-extend SRC for use in nonzero_bits
because some machines (maybe most) will actually do the sign-extension and
this is the conservative approach.
??? For 2.5, try to tighten up the MD files in this regard instead of this
kludge. */
static rtx
sign_extend_short_imm (rtx src, machine_mode mode, unsigned int prec)
{
if (GET_MODE_PRECISION (mode) < prec
&& CONST_INT_P (src)
&& INTVAL (src) > 0
&& val_signbit_known_set_p (mode, INTVAL (src)))
src = GEN_INT (INTVAL (src) | ~GET_MODE_MASK (mode));
return src;
}
#endif
/* Called via note_stores. If X is a pseudo that is narrower than
HOST_BITS_PER_WIDE_INT and is being set, record what bits are known zero.
@ -1725,20 +1747,7 @@ set_nonzero_bits_and_sign_copies (rtx x, const_rtx set, void *data)
rtx src = SET_SRC (set);
#ifdef SHORT_IMMEDIATES_SIGN_EXTEND
/* If X is narrower than a word and SRC is a non-negative
constant that would appear negative in the mode of X,
sign-extend it for use in reg_stat[].nonzero_bits because some
machines (maybe most) will actually do the sign-extension
and this is the conservative approach.
??? For 2.5, try to tighten up the MD files in this regard
instead of this kludge. */
if (GET_MODE_PRECISION (GET_MODE (x)) < BITS_PER_WORD
&& CONST_INT_P (src)
&& INTVAL (src) > 0
&& val_signbit_known_set_p (GET_MODE (x), INTVAL (src)))
src = GEN_INT (INTVAL (src) | ~GET_MODE_MASK (GET_MODE (x)));
src = sign_extend_short_imm (src, GET_MODE (x), BITS_PER_WORD);
#endif
/* Don't call nonzero_bits if it cannot change anything. */
@ -9788,20 +9797,8 @@ reg_nonzero_bits_for_combine (const_rtx x, machine_mode mode,
if (tem)
{
#ifdef SHORT_IMMEDIATES_SIGN_EXTEND
/* If X is narrower than MODE and TEM is a non-negative
constant that would appear negative in the mode of X,
sign-extend it for use in reg_nonzero_bits because some
machines (maybe most) will actually do the sign-extension
and this is the conservative approach.
??? For 2.5, try to tighten up the MD files in this regard
instead of this kludge. */
if (GET_MODE_PRECISION (GET_MODE (x)) < GET_MODE_PRECISION (mode)
&& CONST_INT_P (tem)
&& INTVAL (tem) > 0
&& val_signbit_known_set_p (GET_MODE (x), INTVAL (tem)))
tem = GEN_INT (INTVAL (tem) | ~GET_MODE_MASK (GET_MODE (x)));
tem = sign_extend_short_imm (tem, GET_MODE (x),
GET_MODE_PRECISION (mode));
#endif
return tem;
}