This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH, combine] Fix host-specific behavior in simplify_compare_const()


2013/3/5 Eric Botcazou <ebotcazou@adacore.com>:
>> In other words, any 32-bit target with 'need_64bit_hwint=yes' in config.gcc
>> is not able to have benefit from this optimization because it never
>> passes the condition test.
>>
>>
>> My solution is to use GET_MODE_MASK(mode) to filter out all bits not
>> in target mode. The following is my patch:
>
> The patch is OK for 4.9 once stage #1 is open if it passes bootstrap/regtest.

Thanks for the approval. I will wait for 4.9 stage1 opening.
The following is the new patch according to your suggestions:


gcc/ChangeLog:

	* combine.c (simplify_compare_const): Use GET_MODE_MASK to filter out
	unnecessary bits in the constant power of two case.


diff --git a/gcc/combine.c b/gcc/combine.c
index 67bd776..ce2b583 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -10917,8 +10917,9 @@ simplify_compare_const (enum rtx_code code,
rtx op0, rtx *pop1)
       && (code == EQ || code == NE || code == GE || code == GEU
           || code == LT || code == LTU)
       && mode_width <= HOST_BITS_PER_WIDE_INT
-      && exact_log2 (const_op) >= 0
-      && nonzero_bits (op0, mode) == (unsigned HOST_WIDE_INT) const_op)
+      && exact_log2 (const_op & GET_MODE_MASK (mode)) >= 0
+      && (nonzero_bits (op0, mode)
+          == (unsigned HOST_WIDE_INT) (const_op & GET_MODE_MASK (mode))))
     {
       code = (code == EQ || code == GE || code == GEU ? NE : EQ);
       const_op = 0;



Best regards,
jasonwucj


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]