Commit e7824b3e by Richard Henderson Committed by Richard Henderson

fold-const.c (fold_single_bit_test): Convert the input to the operational intermediate type.

        * fold-const.c (fold_single_bit_test): Convert the input to the
        operational intermediate type.

From-SVN: r73077
parent c35d187f
2003-10-29 Richard Henderson <rth@redhat.com> 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. * builtins.c (std_build_builtin_va_list): New.
* expr.h (std_build_builtin_va_list): Declare. * expr.h (std_build_builtin_va_list): Declare.
* defaults.h (BUILD_VA_LIST_TYPE): New. * defaults.h (BUILD_VA_LIST_TYPE): New.
......
...@@ -5036,7 +5036,7 @@ fold_single_bit_test (enum tree_code code, tree arg0, tree arg1, ...@@ -5036,7 +5036,7 @@ fold_single_bit_test (enum tree_code code, tree arg0, tree arg1,
int bitnum = tree_log2 (TREE_OPERAND (arg0, 1)); int bitnum = tree_log2 (TREE_OPERAND (arg0, 1));
enum machine_mode operand_mode = TYPE_MODE (type); enum machine_mode operand_mode = TYPE_MODE (type);
int ops_unsigned; int ops_unsigned;
tree signed_type, unsigned_type; tree signed_type, unsigned_type, intermediate_type;
tree arg00; tree arg00;
/* If we have (A & C) != 0 where C is the sign bit of A, convert /* 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, ...@@ -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); signed_type = (*lang_hooks.types.type_for_mode) (operand_mode, 0);
unsigned_type = (*lang_hooks.types.type_for_mode) (operand_mode, 1); 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) if (bitnum != 0)
inner = build (RSHIFT_EXPR, ops_unsigned ? unsigned_type : signed_type, inner = build (RSHIFT_EXPR, intermediate_type,
inner, size_int (bitnum)); inner, size_int (bitnum));
if (code == EQ_EXPR) 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); inner, integer_one_node);
/* Put the AND last so it can combine with more things. */ /* 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); inner, integer_one_node);
/* Make sure to return the proper type. */ /* 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; return inner;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment