re PR rtl-optimization/3311 (GCC-SH: gcc loses result of AND operation due to force_to_mode bug)

* combine.c (simplify_and_const_int): Make sure to apply mask
	when force_to_mode returns a constant integer.  PR3311.

From-SVN: r51532
This commit is contained in:
Jeff Law 2002-03-28 16:33:52 -07:00 committed by Jeff Law
parent 279dccc5db
commit 8bc528064f
2 changed files with 18 additions and 4 deletions

View file

@ -1,3 +1,8 @@
Thu Mar 28 16:35:31 2002 Jeffrey A Law (law@redhat.com)
* combine.c (simplify_and_const_int): Make sure to apply mask
when force_to_mode returns a constant integer. PR3311.
2002-03-28 John David Anglin <dave@hiauly1.hia.nrc.ca>
* pa-linux.h (LOCAL_LABEL_PREFIX): Define.

View file

@ -7838,14 +7838,23 @@ simplify_and_const_int (x, mode, varop, constop)
int i;
/* Simplify VAROP knowing that we will be only looking at some of the
bits in it. */
bits in it.
Note by passing in CONSTOP, we guarantee that the bits not set in
CONSTOP are not significant and will never be examined. We must
ensure that is the case by explicitly masking out those bits
before returning. */
varop = force_to_mode (varop, mode, constop, NULL_RTX, 0);
/* If VAROP is a CLOBBER, we will fail so return it; if it is a
CONST_INT, we are done. */
if (GET_CODE (varop) == CLOBBER || GET_CODE (varop) == CONST_INT)
/* If VAROP is a CLOBBER, we will fail so return it. */
if (GET_CODE (varop) == CLOBBER)
return varop;
/* If VAROP is a CONST_INT, then we need to apply the mask in CONSTOP
to VAROP and return the new constant. */
if (GET_CODE (varop) == CONST_INT)
return GEN_INT (trunc_int_for_mode (INTVAL (varop) & constop, mode));
/* See what bits may be nonzero in VAROP. Unlike the general case of
a call to nonzero_bits, here we don't care about bits outside
MODE. */