fold-const.c (fold_single_bit_test): Convert the input to the operational intermediat...
authorRichard Henderson <rth@redhat.com>
Thu, 30 Oct 2003 02:26:29 +0000 (18:26 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Thu, 30 Oct 2003 02:26:29 +0000 (18:26 -0800)
        * fold-const.c (fold_single_bit_test): Convert the input to the
        operational intermediate type.

From-SVN: r73077

gcc/ChangeLog
gcc/fold-const.c

index 80dd00f8866b5b085c9c6c9228be4e7042093b60..b7f9c38b13f9b492aff869ee409fff8893ace005 100644 (file)
@@ -1,3 +1,8 @@
+2003-10-29  Richard Henderson  <rth@redhat.com>
+
+       * fold-const.c (fold_single_bit_test): Convert the input to the
+       operational intermediate type.
+
 2003-10-29  Richard Henderson  <rth@redhat.com>
 
        * builtins.c (std_build_builtin_va_list): New.
index f248cd6ba51a68aa17b5223028246e9e8ffbe6cf..85909a3f909aa09b00a8db0078a1fed3ad373eb0 100644 (file)
@@ -5036,7 +5036,7 @@ fold_single_bit_test (enum tree_code code, tree arg0, tree arg1,
       int bitnum = tree_log2 (TREE_OPERAND (arg0, 1));
       enum machine_mode operand_mode = TYPE_MODE (type);
       int ops_unsigned;
-      tree signed_type, unsigned_type;
+      tree signed_type, unsigned_type, intermediate_type;
       tree arg00;
   
       /* If we have (A & C) != 0 where C is the sign bit of A, convert
@@ -5082,22 +5082,23 @@ fold_single_bit_test (enum tree_code code, tree arg0, tree arg1,
 
       signed_type = (*lang_hooks.types.type_for_mode) (operand_mode, 0);
       unsigned_type = (*lang_hooks.types.type_for_mode) (operand_mode, 1);
+      intermediate_type = ops_unsigned ? unsigned_type : signed_type;
+      inner = convert (intermediate_type, inner);
 
       if (bitnum != 0)
-       inner = build (RSHIFT_EXPR, ops_unsigned ? unsigned_type : signed_type,
+       inner = build (RSHIFT_EXPR, intermediate_type,
                       inner, size_int (bitnum));
 
       if (code == EQ_EXPR)
-       inner = build (BIT_XOR_EXPR, ops_unsigned ? unsigned_type : signed_type,
+       inner = build (BIT_XOR_EXPR, intermediate_type,
                       inner, integer_one_node);
 
       /* Put the AND last so it can combine with more things.  */
-      inner = build (BIT_AND_EXPR, ops_unsigned ? unsigned_type : signed_type,
+      inner = build (BIT_AND_EXPR, intermediate_type,
                     inner, integer_one_node);
 
       /* Make sure to return the proper type.  */
-      if (TREE_TYPE (inner) != result_type)
-       inner = convert (result_type, inner);
+      inner = convert (result_type, inner);
 
       return inner;
     }