aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
AgeCommit message (Collapse)AuthorFilesLines
2006-11-05re PR middle-end/29695 (Folding breaks (a & 0x80) ? 0x80 : 0 for unsigned ↵Jakub Jelinek1-7/+70
char or unsigned short a) PR middle-end/29695 * fold-const.c (fold_ternary): Fix A < 0 ? <sign bit of A> : 0 simplification. * gcc.c-torture/execute/pr29695-1.c: New test. * gcc.c-torture/execute/pr29695-2.c: New test. From-SVN: r118497
2006-11-01extend.texi (__builtin_bswap32): Document.Eric Christopher1-1/+2
2006-09-07 Eric Christopher <echristo@apple.com> Falk Hueffner <falk@debian.org> * doc/extend.texi (__builtin_bswap32): Document. (__builtin_bswap64): Ditto. * doc/libgcc.texi (bswapsi2): Document. (bswapdi2): Ditto. * doc/rtl.texi (bswap): Document. * optabs.c (expand_unop): Don't widen a bswap. (init_optabs): Init bswap. Set libfuncs explicitly for bswapsi2 and bswapdi2. * optabs.h (OTI_bswap): New. (bswap_optab): Ditto. * genopinit.c (optabs): Handle bswap_optab. * tree.h (tree_index): Add TI_UINT32_TYPE and TI_UINT64_TYPE. (uint32_type_node): New. (uint64_type_node): Ditto. * tree.c (build_common_tree_nodes_2): Initialize uint32_type_node and uint64_type_node. * builtins.c (expand_builtin_bswap): New. (expand_builtin): Call. (fold_builtin_bswap): New. (fold_builtin_1): Call. * fold-const.c (tree_expr_nonnegative_p): Return true for bswap. * builtin-types.def (BT_UINT32): New. (BT_UINT64): Ditto. (BT_FN_UINT32_UINT32): Ditto. (BT_FN_UINT64_UINT64): Ditto. * builtins.def (BUILT_IN_BSWAP32): New. (BUILT_IN_BSWAP64): Ditto. * rtl.def (BSWAP): New. * genattrtab.c (check_attr_value): New. * libgcc2.c (__bswapSI2): New. (__bswapDI2): Ditto. * libgcc2.h (__bswapSI2): Declare. (__bswapDI2): Ditto. * mklibgcc.in (lib2funcs): Add _bswapsi2 and _bswapdi2. * simplify-rtx.c (simplify_const_unary_operation): Return 0 for BSWAP. * libgcc-std.ver (__bwapsi2): Add. (__bswapdi2): Ditto. * reload1.c (eliminate_regs_1): Add bswap. (elimination_effects): Ditto. * config/i386/i386.h (x86_bswap): New. (TARGET_BSWAP): Use. * config/i386/i386.c (x86_bswap): Set. Co-Authored-By: Falk Hueffner <falk@debian.org> From-SVN: r118361
2006-11-01re PR middle-end/23470 (a*a (for floats) is not considered always postive ↵Roger Sayle1-13/+44
(-ffast-math only)) PR middle-end/23470 * tree.h (tree_expr_nonnegative_p): Return "bool" instead of "int". * fold-const.c (tree_expr_nonnegative_p): Likewise. Consider pow(x,y) and powi(x,y) to be nonnegative if either x is nonnegative or y is an even integer. * gcc.dg/pr23470-1.c: New test case. From-SVN: r118355
2006-10-29fold-const.c (fold_comparison): Fold ~X op ~Y as Y op X.Roger Sayle1-7/+22
* fold-const.c (fold_comparison): Fold ~X op ~Y as Y op X. Fold ~X op C as X op' ~C, where op' is the swapped comparison. (fold_binary): ~X eq/ne C is now handled in fold_comparison. Fold -X eq/ne -Y as X eq/ne Y. * gcc.dg/fold-compare-1.c: New test case. From-SVN: r118158
2006-10-29re PR tree-optimization/15458 (Combine ~ and ^.)Roger Sayle1-0/+7
PR tree-optimization/15458 * fold-const.c (fold_binary): Optimize ~X ^ C as X ^ ~C, where C is a constant. * gcc.dg/fold-xornot-1.c: New test case. From-SVN: r118152
2006-10-28fold-const.c (maybe_canonicalize_comparison): Fix code to match comment.Richard Guenther1-1/+1
2006-10-28 Richard Guenther <rguenther@suse.de> * fold-const.c (maybe_canonicalize_comparison): Fix code to match comment. From-SVN: r118110
2006-10-28re PR middle-end/26899 (Fold does not fold (i0 > i1 + 1) || (i1 < i0 - 1))Richard Guenther1-0/+124
2006-10-28 Richard Guenther <rguenther@suse.de> PR middle-end/26899 * fold-const.c (maybe_canonicalize_comparison_1): Helper for maybe_canonicalize_comparison. (maybe_canonicalize_comparison): New function for canonicalizing comparison trees. (fold_comparison): Call it to canonicalize comparisons with constants involved. * gcc.dg/tree-ssa/pr26899.c: New testcase. From-SVN: r118106
2006-10-23[multiple changes]Richard Guenther1-3/+11
2006-10-24 Richard Guenther <rguenther@suse.de> PR middle-end/27132 PR middle-end/23295 * builtins.c (fold_binary): Remove checks for flag_wrapv and flag_trapv where negate_expr_p covers these cases. * gcc.dg/pr27132.c: New testcase. * gcc.dg/pr23295.c: Likewise. * gcc.dg/tree-ssa/pr23294.c: Adjust patterns. * g++.dg/tree-ssa/pr19807.C: Likewise. 2006-10-23 Richard Guenther <rguenther@suse.de> PR middle-end/29548 * fold-const.c (fold_plusminus_mult_expr): Check exact power of two on the absolute value. (fold_binary): Fold x * -C to -x * C if x is easily negatable and negating -C does not overflow. From-SVN: r117969
2006-10-21re PR middle-end/26898 (Fold does not fold signed + CST1 CMP signed + CST2)Richard Guenther1-0/+42
2006-10-21 Richard Guenther <rguenther@suse.de> PR middle-end/26898 * fold-const.c (fold_comparison): Fold signed comparisons of the form X +- C1 CMP Y +- C2. * gcc.dg/torture/pr26898-1.c: New testcase. * gcc.dg/torture/pr26898-2.c: Likewise. From-SVN: r117931
2006-10-19fold-const.c (add_double): Rename to add_double_with_sign.Eric Botcazou1-22/+35
* fold-const.c (add_double): Rename to add_double_with_sign. Add 'unsigned_p' parameter and take it into account for the overflow. (mul_double): Rename to mul_double_with_sign. Add 'unsigned_p' parameter and take it into account for the overflow. (fold_div_compare): Call add_double_with_sign instead of add_double and mul_double_with_sign instead of mul_double, passing them the unsignedness of the type. * tree.h (add_double): Macroize. (add_double_with_sign): New prototype. (mul_double): Macroize. (mul_double_with_sign): New prototype. From-SVN: r117887
2006-08-25re PR middle-end/28814 (in compare_values, at tree-vrp.c:415)Richard Guenther1-1/+2
2006-08-26 Richard Guenther <rguenther@suse.de> PR middle-end/28814 * fold-const.c (fold_binary): Fold temporary to correct type before constructing new comparison. * gcc.dg/torture/pr28814.c: New testcase. From-SVN: r116439
2006-07-07re PR middle-end/28268 (ICE with simple vector operations)Richard Guenther1-2/+2
2006-07-07 Richard Guenther <rguenther@suse.de> PR middle-end/28268 * tree.h (build_one_cst): Declare. * tree.c (build_one_cst): New function. * tree-ssa-math-opts.c (get_constant_one): Remove. (insert_reciprocals): Use build_one_cst. * fold-const.c (fold_plusminus_mult): Likewise. * gcc.dg/torture/pr28268.c: New testcase. From-SVN: r115263
2006-07-05re PR tree-optimization/28162 (ICE in set_value_range, at tree-vrp.c:157)Richard Guenther1-4/+4
2006-07-05 Richard Guenther <rguenther@suse.de> PR tree-optimization/28162 * fold-const.c (fold_binary): For (-A) * (-B) -> A * B make sure to convert the operands to the correct type. * gcc.dg/pr28162.c: New testcase. From-SVN: r115202
2006-06-25re PR middle-end/28151 (ICE with complex math)Eric Botcazou1-48/+34
PR middle-end/28151 * fold-const.c (const_binop): Be prepared for self returning zero. Simplify code handling complex values. From-SVN: r114992
2006-06-20expr.c (expand_expr_real_1): For vector constants with integer modes...Roger Sayle1-7/+5
* expr.c (expand_expr_real_1) <VECTOR_CST>: For vector constants with integer modes, attempt to directly construct an integer constant. * fold-const.c (native_encode_vector): Determine the size of each element from the vector type instead of the first vector element. * tree.c (build_constructor_single): Mark a CONSTRUCTOR as constant, if all of its elements/components are constant. (build_constructor_from_list): Likewise. From-SVN: r114815
2006-06-19re PR middle-end/28045 (Bitfield, &&, and optimization => bad code generation)Richard Guenther1-0/+5
2006-06-19 Richard Guenther <rguenther@suse.de> PR middle-end/28045 * fold-const.c (operand_equal_p): Check if the argument types have the same precision before stripping NOPs. * gcc.dg/torture/pr28045.c: New testcase. From-SVN: r114772
2006-06-16re PR middle-end/27116 (Incorrect integer division (wrong sign).)Richard Guenther1-50/+54
2006-06-16 Richard Guenther <rguenther@suse.de> PR middle-end/27116 * fold-const.c (negate_expr_p): Do not introduce undefined overflow in negating INTEGER_CSTs. (fold_negate_expr): Rename from negate_expr. Revert last change for folding BIT_NOT_EXPR. Change semantics to return NULL_TREE for non-simplified negations. Do not strip type conversions and unify type handling. (negate_expr): New function, wrap around fold_negate_expr but ensure building a tree always. Strip type conversions here, fold to result type. (fold_unary): Use fold_negate_expr for folding NEGATE_EXPR. * gcc.dg/pr15785-1.c: Revert last change. * gcc.dg/torture/pr27116-2.c: New testcase. From-SVN: r114723
2006-06-16fold-const.c (fold_truthop): Only return new tree node if we canonicalized ↵Michael Matz1-1/+7
something. 2006-06-16 Michael Matz <matz@suse.de> Richard Guenther <rguenther@suse.de> * fold-const.c (fold_truthop): Only return new tree node if we canonicalized something. Co-Authored-By: Richard Guenther <rguenther@suse.de> From-SVN: r114713
2006-06-15fold-const.c (fold_truth_not_expr): Rename from invert_truthvalue.Richard Guenther1-30/+44
2006-06-15 Richard Guenther <rguenther@suse.de> * fold-const.c (fold_truth_not_expr): Rename from invert_truthvalue. Give it fold_* semantics to avoid generating garbage. (invert_truthvalue): New function. Wrapper around fold_truth_not_expr. (optimize_minmax_comparison): Avoid creating garbage. (fold_unary): Use fold_truth_not_expr for folding TRUTH_NOT_EXPR. (fold_ternary): Replace uses of invert_truthvalue with fold_truth_not_expr where applicable. * tree.h (fold_truth_not_expr): Prototype. From-SVN: r114683
2006-06-13Check for Objective-C++ in deciding certain COND_EXPR folding.Fariborz Jahanian1-1/+2
Check for Objective-C++ in deciding certain COND_EXPR folding. OKed by Geoff Keating. From-SVN: r114619
2006-06-08re PR middle-end/27116 (Incorrect integer division (wrong sign).)Richard Guenther1-2/+6
2006-06-08 Richard Guenther <rguenther@suse.de> PR middle-end/27116 * fold-const.c (negate_expr_p): We can negate BIT_NOT_EXPR only, if overflow is defined and not trapping. (negate_expr): Likewise. * gcc.dg/torture/pr27116.c: New testcase. * gcc.dg/pr15785-1.c: Remove test for invalid transformation. From-SVN: r114483
2006-06-04tree.h: Declare folding_initializer.Mark Shinwell1-2/+9
gcc: * tree.h: Declare folding_initializer. * builtins.c (fold_builtin_constant_p): Give definite answer if folding inside an initializer. * fold-const.c: Define folding_initializer. (START_FOLD_INIT): Save and then set folding_initializer. (END_FOLD_INIT): Restore folding_initializer. gcc/testsuite: * gcc.c-torture/compile/builtin_constant_p.c: New test. From-SVN: r114358
2006-06-04re PR tree-optimization/27039 (Unable to determine # of iterations for a ↵Richard Guenther1-28/+35
simple loop) 2006-06-04 Richard Guenther <rguenther@suse.de> PR tree-optimization/27039 * fold-const.c (fold_comparison): Handle pointer comparison again for all comparison codes. Compare offsets in signed size type. (fold_binary): Move code from here. * gcc.dg/tree-ssa/loop-17.c: New testcase. From-SVN: r114357
2006-06-02fold-const.c (fold_unary): Ensure folded expressions are type correct.Roger Sayle1-34/+55
* fold-const.c (fold_unary) <CONJ_EXPR>: Ensure folded expressions are type correct. Clean-up. <REALPART_EXPR>: Likewise. Optimize creal(~z) as creal(z). <IMAGPART_EXPR>: Likewise. Optimize cimag(~z) as -cimag(z). From-SVN: r114330
2006-05-30re PR tree-optimization/23452 (Optimizing CONJG_EXPR (a) * a)Roger Sayle1-0/+57
PR tree-optimization/23452 * fold-const.c (fold_mult_zconjz): New subroutine of fold_binary, to optimize z * conj(z) as realpart(z)^2 + imagpart(z)^2. (fold_binary) <MULT_EXPR>: Call fold_mult_zconjz for integral complex values and with -ffast-math for FP complex values. * gcc.dg/fold-mulconj-1.c: New test case. From-SVN: r114246
2006-05-27re PR middle-end/27773 (ICE: in find_lattice_value, at tree-complex.c:133)Richard Guenther1-8/+2
2006-05-27 Richard Guenther <rguenther@suse.de> PR middle-end/27773 * fold-const.c (fold_plusminus_mult_expr): Use fold_convert to produce a constant of value 1 of generic type. * gcc.dg/torture/pr27773.c: New testcase. From-SVN: r114158
2006-05-25re PR middle-end/27743 (Wrong code for ((unsigned) ((a) >> 2)) >> 15)Richard Guenther1-1/+1
2006-05-25 Richard Guenther <rguenther@suse.de> PR middle-end/27743 * fold-const.c (fold_binary): Do not look at the stripped op0 for (a OP c1) OP c2 to a OP (c1+c2) shift optimization. * gcc.dg/torture/pr27743.c: New testcase. From-SVN: r114112
2006-05-21re PR middle-end/26622 (ICE in extract_insn, at recog.c:2084)Kazu Hirata1-2/+4
gcc/ PR tree-optimization/26622. * fold-const.c (fold_ternary) <COND_EXPR>: Call fold_convert on arg1. gcc/testsuite/ PR tree-optimization/26622. * gcc.c-torture/compile/pr26622.c: New. From-SVN: r113956
2006-05-11re PR c++/27384 (ICE with invalid array size)Volker Reichelt1-3/+3
PR middle-end/27384 * fold-const.c (size_binop): Move sanity check for arguments to the beginning of the function. * g++.dg/other/fold1.C: New test. From-SVN: r113701
2006-05-11re PR middle-end/27488 (ICE in tree_expr_nonnegative_p)Volker Reichelt1-0/+3
PR middle-end/27488 * fold-const.c (tree_expr_nonnegative_p): Return early on invalid expression. * gcc.dg/fold-nonneg-1.c: New test. From-SVN: r113699
2006-05-11re PR middle-end/27529 (Does not fold (char *)(size_t)char_ptr or ↵Richard Guenther1-4/+11
(size_t)(char *)size_t_var) 2006-05-11 Richard Guenther <rguenther@suse.de> PR middle-end/27529 * fold-const.c (fold_unary): Handle intermediate conversion to a pointer type like intermediate conversion to an integer type in folding of (T1)(T2)var to var. Match the code to the comment in the final conversion for (T1)(T2)var to (T1)var regarding to type precision. Rather than disallow T1 being of pointer type, assert that both T1 and var are of pointer type or not. Make sure not to fall over the frontends lazyness wrt array to pointer decay though. * gcc.dg/tree-ssa/foldcast-1.c: New testcase. From-SVN: r113692
2006-05-10re PR middle-end/27302 (Fold does not fold (i < j) == (j > i) to 1)Richard Guenther1-0/+16
2006-05-10 Richard Guenther <rguenther@suse.de> PR tree-optimization/27302 * fold-const.c (operand_equal_p): For two comparisons, try comparison of one comparison code swapped if that yields the same code. * gcc.dg/torture/pr27302.c: New testcase. From-SVN: r113670
2006-05-09re PR middle-end/27498 (fold does not fold reads from constant static strings)Dirk Mueller1-1/+1
2006-05-09 Dirk Mueller <dmueller@suse.de> Richard Guenther <rguenther@suse.de> PR middle-end/27498 * fold-const.c (fold_read_from_constant_string): Relax check for matching types to matching modes. * gcc.dg/tree-ssa/pr27498.c: New testcase. Co-Authored-By: Richard Guenther <rguenther@suse.de> From-SVN: r113651
2006-04-23fold-const.c (range_predecessor): Use operand_equal_p as the predicate for ↵Eric Botcazou1-2/+4
equality. * fold-const.c (range_predecessor): Use operand_equal_p as the predicate for equality. (range_successor): Likewise. From-SVN: r113192
2006-04-19re PR rtl-optimization/26026 (power of 2 mod missing optimisation)Alan Modra1-21/+33
PR rtl-optimization/26026 * fold-const.c (fold_binary): Optimize div and mod where the divisor is a known power of two shifted left a variable amount. From-SVN: r113060
2006-04-17re PR target/26961 (ICE simplify_subreg:3813)Roger Sayle1-4/+12
PR target/26961 * fold-const.c (fold_ternary): When converting "A ? B : C" into either "A op B" or "A op C", we may need to convert A to the type of B and C. * gcc.dg/fold-cond-1.c: New test case. * gcc.dg/pr26961-1.c: Likewise. From-SVN: r113001
2006-04-15cfgcleanup.c, [...]: Fix comment typos.Kazu Hirata1-1/+1
* cfgcleanup.c, config/dfp-bit.c, expr.c, fold-const.c, jump.c, mips-tfile.c, omp-low.c, sched-int.h, tree-ssa-loop-prefetch.c, tree-vrp.c: Fix comment typos. From-SVN: r112971
2006-04-13fold-const.c (native_encode_vector, [...]): Correct obvious mistakes in the ↵Roger Sayle1-3/+3
previous check-in. * fold-const.c (native_encode_vector, native_interpret_real): Correct obvious mistakes in the previous check-in. From-SVN: r112930
2006-04-13fold-const.c (native_encode_expr): New function to encode the target ↵Roger Sayle1-2/+397
representation of an INTEGER_CST... * fold-const.c (native_encode_expr): New function to encode the target representation of an INTEGER_CST, REAL_CST, COMPLEX_CST or VECTOR_CST into a specified buffer. (native_encode_int): New function. (native_encode_real): New function. (native_encode_complex): New function. (native_encode_vector): New function. (native_interpret_expr): Inverse of native_encode_expr to convert a target representation into an INTEGER_CST, REAL_CST etc... (native_interpret_int): New function. (native_interpret_real): New function. (native_interpret_complex): New function. (native_interpret_vector): New function. (fold_view_convert_expr): New function to constant fold/evaluate a VIEW_CONVERT_EXPR of a suitable constant expression. (fold_unary) <VIEW_CONVERT_EXPR>: Call fold_view_convert_expr. Change call of build1 to fold_build1 when constructing a VIEW_CONVERT_EXPR. * gcc.target/i386/20050113-1.c: Tweak testcase to reflect that casts of integers to a vector types are now constant expressions in C. * gcc.dg/vect/vect-fold-1.c: New test case. From-SVN: r112927
2006-04-05re PR tree-optimization/26763 (wrong final value of induction variable ↵Richard Guenther1-27/+28
calculated) 2006-04-05 Richard Guenther <rguenther@suse.de> PR tree-optimization/26763 * fold-const.c (fold_comparison): Move folding of PTR + CST CMP PTR + CST ... (fold_binary): ... here. Fold only for EQ_EXPR and NE_EXPR. * gcc.dg/torture/pr26763-1.c: New testcase. * gcc.dg/torture/pr26763-2.c: Likewise. From-SVN: r112697
2006-03-28fold-const.c (fold_binary): Fold (X & Y) ^ Y as the equivalent ~X & Y, and ↵Roger Sayle1-0/+78
the symmetry related transformations. * fold-const.c (fold_binary) <BIT_XOR_EXPR>: Fold (X & Y) ^ Y as the equivalent ~X & Y, and the symmetry related transformations. (fold_binary) <BIT_AND_EXPR>: Similarly, fold (X ^ Y) & Y as ~X & Y, and symmetry related transforms. * gcc.dg/fold-andxor-1.c: New test case. * gcc.dg/fold-xorand-1.c: Likewise. From-SVN: r112459
2006-03-28fold-const.c (fold_unary): Fold (T1)(~(T2)X) as ~(T1)X...Roger Sayle1-0/+16
* fold-const.c (fold_unary) <NOP_EXPR>: Fold (T1)(~(T2)X) as ~(T1)X, when T1 and T2 are integer types of the same precision and (T2)X isn't an extension. * gcc.dg/fold-convnotconv-1.c: New test case. From-SVN: r112455
2006-03-28re PR middle-end/22524 (fold (or the front-ends) produces UNARY ↵Roger Sayle1-1/+2
(BIT_NOT_EXPR) tree with mismatch types) PR middle-end/22524 * fold-const.c (fold_binary) <MINUS_EXPR>: Call fold_convert to cast BIT_NOT_EXPR operand to the correct type. From-SVN: r112438
2006-03-25re PR middle-end/26717 (complex/complex gives a REAL_CST)Uros Bizjak1-2/+18
PR middle-end/26717 * fold-const.c (fold_binary) [RDIV_EXPR]: Do not optimize A / A to 1.0 for non-real operands. Implement A / A optimization for complex operands. Co-Authored-By: Roger Sayle <roger@eyesopen.com> From-SVN: r112379
2006-03-14Move around a couple of hunks and add a missing one for commit 111866Eric Botcazou1-30/+28
From-SVN: r112046
2006-03-09fold-const.c (build_range_check): Make sure to use a valid type to apply the ↵Eric Botcazou1-59/+84
"(c>=low) && (c<=high) into... * fold-const.c (build_range_check): Make sure to use a valid type to apply the "(c>=low) && (c<=high) into (c-low>=0) && (c-low<=high-low)" transformation. (range_predecessor): New static function. (range_successor): Likewise. (merge_ranges): Use them to compute predecessors and successors of range bounds. From-SVN: r111866
2006-03-09re PR middle-end/26561 (ACATS failures c34004a, c46033a and cxg2024 at -O0)Roger Sayle1-5/+21
2006-03-09 Roger Sayle <roger@eyesopen.com> Eric Botcazou <ebotcazou@libertysurf.fr> PR middle-end/26561 * fold-const.c (fold_div_compare): When optimizing X/C1 op C2 as X op C3, consider whether C3 overflows towards +Inf or -Inf. * gcc.c-torture/execute/divcmp-5.c: New test case. Co-Authored-By: Eric Botcazou <ebotcazou@libertysurf.fr> From-SVN: r111862
2006-03-01re PR middle-end/26022 (ICE with references and virtual functions)Andrew Pinski1-20/+0
2006-01-23 Andrew Pinski <pinskia@physics.uc.edu> PR middle-end/26022 Revert: PR middle-end/24437 * tree-ssa-ccp.c (fold_stmt): Move folding of OBJ_TYPE_REF with a call expr to ... * fold-const.c (fold_ternary) <case CALL_EXPR>: Here. 2006-02-28 Andrew Pinski <pinskia@physics.uc.edu> PR middle-end/26022 * g++.dg/opt/return-slot1.C: New test. From-SVN: r111602
2006-02-27fold-const.c (fold_binary): Fold (~X & C) eq/ne 0 as (X & C) ne/eq 0, where ↵Roger Sayle1-0/+44
C is a single bit, i.e. * fold-const.c (fold_binary) <EQ_EXPR>: Fold (~X & C) eq/ne 0 as (X & C) ne/eq 0, where C is a single bit, i.e. a power of two. Fold both "((X & C) ^ C) eq/ne 0" and "((X ^ C) & C) eq/ne 0" as (X & C) ne/eq 0. * gcc.dg/fold-eqandnot-1.c: New test case. From-SVN: r111471
2006-02-26fold-const.c (fold_binary): Fold (X & 1) ^ 1 as (X & 1) == 0.Roger Sayle1-0/+29
* fold-const.c (fold_binary) <BIT_XOR_EXPR>: Fold (X & 1) ^ 1 as (X & 1) == 0. <BIT_AND_EXPR>: Fold (X ^ 1) & 1 and ~X & 1 as (X & 1) == 0. * gcc.dg/fold-even-1.c: New test case. From-SVN: r111454