From 0840fd91a3ecc27805284548c687bc365581d031 Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Wed, 18 Aug 1993 17:48:33 -0400 Subject: [PATCH] (nonzero_bits): Handle case when BYTE_LOADS_EXTEND is not on and we are asked for something in a mode wider than it. From-SVN: r5183 --- gcc/combine.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/gcc/combine.c b/gcc/combine.c index a270b6bd573..af83df5cf83 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -6347,6 +6347,25 @@ nonzero_bits (x, mode) just return the mode mask. Those tests will then be false. */ return nonzero; +#ifndef BYTE_LOADS_EXTEND + /* If X is wider than MODE, but both are a single word for both the host + and target machines, we can compute this from which bits of the + object might be nonzero in its own mode, taking into account the fact + that on many CISC machines, accessing an object in a wider mode + causes the high-order bits to become undefined. So they are + not known to be zero. */ + + if (GET_MODE (x) != VOIDmode && GET_MODE (x) != mode + && GET_MODE_BITSIZE (GET_MODE (x)) <= BITS_PER_WORD + && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT + && GET_MODE_BITSIZE (mode) < GET_MODE_BITSIZE (GET_MODE (x))) + { + nonzero &= nonzero_bits (x, GET_MODE (x)); + nonzero |= GET_MODE_MASK (mode) & ~ GET_MODE_MASK (GET_MODE (x)); + return nonzero; + } +#endif + code = GET_CODE (x); switch (code) { -- 2.30.2