From 70e1b8fc746e1dfa471f3a39ef27166a5063c6ae Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sat, 22 Mar 2003 08:01:02 +0000 Subject: [PATCH] * combine.c (simplify_comparison ): Use gen_int_mode. Tidy. From-SVN: r64703 --- gcc/ChangeLog | 8 ++++-- gcc/combine.c | 74 ++++++++++++++++++++++++--------------------------- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7e8c2a6bbf3..34c7d46999d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2003-03-22 Alan Modra + + * combine.c (simplify_comparison ): Use gen_int_mode. Tidy. + 2003-03-21 Zack Weinberg * c-common.c: Include intl.h. @@ -414,8 +418,8 @@ Tue Mar 18 13:15:08 CET 2003 Jan Hubicka (PROFILE_KERNEL): Remove hacks. * config/rs6000/rs6000.c (TARGET_PROFILE_KERNEL): Define default. (rs6000_stack_info): No need to save lr if just for profiling when - TARGET_KERNEL_PROFILE. - (output_profile_hook): Output nothing when TARGET_KERNEL_PROFILE. + TARGET_PROFILE_KERNEL. + (output_profile_hook): Output nothing when TARGET_PROFILE_KERNEL. (output_function_profiler): Localize label generation. Emit code for kernel profiling. diff --git a/gcc/combine.c b/gcc/combine.c index 0ea0382c9a8..cd7261bf1eb 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -11138,49 +11138,45 @@ simplify_comparison (code, pop0, pop1) continue; } - /* If this is (and:M1 (subreg:M2 X 0) (const_int C1)) where C1 fits - in both M1 and M2 and the SUBREG is either paradoxical or - represents the low part, permute the SUBREG and the AND and - try again. */ - if (GET_CODE (XEXP (op0, 0)) == SUBREG + /* If this is (and:M1 (subreg:M2 X 0) (const_int C1)) where C1 + fits in both M1 and M2 and the SUBREG is either paradoxical + or represents the low part, permute the SUBREG and the AND + and try again. */ + if (GET_CODE (XEXP (op0, 0)) == SUBREG) + { + unsigned HOST_WIDE_INT c1; + tmode = GET_MODE (SUBREG_REG (XEXP (op0, 0))); /* Require an integral mode, to avoid creating something like (AND:SF ...). */ - && SCALAR_INT_MODE_P (GET_MODE (SUBREG_REG (XEXP (op0, 0)))) - /* It is unsafe to commute the AND into the SUBREG if the SUBREG - is paradoxical and WORD_REGISTER_OPERATIONS is not defined. - As originally written the upper bits have a defined value - due to the AND operation. However, if we commute the AND - inside the SUBREG then they no longer have defined values - and the meaning of the code has been changed. */ - && (0 + if (SCALAR_INT_MODE_P (tmode) + /* It is unsafe to commute the AND into the SUBREG if the + SUBREG is paradoxical and WORD_REGISTER_OPERATIONS is + not defined. As originally written the upper bits + have a defined value due to the AND operation. + However, if we commute the AND inside the SUBREG then + they no longer have defined values and the meaning of + the code has been changed. */ + && (0 #ifdef WORD_REGISTER_OPERATIONS - || ((mode_width - > (GET_MODE_BITSIZE - (GET_MODE (SUBREG_REG (XEXP (op0, 0)))))) - && mode_width <= BITS_PER_WORD) + || (mode_width > GET_MODE_BITSIZE (tmode) + && mode_width <= BITS_PER_WORD) #endif - || ((mode_width - <= (GET_MODE_BITSIZE - (GET_MODE (SUBREG_REG (XEXP (op0, 0)))))) - && subreg_lowpart_p (XEXP (op0, 0)))) - && GET_CODE (XEXP (op0, 1)) == CONST_INT - && mode_width <= HOST_BITS_PER_WIDE_INT - && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (XEXP (op0, 0)))) - <= HOST_BITS_PER_WIDE_INT) - && (INTVAL (XEXP (op0, 1)) & ~mask) == 0 - && 0 == (~GET_MODE_MASK (GET_MODE (SUBREG_REG (XEXP (op0, 0)))) - & INTVAL (XEXP (op0, 1))) - && (unsigned HOST_WIDE_INT) INTVAL (XEXP (op0, 1)) != mask - && ((unsigned HOST_WIDE_INT) INTVAL (XEXP (op0, 1)) - != GET_MODE_MASK (GET_MODE (SUBREG_REG (XEXP (op0, 0)))))) - - { - op0 - = gen_lowpart_for_combine - (mode, - gen_binary (AND, GET_MODE (SUBREG_REG (XEXP (op0, 0))), - SUBREG_REG (XEXP (op0, 0)), XEXP (op0, 1))); - continue; + || (mode_width <= GET_MODE_BITSIZE (tmode) + && subreg_lowpart_p (XEXP (op0, 0)))) + && GET_CODE (XEXP (op0, 1)) == CONST_INT + && mode_width <= HOST_BITS_PER_WIDE_INT + && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT + && ((c1 = INTVAL (XEXP (op0, 1))) & ~mask) == 0 + && (c1 & ~GET_MODE_MASK (tmode)) == 0 + && c1 != mask + && c1 != GET_MODE_MASK (tmode)) + { + op0 = gen_binary (AND, tmode, + SUBREG_REG (XEXP (op0, 0)), + gen_int_mode (c1, tmode)); + op0 = gen_lowpart_for_combine (mode, op0); + continue; + } } /* Convert (ne (and (lshiftrt (not X)) 1) 0) to -- 2.30.2