Commit Graph

937 Commits

Author SHA1 Message Date
Richard Guenther
9f5396713d re PR middle-end/30172 (Operations with partly constant complex values not folded)
2006-12-14  Richard Guenther  <rguenther@suse.de>

	PR middle-end/30172
	* fold-const.c (fold_binary): Fold __complex__ ( x, 0 )
	+ __complex__ ( 0, y ) to __complex__ ( x, y ).
	Fold __complex__ (x, y) * +-I to __complex__ (-+y, +-x).

	* gcc.dg/pr30172-1.c: New testcase.

From-SVN: r119859
2006-12-14 13:12:11 +00:00
Richard Guenther
85aef79f75 re PR middle-end/30198 (__real / __imag cexpi (x) can be folded to cos (x) / sin (x))
2006-12-14  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/30198
	* fold-const.c (fold_unary): Fold REALPART_EXPR of cexpi to cos.
	Fold IMAGPART_EXPR of cexpi to sin.

	* gcc.dg/builtins-60.c: New testcase.

From-SVN: r119858
2006-12-14 13:09:24 +00:00
Andrew Pinski
0890b981c9 re PR middle-end/28436 (accessing an element via a "pointer" on a vector does not cause vec_extract to be used)
2006-12-12  Andrew Pinski  <andrew_pinski@playstation.sony.com>

        PR tree-opt/28436
        * tree.h (DECL_COMPLEX_GIMPLE_REG_P): Rename to ...
        (DECL_GIMPLE_REG_P): This.
        * fold-const.c (fold_indirect_ref_1): Fold *(foo *)&vectorfoo into
        using BIT_FIELD_REF.
        * omp-low.c (omp_copy_decl_2): Use the renamed DECL_GIMPLE_REG_P.
        * tree-gimple.c (is_gimple_reg): Use the renamed DECL_GIMPLE_REG_P
        and check for VECTOR_TYPE.
        * expr.c (get_inner_reference): Set the mode for BIT_FIELD_REF with
        vector types.
        * tree-flow-inline.h (var_can_have_subvars): Use the renamed
        DECL_GIMPLE_REG_P.
        * gimplify.c (internal_get_tmp_var): Use the renamed DECL_GIMPLE_REG_P
        and check for VECTOR_TYPE.
        (gimplify_bind_expr): Likewise.
        (gimplify_function_tree): Likewise.
        * expmed.c: Include target.h.
        (extract_bit_field): For vector mode, try find a better mode first.
        If that fails use gen_lowpart (for vectors only).
        * tree-dfa.c (make_rename_temp): Use the renamed DECL_GIMPLE_REG_P
        and check for VECTOR_TYPE.
        * tree-ssa-pre.c (create_expressions_by_pieces): Likewise.
        (insert_into_preds_of_block): Likewise.
        (insert_fake_stores): Create gimple register store_tmps for
        vector types.
        * tree-sra.c (sra_elt): New field, is_vector_lhs.
        (sra_walk_expr <case BIT_FIELD_REF>): For vector types that
        are the left hand side, set the element's is_vector_lhs to true.
        (instantiate_element): For vector types which were on the left         hand size, set DECL_GIMPLE_REG_P to false.
        * tree-nested.c (create_tmp_var_for): Use the renamed DECL_GIMPLE_REG_P.        * tree-inline.c (declare_return_variable):  Use the renamed
        DECL_GIMPLE_REG_P
        and check for VECTOR_TYPE.         (copy_decl_to_var):  Use the renamed DECL_GIMPLE_REG_P.
        (copy_result_decl_to_var): Likewise.
        * tree-vect-transform.c (vect_get_new_vect_var): For vector types,         create a gimple register variable.
        (vect_permute_store_chain): Set DECL_GIMPLE_REG_P to true for the
        vect_inter_* temp variables.
        * Makefile.in (expmed.o): Update dependencies.

2006-12-12  Andrew Pinski  <andrew_pinski@playstation.sony.com>

        PR tree-opt/28436
        * gcc.c-torture/compile/vector-1.c: New test.
        * gcc.c-torture/compile/vector-2.c: New test.
        * gcc.c-torture/compile/vector-3.c: New test.

From-SVN: r119801
2006-12-12 14:33:06 -08:00
Richard Guenther
8e3dc7a344 re PR middle-end/30147 (ICE in fold_convert with -O2)
2006-12-12  Richard Guenther  <rguenther@suse.de>

	PR middle-end/30147
	* fold-const.c (fold_read_from_constant_string): Only fold read
	from constant string if the result type is integer.

	* gfortran.fortran-torture/compile/pr30147.f90: New testcase.

From-SVN: r119776
2006-12-12 12:13:48 +00:00
Aldy Hernandez
07beea0df3 Merge gimple-tuples-branch into mainline.
From-SVN: r119546
2006-12-05 17:26:05 +00:00
Kazu Hirata
2f8e468bf3 builtins.c, [...]: Fix comment typos.
* builtins.c, cfgloop.h, cgraph.h, config/arm/arm.c,
	config/i386/i386.c, config/i386/i386.h, config/mips/mips.h,
	config/rs6000/cell.md, config/rs6000/rs6000.c, config/sh/sh.c,
	config/sh/sh4-300.md, config/spu/spu-builtins.def,
	config/spu/spu-c.c, config/spu/spu-modes.def,
	config/spu/spu.c, config/spu/spu.md,
	config/spu/spu_internals.h, config/spu/vmx2spu.h,
	fold-const.c, fwprop.c, predict.c, tree-data-ref.h,
	tree-flow.h, tree-ssa-loop-manip.c, tree-ssa-loop-niter.c,
	tree-ssa-pre.c, tree-vect-analyze.c, tree-vect-transform.c,
	tree-vectorizer.c, tree-vrp.c: Fix comment typos.  Follow
	spelling conventions.

From-SVN: r119442
2006-12-02 02:26:04 +00:00
Eric Botcazou
f0dbdfbb4d fold-const.c (fold_binary): Use the precision of the type instead of the size of its mode to compute the...
* fold-const.c (fold_binary) <LT_EXPR>: Use the precision of the
	type instead of the size of its mode to compute the highest and
	lowest possible values.  Still check the size of the mode before
	flipping the signedness of the comparison.

From-SVN: r119422
2006-12-01 22:46:45 +00:00
Zdenek Dvorak
0446c9f3a7 re PR tree-optimization/29921 (internal compiler error: in set_lattice_value, at tree-ssa-ccp.c:437)
PR tree-optimization/29921
	* fold-const.c (operand_equal_p): Without HONOR_SIGNED_ZEROS, consider
	signed and unsigned zero equal.

	* gcc.dg/pr29921.c: New test.

From-SVN: r119102
2006-11-22 23:11:15 +00:00
Kaveh R. Ghazi
6af46feb6b fold-const.c (fold_strip_sign_ops): Handle copysign.
* fold-const.c (fold_strip_sign_ops): Handle copysign.

testsuite:
	* gcc.dg/builtins-20.c: Add cases for copysign.

From-SVN: r118975
2006-11-18 20:29:22 +00:00
Andrew Pinski
f9f63ff215 re PR tree-optimization/29788 (ICE in var_ann, at tree-flow-inline.h:130)
2006-11-15  Andrew Pinski  <andrew_pinski@playstation.sony.com>

        PR tree-opt/29788
        * fold-const.c (fold_indirect_ref_1): Fold *&CONST_DECL down
        to what is the const decl is a place holder for.

2006-11-15  Andrew Pinski  <andrew_pinski@playstation.sony.com>

        PR tree-opt/29788
        * gfortran.fortran-torture/compile/inline_1.f90:
        New testcase.

From-SVN: r118861
2006-11-15 09:04:56 -08:00
Kaveh R. Ghazi
b7e85170cf fold-const.c (fold_strip_sign_ops): Handle COMPOUND_EXPR and COND_EXPR.
* fold-const.c (fold_strip_sign_ops): Handle COMPOUND_EXPR and
	COND_EXPR.

testsuite:
	* gcc.dg/builtins-20.c: Add more cases.

From-SVN: r118802
2006-11-14 05:08:46 +00:00
Roger Sayle
7c06f56575 fold-const.c (optimize_bit_field_compare): Recursively call fold when simplifying non-constant comparisons between bit-fields.
* fold-const.c (optimize_bit_field_compare): Recursively call
	fold when simplifying non-constant comparisons between bit-fields.

From-SVN: r118783
2006-11-13 23:02:41 +00:00
Roger Sayle
1b43b96773 fold-const.c (negate_expr_p): Correct/refine condition for transformations.
* fold-const.c (negate_expr_p) <PLUS_EXPR, MINUS_EXPR>: Correct/refine
	condition for transformations.  Use !HONOR_SIGN_DEPENDENT_ROUNDING
	&& !HONOR_SIGNED_ZEROS instead of flag_unsafe_math_optimizations.
	(fold_negate_expr) <PLUS_EXPR, MINUS_EXPR>: Likewise.

From-SVN: r118744
2006-11-13 02:55:22 +00:00
Kaveh R. Ghazi
5c5b21550c builtins.c (fold_builtin_cosh): New.
* builtins.c (fold_builtin_cosh): New.
	(fold_builtin_1): Use it.
	* fold-const.c (negate_mathfn_p): Add llround, lround, round,
	trunc to the list of "odd" functions.  Also add llrint, lrint,
	rint and nearbyint when flag_rounding_math is false.

testsuite:
	* gcc.dg/torture/builtin-symmetric-1.c: Add more cases.

From-SVN: r118733
2006-11-12 23:51:36 +00:00
Roger Sayle
015e23f400 re PR tree-optimization/13827 ((a & b) != (c & b) should be transformed to ((a^c) & b) !=0)
PR tree-optimization/13827
	* fold-const.c (fold_binary) <EQ_EXPR, NE_EXPR>: Fold (X&C) op (Y&C)
	as ((X^Y)&C) op 0.

	* gcc.dg/fold-eqand-1.c: New test case.

From-SVN: r118727
2006-11-12 18:41:31 +00:00
Roger Sayle
000d8d44b7 fold-const.c (int_binop_types_match_p): New function.
* fold-const.c (int_binop_types_match_p): New function.
	(size_binop): Relax constraint that both arguments must both have
	exactly the same sizetype type.  Instead use int_binop_types_match_p.
	(size_diffop): Likewise.

	(make_range): Use build_int_cst instead of fold_convert.
	(fold_cond_expr_with_comparison): Use build_int_cst to construct
	integer constants of the correct type.
	(fold_div_compare): Likewise.
	(fold_single_bit_test): Likewise.
	(fold_binary): Likewise.
	* stor-layout.c (layout_type) <VECTOR_TYPE>: Ensure that TYPE_SIZE
	has type bitsizetype and TYPE_SIZE_UNIT has type sizetype.

From-SVN: r118718
2006-11-12 02:57:10 +00:00
Richard Guenther
f9f770a8d5 tree.def (FIX_CEIL_EXPR, [...]): Remove unused tree codes.
2006-11-11  Richard Guenther  <rguenther@suse.de>

	* tree.def (FIX_CEIL_EXPR, FIX_FLOOR_EXPR, FIX_ROUND_EXPR):
	Remove unused tree codes.
	* tree-vrp.c (extract_range_from_unary_expr): Remove handling
	of FIX_CEIL_EXPR, FIX_FLOOR_EXPR and FIX_ROUND_EXPR.
	* tree-pretty-print.c (dump_generic_node, op_prio): Likewise.
	* tree.c (stabilize_reference): Likewise.
	* fold-const.c (fold_convert_const_int_from_real, operand_equal_p,
	fold_unary): Likewise.
	* tree-gimple.c (is_gimple_cast): Likewise.
	* dwarf2out.c (loc_descriptor_from_tree_1): Likewise.
	* expr.c (expand_expr_real_1): Likewise.
	* tree-eh.c (tree_could_trap_p): Likewise.
	* gimplify.c (gimplify_expr): Likewise.
	* tree-inline.c (estimate_num_insns_1): Likewise.
	* tree-cfg.c (verify_expr): Likewise.

	cp/
	* typeck.c (build_unary_op): Likewise.

	java/
	* check-init.c (check_init): Likewise.

	ada/
	* trans.c (maybe_stabilize_reference): Likewise.

	fortran/
	* trans-intrinsic.c (enum rounding_mode): New enum.
	(build_fix_expr, gfc_conv_intrinsic_aint, gfc_conv_intrinsic_mod,
	gfc_conv_intrinsic_function): Use it instead of FIX_CEIL_EXPR,
	FIX_FLOOR_EXPR, FIX_ROUND_EXPR and FIX_TRUNC_EXPR.

From-SVN: r118692
2006-11-11 12:05:16 +00:00
Roger Sayle
85914552c7 fold-const.c (operand_equal_p): Don't check for TREE_CONSTANT_OVERFLOW when comparing constants.
* fold-const.c (operand_equal_p) <INTEGER_CST, REAL_CST, VECTOR_CST>:
	Don't check for TREE_CONSTANT_OVERFLOW when comparing constants.

From-SVN: r118685
2006-11-11 05:00:10 +00:00
Kaveh R. Ghazi
b81e7144aa builtins.c (fold_builtin_cos): Use fold_strip_sign_ops().
* builtins.c (fold_builtin_cos): Use fold_strip_sign_ops().
	(fold_builtin_hypot): Likewise.
	* fold-const.c (fold_strip_sign_ops): Handle "odd" builtins.
	
testsuite:
	* gcc.dg/builtins-20.c: Add more cases for stripping sign ops.

From-SVN: r118683
2006-11-11 04:05:14 +00:00
Kaveh R. Ghazi
345768ef3f fold-const.c (negate_mathfn_p): Add BUILT_IN_ERF.
* fold-const.c (negate_mathfn_p): Add BUILT_IN_ERF.

testsuite:
	* gcc.dg/torture/builtin-symmetric-1.c: New test.

From-SVN: r118682
2006-11-11 04:01:42 +00:00
Serge Belyshev
0ad12cd3b5 re PR middle-end/29726 (invalid folding of ((X >> C1) & C2) != 0 or "M-x is undefined" in emacs)
2006-11-09  Serge Belyshev  <belyshev@depni.sinp.msu.ru>

	PR middle-end/29726
	* fold-const.c (fold_binary) <EQ_EXPR>: Fix typo in variable name.

	* gcc.dg/fold-eqandshift-1.c (test5): Uncomment function.
	(test6): Ditto.
	(dg-final): Add scan-tree-dump-times patterns for test5 and test6.
	* gcc.dg/fold-eqandshift-3.c: New test case.

From-SVN: r118625
2006-11-09 19:24:32 +00:00
Roger Sayle
5cdc4a2674 tree-ssa-propagate.c (set_rhs): Restructure validity tests as a test for inclusion rather than as a test for...
* tree-ssa-propagate.c (set_rhs): Restructure validity tests as a
	test for inclusion rather than as a test for exclusion.
	* tree-ssa-ccp.c (fold_stmt_r) <COND_EXPR>: Use set_rhs to modify
	the condition after calling fold_binary.
	* fold-const.c (fold_inf_compare): Remove in_gimple_form check.
	(fold_binary) <LT_EXPR, GT_EXPR, LE_EXPR, GE_EXPR>: Likewise.
	* builtins.c (fold_builtin_isascii): Likewise.
	(fold_builtin_isdigit): Likewise.

From-SVN: r118593
2006-11-08 17:39:35 +00:00
Jakub Jelinek
789e604dfa re PR middle-end/29695 (Folding breaks (a & 0x80) ? 0x80 : 0 for unsigned 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-05 13:13:46 +01:00
Eric Christopher
167fa32c09 extend.texi (__builtin_bswap32): Document.
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-01 05:14:40 +00:00
Roger Sayle
682d039597 re PR middle-end/23470 (a*a (for floats) is not considered always postive (-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-11-01 02:56:45 +00:00
Roger Sayle
c159ffe706 fold-const.c (fold_comparison): Fold ~X op ~Y as Y op X.
* 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-29 21:41:48 +00:00
Roger Sayle
f8ed9a1c65 re PR tree-optimization/15458 (Combine ~ and ^.)
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-29 17:51:07 +00:00
Richard Guenther
4e9100638e fold-const.c (maybe_canonicalize_comparison): Fix code to match comment.
2006-10-28  Richard Guenther  <rguenther@suse.de>

	* fold-const.c (maybe_canonicalize_comparison): Fix code
	to match comment.

From-SVN: r118110
2006-10-28 20:36:54 +00:00
Richard Guenther
e73dbcaefc re PR middle-end/26899 (Fold does not fold (i0 > i1 + 1) || (i1 < i0 - 1))
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-28 18:03:21 +00:00
Richard Guenther
b0cd88d216 [multiple changes]
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-23 07:19:34 +00:00
Richard Guenther
8a1eca0803 re PR middle-end/26898 (Fold does not fold signed + CST1 CMP signed + CST2)
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-21 13:21:06 +00:00
Eric Botcazou
6b7283ac66 fold-const.c (add_double): Rename to add_double_with_sign.
* 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-10-19 20:22:04 +00:00
Richard Guenther
459881189a re PR middle-end/28814 (in compare_values, at tree-vrp.c:415)
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-08-25 22:01:28 +00:00
Richard Guenther
bfabddb6c0 re PR middle-end/28268 (ICE with simple vector operations)
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-07 16:30:36 +00:00
Richard Guenther
30a843c33c re PR tree-optimization/28162 (ICE in set_value_range, at tree-vrp.c:157)
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-07-05 15:49:12 +00:00
Eric Botcazou
858214db14 re PR middle-end/28151 (ICE with complex math)
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-25 17:16:25 +00:00
Roger Sayle
1000b34d95 expr.c (expand_expr_real_1): For vector constants with integer modes...
* 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-20 15:02:05 +00:00
Richard Guenther
096dce1b1b re PR middle-end/28045 (Bitfield, &&, and optimization => bad code generation)
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-19 14:48:47 +00:00
Richard Guenther
1af8dcbf0b re PR middle-end/27116 (Incorrect integer division (wrong sign).)
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-16 14:56:34 +00:00
Michael Matz
47392a21de fold-const.c (fold_truthop): Only return new tree node if we canonicalized 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-16 08:34:39 +00:00
Richard Guenther
d817ed3b10 fold-const.c (fold_truth_not_expr): Rename from invert_truthvalue.
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-15 18:55:18 +00:00
Fariborz Jahanian
6b4e957600 Check for Objective-C++ in deciding certain COND_EXPR folding.
Check for Objective-C++ in deciding certain COND_EXPR
folding.
OKed by Geoff Keating.

From-SVN: r114619
2006-06-13 19:02:49 +00:00
Richard Guenther
960f80d1ee re PR middle-end/27116 (Incorrect integer division (wrong sign).)
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-08 08:49:19 +00:00
Mark Shinwell
63b4819753 tree.h: Declare folding_initializer.
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-04 16:28:55 +00:00
Richard Guenther
7ec434b841 re PR tree-optimization/27039 (Unable to determine # of iterations for a 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-04 12:59:40 +00:00
Roger Sayle
9734ebafb9 fold-const.c (fold_unary): Ensure folded expressions are type correct.
* 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-06-02 23:41:12 +00:00
Roger Sayle
99b25753bb re PR tree-optimization/23452 (Optimizing CONJG_EXPR (a) * a)
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-30 21:34:04 +00:00
Richard Guenther
9e030af961 re PR middle-end/27773 (ICE: in find_lattice_value, at tree-complex.c:133)
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-27 15:57:36 +00:00
Richard Guenther
2d60e929a1 re PR middle-end/27743 (Wrong code for ((unsigned) ((a) >> 2)) >> 15)
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-25 12:39:52 +00:00
Kazu Hirata
5104d6484a re PR middle-end/26622 (ICE in extract_insn, at recog.c:2084)
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-21 15:16:19 +00:00