Commit Graph

663 Commits

Author SHA1 Message Date
Richard Henderson
82c8274320 c-decl.c (grokdeclarator): Don't frob current_function_decl around variable_size.
* c-decl.c (grokdeclarator): Don't frob current_function_decl
        around variable_size.
        (set_decl_nonlocal): Remove.
        (store_parm_decls): Add stmts for pending sizes.
        * calls.c (calls_function, calls_function_1): Remove.
        (precompute_arguments): Don't call it.
        * cfgexpand.c (set_save_expr_context): Remove.
        (tree_expand_cfg): Don't call it.
        * dwarf2out.c (add_bound_info): Don't handle SAVE_EXPR.
        (dwarf2out_finish): Likewise.
        * expr.c (emit_block_move): Adjust addresses to BLKmode.
        (store_constructor): Don't pre-evaluate SAVE_EXPR.
        (safe_from_p): Don't queue SAVE_EXPRs.
        (expand_expr_real_1 <case SAVE_EXPR>): Rewrite to expect,
        or build plain VAR_DECLs.
        * fold-const.c (twoval_comparison_p): Don't look at SAVE_EXPR_RTL.
        (fold): Likewise.
        (fold_checksum_tree): Don't special-case SAVE_EXPR.
        * function.c (free_after_compilation): Don't clear x_save_expr_regs.
        (put_var_into_stack): Don't handle SAVE_EXPR.
        (gen_mem_addressof): Likewise.
        * function.h (struct function): Remove x_save_expr_regs.
        (save_expr_regs): Remove.
        * gengtype.c (adjust_field_tree_exp): Don't special-case SAVE_EXPR.
        * print-tree.c (print_node): Don't dump SAVE_EXPR_NOPLACEHOLDER.
        * stor-layout.c (variable_size): Don't set it.
        (force_type_save_exprs, force_type_save_exprs_1): Remove.
        * tree-inline.c (remap_save_expr): Remove fn argument.  Update
        all callers.  Don't set SAVE_EXPR_CONTEXT.
        * tree-inline.h (remap_save_expr): Update decl.
        * tree.c (save_expr): Update build size.
        (first_rtl_op): Don't handle SAVE_EXPR.
        (unsave_expr_1, contains_placeholder_p): Likewise.
        (decl_function_context): Likewise.
        * tree.def (SAVE_EXPR): Remove args 1 and 2.
        * tree.h (SAVE_EXPR_CONTEXT, SAVE_EXPR_RTL): Remove.
        (SAVE_EXPR_NOPLACEHOLDER, SAVE_EXPR_PERSISTENT_P): Remove.
cp/
        * tree.c (cp_unsave_r): Update remap_save_expr call.
java/
        * jcf-write.c (generate_bytecode_insns <case SAVE_EXPR>): Rewrite.

From-SVN: r84036
2004-07-02 17:15:50 -07:00
Richard Henderson
4dfa034295 tree.def (RTL_EXPR): Remove.
* tree.def (RTL_EXPR): Remove.
        * c-typeck.c (lvalue_p): Don't handle it.
        * expr.c (safe_from_p): Likewise.
        (expand_expr_real_1): Likewise.
        * fold-const.c (non_lvalue, operand_equal_p, fold): Likewise.
        (fold_checksum_tree, tree_expr_nonnegative_p): Likewise.
        * gengtype.c (adjust_field_tree_exp): Likewise.
        * stmt.c (warn_if_unused_value): Likewise.
        * tree-gimple.c (recalculate_side_effects): Likewise.
        * tree-pretty-print.c (dump_generic_node): Likewise.
        * tree.c (make_node_stat, first_rtl_op, unsave_expr_1): Likewise.
        (unsafe_for_reeval, stabilize_reference, build1_stat): Likewise.
        * tree.h (RTL_EXPR_SEQUENCE, RTL_EXPR_RTL, RTL_EXPR_ALT_RTL): Remove.

        * stmt.c (struct stmt_status): Remove x_last_expr_type,
        x_last_expr_value, x_last_expr_alt_rtl, x_expr_stmts_for_value.
        (last_expr_type, last_expr_value, last_expr_alt_rtl): Remove.
        (expand_expr_stmt): Merge with expand_expr_stmt_value.  Remove
        all the bits that tracked last_expr.
        (expand_end_bindings): Don't track last_expr.
        (expand_start_stmt_expr, expand_end_stmt_expr): Remove.
        (clear_last_expr): Remove.
        (expand_asm): Don't call it.
        (expand_asm_operands, expand_end_cond): Likewise.
        (expand_naked_return, expand_null_return_1): Likewise.
        * c-typeck.c (c_begin_compound_stmt): Likewise.
        * cfgexpand.c (expand_block): Use expand_expr_stmt.
        * expr.c (expand_expr_real_1): Likewise.
        * tree.h: Update prototypes.

        * function.h (struct sequence_stack): Remove sequence_rtl_expr.
        (struct emit_status): Remove sequence_rtl_expr.
        (struct function): Remove x_rtl_expr_chain.
        (seq_rtl_expr, rtl_expr_chain): Remove.
        * function.c (struct temp_slot): Remove rtl_expr.
        (assign_stack_temp_for_type): Don't set it.
        (free_temp_slots, pop_temp_slots): Don't check it.
        (free_after_compilation): Don't clear x_rtl_expr_chain.
        (fixup_var_refs): Don't search it.
        (preserve_rtl_expr_result, free_temps_for_rtl_expr): Remove.
        * emit-rtl.c (start_sequence): Don't use sequence_rtl_expr
        or seq_rtl_expr.
        (push_topmost_sequence): Likewise.
        (end_sequence, init_emit): Likewise.
        (start_sequence_for_rtl_expr): Remove.
        * expmed.c (make_tree): Build a VAR_DECL instead of an RTL_EXPR.
        * rtl.h (preserve_rtl_expr_result): Remove.

ada/
        * trans.c (gnat_stabilize_reference): Don't handle RTL_EXPR.
        * utils.c (max_size): Likewise.

cp/
        * class.c (fixed_type_or_null): Don't handle RTL_EXPR.
        * method.c (synthesize_method): Don't clear_last_expr.
        * name-lookup.c (maybe_push_cleanup_level): Likewise.

From-SVN: r84009
2004-07-01 18:15:43 -07:00
Richard Henderson
497be9785f tree.def (REALPART_EXPR, [...]): Change class to 'r'.
* tree.def (REALPART_EXPR, IMAGPART_EXPR): Change class to 'r'.
        * fold-const.c (operand_equal_p <case 'r'>): Add REALPART_EXPR,
        IMAGPART_EXPR.
        * tree-dump.c (dequeue_and_dump): Handle REALPART_EXPR and
        IMAGPART_EXPR explicitly.
        * tree-inline.c (estimate_num_insns_1): Don't handle REALPART_EXPR
        and IMAGPART_EXPR specially.
        * tree.c (build1_stat): Copy TREE_THIS_VOLATILE into class 'r'.

From-SVN: r83825
2004-06-28 15:26:24 -07:00
Paolo Bonzini
2851dd684b fold-const.c (fold_cond_expr_with_comparison): Add ARG1 parameter.
2004-06-28  Paolo Bonzini  <bonzini@gnu.org>

	* fold-const.c (fold_cond_expr_with_comparison): Add ARG1
	parameter.  Use it instead of ARG00 to produce the result.

From-SVN: r83768
2004-06-28 10:16:00 +00:00
Roger Sayle
64b663f8bd fold-const.c (fold): Optimize ~X|X and X|~X as -1.
* fold-const.c (fold) <BIT_IOR_EXPR>: Optimize ~X|X and X|~X as -1.
	<BIT_XOR_EXPR>: Optimize ~X|X and X|~X as -1.
	<BIT_AND_EXPR>: Optimize ~X&X and X&~X as 0.
	<TRUTH_AND_EXPR, TRUTH_ANDIF_EXPR>: Optimize !X&&X and X&&!X as false.
        <TRUTH_OR_EXPR, TRUTH_ORIF_EXPR>: Optimize !X||X and !X||X as true.
	<TRUTH_XOR_EXPR>: Optimize !X^X and X^X! as true.  Now that
	TRUTH_XOR_EXPR is a commutative tree code, don't test whether arg0
	is a constant.

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

From-SVN: r83733
2004-06-27 15:23:46 +00:00
Kazu Hirata
61ada8ae18 c-typeck.c, [...]: Fix comment typos.
* c-typeck.c, cfgexpand.c, ddg.c, ddg.h, df.c, fold-const.c,
	gcov.c, gimplify.c, modulo-sched.c, passes.c, tree-cfg.c,
	tree-mudflap.c, tree-nrv.c, tree-outof-ssa.c, tree-ssa-dom.c,
	tree-ssa-dse.c, tree-ssa-operands.c, tree-ssa-pre.c,
	tree-tailcall.c: Fix comment typos.  Follow spelling
	conventions.

From-SVN: r83703
2004-06-26 05:03:55 +00:00
Richard Kenner
0c3b8d135d fold-const.c (fold_addr_expr_with_type): Look through all valid LHS modifiers to find a base to mark addressable.
* fold-const.c (fold_addr_expr_with_type): Look through all
	valid LHS modifiers to find a base to mark addressable.

From-SVN: r83628
2004-06-24 21:28:34 -04:00
Andrew Pinski
b713a445f2 re PR middle-end/15988 (ICE in fold_convert with pointer-to-member-function)
2004-06-23  Andrew Pinski  <apinski@apple.com>

        PR middle-end/15988
        * fold-const.c (fold_convert): Types which are compatible
        can be converted with only a NOP_EXPR.

2004-06-23  Andrew Pinski  <apinski@apple.com>

        PR middle-end/15988
        * g++.dg/opt/ptrmem4.C: New test.

From-SVN: r83585
2004-06-23 23:51:56 -07:00
Eric Christopher
d182275449 fold-const.c (make_range): Cleanup type checking through function.
2004-06-23  Eric Christopher  <echristo@redhat.com>

	* fold-const.c (make_range): Cleanup type checking through function.
	Remove orig_type. Replace with checks to exp_type and arg0_type.
	Clarify comment when converting from unsigned to signed.

From-SVN: r83576
2004-06-24 02:00:25 +00:00
Richard Henderson
0f59171d71 tree.def (VTABLE_REF): Remove.
* tree.def (VTABLE_REF): Remove.
        (OBJ_TYPE_REF): New.
        (TRY_CATCH_EXPR, TRY_FINALLY_EXPR): Set type 's'.
        * expr.c (expand_expr_real_1): Replace VTABLE_REF with OBJ_TYPE_REF.
        * fold-const.c (non_lvalue): Likewise.
        * gimplify.c (gimplify_expr): Likewise.
        (gimplify_call_expr): Use is_gimple_call_addr.
        * langhooks-def.h (LANG_HOOKS_FOLD_OBJ_TYPE_REF): New.
        * langhooks.h (fold_obj_type_ref): New.
        * tree-gimple.c (is_gimple_call_addr): New.
        * tree-gimple.h (is_gimple_call_addr): Declare.
        * tree-inline.c (inlinable_function_p): Fix merge error.
        (estimate_num_insns_1): Replace VTABLE_REF with OBJ_TYPE_REF.
        * tree-pretty-print.c (dump_generic_node): Likewise.
        (print_call_name): Handle OBJ_TYPE_REF.
        * tree-ssa-ccp.c (fold_stmt): Fold OBJ_TYPE_REF.
        * tree-ssa-operands.c (get_expr_operands): Handle OBJ_TYPE_REF.
        * tree.h (OBJ_TYPE_REF_EXPR): New.
        (OBJ_TYPE_REF_OBJECT, OBJ_TYPE_REF_TOKEN): New.
        * doc/c-tree.texi (VTABLE_REF): Remove.
        * objc/objc-act.c (build_objc_method_call): Build an OBJ_TYPE_REF.
cp/
        * class.c (build_vfn_ref): Take a pointer not object.  Build
        an OBJ_TYPE_REF.
        (cp_fold_obj_type_ref): New.
        * call.c (build_over_call): Update build_vfn_ref call.
        * cp-lang.c (LANG_HOOKS_FOLD_OBJ_TYPE_REF): New.
        * cp-tree.h (cp_fold_obj_type_ref): Declare.
testsuite/
        * g++.dg/opt/devirt1.C: New.

From-SVN: r83531
2004-06-22 17:26:04 -07:00
Richard Kenner
44de5aeb00 alias.c (adjust_offset_for_component_ref): Use component_ref_field_offset.
* alias.c (adjust_offset_for_component_ref): Use
	component_ref_field_offset.
	* c-decl.c (build_array_declarator): Add news args for ARRAY_REF.
	* c-gimplify.c (gimplify_expr_stmt): Use alloc_stmt_list.
	(gimplify_decl_stmt): Call gimplify_type_sizes for type.
	For decl, call gimplify_one_sizepos and use statement list.
	(gimplify_compound_literal_expr): New arg PRE_P.
	Add statement to PRE_P list and return DECL.
	(c_gimplify_expr, case COMPOUND_LITERAL_EXPR): Add arg to
	gimplify_compound_literal_expr.
	* c-tree.h (getdecls): Deleted.
	* c-typeck.c (build_component_ref): Add operand for COMPONENT_REF.
	(build_array_ref): Add two operands for ARRAY_REF.
	(build_unary_op): Set TREE_INVARIANT and TREE_CONSTANT for
	COMPOUND_LITERAL_EXPR.
	* coverage.c (tree_coverage_counter_ref): Add new operands
	for ARRAY_REF.
	* emit-rtl.c (component_ref_for_mem_expr): Add new operand
	for COMPONENT_REF.
	(set_mem_attributes_minus_bitpos): Use array_ref_low_bound
	and array_ref_element_size.
	(widen_memory_access):Use component_ref_field_offset.
	* explow.c (update_nonlocal_goto_save_area): Add two operands
	for ARRAY_REF.
	* expr.c (array_ref_element_size, array_ref_low_bound): New functions.
	(component_ref_field_offset): Likewise.
	(get_inner_reference): Use them.
	(expand_expr_real_1, case ARRAY_REF): Use array_ref_low_bound.
	* fold-const.c (fold, case EQ_EXPR): Properly handle DECL_SIZE.
	(fold_read_from_constant_string): Use array_ref_low_bound.
	Verify that result is a character type.
	(build_fold_indirect_ref): Add two operands for ARRAY_REF.
	* function.c (expand_function_start): Likewise.
	* gimple-low.c (expand_var_p): Delete duplicated line.
	* gimplify.c: Add static decls for local functions.
	(cgraph.h): Now included.
	(create_tmp_var): Remove check for ARRAY_TYPE.
	(copy_if_shared_r): Look at bounds and sizes of types.
	(build_and_jump): Return alloc_stmt_list instead of build_empty_stmt.
	(gimplify_exit_expr, shortcut_cond_expr): Likewise.
	(gimplify_save_expr, gimple_push_cleanup): Likewise.
	(gimplify_init_constructor): Likewise.
	WANT_VALUE now bool.
	If empty list with no result wanted, return GS_UNHANDLED.
	Add additional operands for ARRAY_REF and COMPONENT_REF.
	(canonicalize_component_ref): Convert to &array[L].
	(gimplify_array_ref_to_plus): Use array_ref_element_size and
	array_ref_lower_bound.
	(build_addr_expr_with_type, build_addr_expr): New functions.
	(gimplify_compound_lval): WANT_LVALUE now bool.
	Major rework to allow handle_component_p and initialize and
	gimplify new operands for ARRAY_REF, ARRAY_RANGE_REF, and
	COMPONENT_REF.
	(gimplify_array_ref): Deleted.
	(gimplify_self_mod_expr): WANT_VALUE now bool.
	(gimplify_modify_expr): Gimplify to_p and from_p later.
	Factor out code into gimplify_modify_expr_rhs and call twice.
	Move variable-size code earlier and handle PLACEHOLDER_EXPR.
	(gimplify_modify_expr_rhs, gimplify_variable_sized_compare): New fns.
	(gimplify_addr_expr, case VIEW_CONVERT_EXPR): New case.
	(gimplify_expr, case ARRAY_REF): Delete special case.
	Instead handle like COMPONENT_REF; also do ARRAY_RANGE_REF,
	IMAGPART, and REALPART the same way.
	(gimplify_expr, case VIEW_CONVERT_EXPR): New case.
	(gimplify_expr): Call gimplify_variable_sized_compare if applicable.
	Call alloc_stmt_list instead of build_empty_stmt.
	Deal with _REF that's volatile.
	(gimplify_type_sizes, gimplify_one_sizepos): New functions.
	(unshare_body, unvisit_body): New functions.
	(gimplify_body): Call them.
	* stmt.c (expand_stack_alloc): Don't expand TYPE_MAX_VALUE.
	* stor-layout.c (get_pending_sizes): Don't change SAVE_EXPR_CONTEXT.
	* tree-alias-common.c (get_alias_var): Also skip ARRAY_RANGE_REF.
	* tree-cfg.c (tree_node_can_be_shared): Treat ARRAY_RANGE_REF
	like ARRAY_REF.
	(verify_expr, case ADDR_EXPR): Use handled_component_p.
	* tree-dfa.c (get_virtual_var): Likewise.
	* tree-dump.c (dequeue_and_dump, case COMPONENT_REF, ARRAY_REF):
	New cases to dump new operands; likewise for ARRAY_RANGE_REF.
	* tree-eh.c (tree_could_trap, case ARRAY_RANGE_REF): Like ARRAY_REF.
	* tree-gimple.c (is_gimple_addr_expr_arg): Add ARRAY_RANGE_REF
	and INDIRECT_REF.
	(get_base_address): Use handled_component_p.
	* tree-gimple.h (gimplify_type_sizes, gimplify_one_sizepos): New.
	* tree-line.c (walk_tree): Walk more things for types and decls.
	* tree-mudflap.c (mf_build_check_statement_for): Add new operands
	for ARRAY_REF and COMPONENT_REF.
	(mx_xform_derefs_1): Clean up usage of decl sizes.
	* tree-nested.c (build_addr): Use handled_component_p.
	(walk_stmts, case CATCH_EXPR): Add missing "break".
	(get_static_chain, get_frame_field): Add new operand for COMPONENT_REF.
	(finalize_nesting_tree_1): Likewise.
	(convert_nonlocal_reference, case ARRAY_RANGE_REF): Like ARRAY_REF
	and process additional operands.
	(convert_local_reference): Likewise.
	* tree-outof-ssa.c (discover_nonconstant_array_refs_r): Treat
	ARRAY_RANGE_REF similarly to ARRAY_REF.
	* tree-pretty-print.c (dump_generic_node, case QUAL_UNION_TYPE): Handle
	like RECORD_TYPE.
	(dump_generic_node, case COMPONENT_REF): Print offset operand.
	(dump_generic_node, case ARRAY_RANGE_REF): Treat like ARRAY_REF
	and print lower bound and element size for both.
	(op_prio, case ARRAY_RANGE_REF): Like ARRAY_REF.
	* tree-sra.c (csc_build_component_ref): Add new operand.
	(scalarize_call_expr): Use get_base_address.
	* tree-ssa-ccp.c (widen_bitfield): Clean up size handling.
	(maybe_fold_offset_to_array_ref): Rework to handle input having an
	ARRAY_REF, refine handling of lower bound, and add new operands
	for ARRAY_REF.
	(maybe_fold_to_component_ref): Add new operand for COMPONENT_REF.
	(maybe_fold_stmt_indirect): Only fold *&B to B if types match.
	(maybe_fold_stmt_addition): Only handle constant lower bound.
	* tree-ssa-operands.c (get_expr_operands): Minor rearrangements.
	Treat ARRAY_REF and ARRAY_RANGE_REF the same; look at extra operands.
	Look at new offset operand of COMPONENT_REF.
	* tree-ssa.c (set_is_used): Use handled_component_p.
	* tree.c (substitute_in_expr, case COMPONENT_REF): Add new operand.
	(stabilize_reference, case COMPONENT_REF): Likewise.
	(stabilize_reference, case ARRAY_RANGE_REF, ARRAY_REF): Similarly.
	(recompute_tree_invariant_for_addr_expr): Completely rework to
	be more precise.  Also set TREE_SIDE_EFFECTS.
	(build1_stat, case ARRAY_EXPR): Don't handle TREE_SIDE_EFFECTS here.
	(build2_stat, build3_stat, build4_stat): For references,
	propagate TREE_THIS_VOLATILE.
	(get_unwidened): Add new operand for COMPONENT_REF.
	(get_narrower): Likewise; use host_integerp for DECL_SIZE.
	* tree.def (COMPONENT_REF): Add new operand.
	(ARRAY_REF, ARRAY_RANGE_REF): Add two new operands.
	* tree.h (array_ref_element_size, array_ref_low_bound): New decls.
	(component_ref_field_offset): Likewise.
	* config/alpha/alpha.c (alpha_va_start): Add new op for COMPONENT_REF.
	(alpha_gimplify_va_arg): Likewise.
	* config/i386/i386.c (ix86_va_start, ix86_gimplify_va_arg): Likewise.
	* config/i860/i860.c (i860_va_start, i860_va_arg): Likewise.
	* config/iq2000/iq2000.c (iq2000_va_arg): Likewise.
	* config/mips/mips.c (mips_va_start, mips_va_arg): Likewise.
	* config/rs6000/rs6000.c (rs6000_va_start, rs6000_gimplify_va_arg):
	Likewise.
	* config/s390/s390.c (s390_va_start, s390_gimplify_va_arg): Likewise.
	* config/sh/sh.c (sh_va_start, sh_va_arg): Likewise.
	* config/stormy16/stormy16.c (xstormy1_expand_builin_va_start):
	Likewise.
	(xstormy16_expand_builtin_va_arg): Likewise.
	* config/xtensa/xtensa.c (xtensa_va_start, xtensa_va_arg): Likewise.

	* cp/call.c (build_vfield_ref): Add new operand for COMPONENT_REF.
	(build_new_method_call): Likewise.
	* cp/decl.c (local_variable_p_walkfn): Don't walk into types.
	* cp/decl2.c (grok_array_decl): Add new operands for ARRAY_REF.
	(build_anon_union_vars): Add new operand for COMPONENT_REF.
	* cp/init.c (buld_new): Add new operand for ARRAY_REF.
	* cp/method.c (do_build_copy_constructor): New op for COMPONENT_REF.
	(do_build_assign_ref): Likewise.
	* cp/parser.c (cp_parser_direct_new_declarator): Add new operands
	for ARRAY_REF.
	(cp_parser_direct_declarator): Likewise.
	* cp/pt.c (tsubst): Likewise.
	(tsubst_copy, tsubst_copy_and_build): Likewise; also add new operand
 	for COMPONENT_REF.
	* cp/semantics.c (finish_non_static_data_member): Add new operand
	for COMPONENT_REF.
	* cp/typeck.c (build_class_member_access_expr): Likewise.
	(build_class_member_access_expr, finish_class_member_access_expr):
	Likewise.
	(build_ptrmemfunc_access_expr): Likewise.
	(build_array_ref): Add new operands for ARRAY_REF.
	* cp/typeck2.c (split_nonconstant_init_1): Likewise; COMPONENT_REF too.
	* cp/tree.c (count_trees_r, no_linkage_helper): Don't walk in types.

	* fortran/f95-lang.c (LANG_HOOKS_GIMPLE_BEFORE_INLINING): Deleted.
	* fortran/trans-array.c (gfc_conv_descriptor_data): Add operand
	for COMPONENT_REF.
	(gfc_conv_descriptor_offset, gfc_conv_descriptor_dtype): Likewise.
	(gfc_conv_descriptor_dimension, gfc_conv_descriptor_stride): Likewise.
	(gfc_conv_descriptor_lbound, gfc_conv_descriptor_ubound): Likewise.
	* fortran/trans-common.c (create_common): Likewise.
	* fortran/trans-expr.c (gfc_conv_component_ref): Likewise.
	* fortran/trans-io.c (set_parameter_value): Likewise.
	(set_parameter_ref, set_string, set_flag, io_result): Likewise.
	(transfer_expr): Likewise.
	* fortran/trans-decl.c (gfc_trans_auto_character_variable):
	Set up to get DECL_SIZE and DECL_SIZE_UNIT gimplified.
	(gfc_simplify_function): New function.
	(gfc_generate_function-code): Properly handle nested functions.
	* fortran/trans.c (gfc_build_array_ref): Add two new operands
	for ARRAY_REF.

	* java/class.c (build_class_ref): Add new operand for COMPONENT_REF.
	(build_static_field_ref): Likewise and add new operands for ARRAY_REF.
	* java/constants.c (build_ref_from_constant_pool): Likewise.
	* java/expr.c (build_java_array_length_access): Likewise.
	(build_get_class, build_field_ref, build_known_method_ref): Likewise.
	(invoke_build_dtable, build_invokevirtual): Likewise.
	(build_invokeinterface, java_expand_expr): Likewise.
	(emit_init_test_initialization): Likewise.
	* java/java-gimplify.c (java_gimplify_new_array_init): Likewise.
	* java/parse.y (make_qualifed_name, build_array_ref): Likewise.

	* objc/ojbc-act.c (generate_static_references): Add additional
	operands to ARRAY_REF.
	(generate_strings, build_method_prototype_list_template): Likewise.
	(generate_protocol_list): Likewise.

From-SVN: r83474
2004-06-21 23:07:05 -04:00
Roger Sayle
54d581a26e fold-const.c (operand_equal_p): Pass flags in recursive calls for binary and relational operations.
* fold-const.c (operand_equal_p): Pass flags in recursive calls for
	binary and relational operations.  Add support for TRUTH_ANDIF_EXPR,
	TRUTH_ORIF_EXPR, TRUTH_AND_EXPR, TRUTH_OR_EXPR and TRUTH_XOR_EXPR.
	* tree.c (commutative_tree_code): Also list UNORDERED_EXPR,
	ORDERED_EXPR, UNEQ_EXPR, LTGT_EXPR, TRUTH_AND_EXPR, TRUTH_OR_EXPR
	and TRUTH_XOR_EXPR.

From-SVN: r83433
2004-06-21 12:59:58 +00:00
Richard Henderson
3a5b9284da c-common.c (verify_sequence_points): Export.
* c-common.c (verify_sequence_points): Export.
        (c_expand_expr_stmt): Move to c-typeck.c.
        * c-common.h (c_expand_expr_stmt): Remove.
        (verify_sequence_points): Declare.
        * c-mudflap.c (mflang_flush_calls): Use c_finish_expr_stmt.
        * c-parse.in (for_init_stmt, stmt): Likewise.
        * c-tree.h (c_finish_expr_stmt): Declare.
        (c_tree_expr_nonnegative_p): Remove.
        * c-typeck.c (c_tree_expr_nonnegative_p): Remove.
        (build_conditional_expr, build_binary_op): Use tree_expr_nonnegative_p.
        (emit_side_effect_warnings): New.
        (c_finish_expr_stmt): Rename from c_expand_expr_stmt.  Use it.
        (c_finish_stmt_expr): Work without EXPR_STMT.  Handle eh regions.
        Use emit_side_effect_warnings.
        (push_cleanup): Copy STATEMENT_LIST_STMT_EXPR.
        * fold-const.c (tree_expr_nonnegative_p): Handle TARGET_EXPR.
        * gimplify.c (gimplify_modify_expr): Don't discard TARGET_EXPR
        with void initializer.
        (gimplify_target_expr): Handle void BIND_EXPR initializer.
        * tree-inline.c (estimate_num_insns_1): Fix type lookup for
        INIT_EXPR and MODIFY_EXPR.
        * objc/objc-act.c (build_module_descriptor): Use add_stmt
        instead of c_expand_expr_stmt.
cp/
        * semantics.c (finish_expr_stmt): Call verify_sequence_points.
testsuite/
        * gcc.dg/tree-ssa/20030714-1.c: Rename variables to avoid
        merging && to BIT_FIELD_REF.

From-SVN: r83429
2004-06-21 02:15:29 -07:00
Paolo Bonzini
2c486ea78c fold-const.c (fold_cond_expr_with_comparison): New function, extracted from fold.
2004-06-21  Paolo Bonzini  <bonzini@gnu.org>

	* fold-const.c (fold_cond_expr_with_comparison):
	New function, extracted from fold.
	(fold): Extract code to fold A op B ? A : C, use
	it to fold A op B ? C : A.  Really optimize
	A & N ? N : 0 where N is a power of two.  Avoid
	relying on canonicalization and recursion for
	foldings of COND_EXPR to happen.

From-SVN: r83428
2004-06-21 08:34:12 +00:00
Roger Sayle
ee8db92b39 fold-const.c (fold): Add constant folding for unordered comparison tree nodes.
* fold-const.c (fold) <UNORDERED_EXPR, ORDERED_EXPR, UNLT_EXPR,
	UNLE_EXPR, UNGT_EXPR, UNGE_EXPR, UNEQ_EXPR, LTGT_EXPR>: Add
	constant folding for unordered comparison tree nodes.  If both
	operands are real constants, call fold_relational_const.  If either
	operand is a NaN, evaluate the other for side-effects and return a
	constant.  Optimize (double)float1 CMP (double)float2 into the
	equivalent float1 CMP float2.
	(nondestructive_fold_binary_to_constant) <UNORDERED_EXPR,
	ORDERED_EXPR, UNLT_EXPR, UNLE_EXPR, UNGT_EXPR, UNGE_EXPR, UNEQ_EXPR,
	LTGT_EXPR>: Call fold_relational_const for constant operands.
	(fold_relational_const): Add support for unordered comparison tree
	nodes.  Don't constant fold "ordered" floating point comparisons
	against NaN if when flag_trapping_math is set.

	* gcc.dg/unordered-2.c: New test case.
	* gcc.dg/unordered-3.c: New test case.

From-SVN: r83379
2004-06-19 00:17:33 +00:00
Jakub Jelinek
e1af829942 fold-const.c (build_range_check): If !in_p and recursive call fails, exit immediately.
* fold-const.c (build_range_check): If !in_p and recursive call
	fails, exit immediately.  If high - low overflows and etype is
	a signed type, retry with unsigned etype.
	(merge_ranges): If !in0_p and !in1_p, handle even range2 adjacent
	to range1 at TYPE_MAX_VALUE and TYPE_MIN_VALUE.

	* gcc.dg/range-test-1.c: New test.
	* g++.dg/opt/range-test-1.C: New test.

From-SVN: r83369
2004-06-19 01:15:59 +02:00
Roger Sayle
9bb80bb2de fold-const.c (constant_boolean_node): Handle boolean_type_node directly...
* fold-const.c (constant_boolean_node): Handle boolean_type_node
	directly, return either boolean_true_node or boolean_false_node.

From-SVN: r83338
2004-06-18 03:35:29 +00:00
Roger Sayle
1382f0f09d * fold-const.c (fold_relational_const): Use constant_boolean_node.
From-SVN: r83307
2004-06-17 20:19:57 +00:00
Jeff Law
fd660b1bee fold-const.c (swap_tree_comparison): No longer static.
* fold-const.c (swap_tree_comparison): No longer static.
        (tree_swap_operands_p): Similarly.  Return true if both operands
        are SSA_NAMEs and the first operand has a higher version number than
        the second operand.
        * tree.h (swap_tree_comparison): Prototype.
        (tree_swap_operands_p): Prototype.
        * tree-ssa-operands.c (get_expr_operands): For commutative
        operators and relational comparisons, canonicalize the
        order of the operands.

        * gcc.dg/tree-ssa/20040615-1.c: New test.
        * gcc.dg/tree-ssa/20030824-1.c: Update expected output to
        be less sensitive to operand ordering.
        * gcc.dg/tree-ssa/20030824-2.c: Likewise.

From-SVN: r83224
2004-06-15 23:09:41 -06:00
Richard Henderson
325c369115 c-common.c (lang_gimplify_stmt): Remove next_p argument.
* c-common.c (lang_gimplify_stmt): Remove next_p argument.
	(if_elt, if_stack, if_stack_space, c_expand_start_cond, c_finish_then,
	c_expand_end_cond, c_expand_start_else, c_finish_else, c_begin_if_stmt,
	c_begin_while_stmt, c_finish_while_stmt_cond): Move to c-typeck.c.
	(finish_fname_decls, fname_decl): Use statement_lists.
	(c_expand_expr_stmt): Don't set last_expr_type.
	(c_type_hash): Fix indentation.
	(c_safe_from_p): Don't follow TREE_CHAIN.
	(c_tree_chain_matters_p): Remove.
	* c-common.def (SCOPE_STMT): Remove.
	(CLEANUP_STMT): Redefine to contain its own body.
	* c-common.h (struct stmt_tree_s): Remove x_last_stmt,
	x_last_expr_type, x_last_expr_filename, x_scope_stmt_stack.
	Add x_cur_stmt_list.
	(last_tree, last_expr_type, last_expr_filename, RECHAIN_STMTS): Remove.
	(cur_stmt_list): New.
	(STATEMENT_LIST_STMT_EXPR): New.
	(SCOPE_BEGIN_P, SCOPE_END_P, SCOPE_STMT_BLOCK, SCOPE_NULLIFIED_P,
	SCOPE_NO_CLEANUPS_P, SCOPE_PARTIAL_P, NEW_FOR_SCOPE_P): Remove.
	(CLEANUP_BODY): New.
	(CLEANUP_DECL): Move to operand 2.
	(c_common_stmt_codes): Remove SCOPE_STMT.
	(COMPOUND_STMT_NO_SCOPE, COMPOUND_STMT_BODY_BLOCK): Remove.
	* c-decl.c (c_scope_stmt_stack, current_scope_stmt_stack): Remove.
	(c_push_function_context, c_pop_function_context): Don't save it.
	(finish_decl): Set TREE_USED on the decl for a cleanup.
	Use push_cleanup.
	(store_parm_decls): Use statement lists.
	(finish_function): Remove compstmt rule workaround.  Use statement
	lists.  Call finish_fname_decls after finalizing the body.
	(c_begin_compound_stmt): Move to c-typeck.c.
	* c-dump.c (c_dump_tree): Remove SCOPE_STMT.
	* c-gimplify.c (gimplify_cleanup_stmt, gimplify_cleanup_stmts): New.
	(c_genericize): Invoke them.
	(c_gimplify_stmt): Don't look through TREE_CHAIN.  Kill SCOPE_STMT.
	(c_build_bind_expr): Export.
	(gimplify_block, gimplify_cleanup): Remove.
	(gimplify_condition): Use gimplify_stmt.
	(gimplify_for_stmt): Remove FOR_INIT_STMT chaining hack.
	(gimplify_if_stmt): Remove recursion hack.
	(c_gimplify_expr): Remove STMT_EXPR handling.
	(stmt_expr_last_stmt, gimplify_stmt_expr): Remove.
	(is_last_stmt_of_scope): Remove.
	* c-lang.c (LANG_HOOKS_TREE_INLINING_TREE_CHAIN_MATTERS_P): Remove.
	* c-mudflap.c (mflang_flush_calls): Use c_begin_compound_stmt,
	c_end_compound_stmt.
	* c-objc-common.c (build_cdtor): Likewise.
	* c-parse.in (primary): Use c_finish_stmt_expr.
	(push_scope, pop_scope): Remove.
	(c99_block_start, compstmt_start): Use c_begin_compound_stmt.
	(c99_block_end, compstmt): Use c_end_compound_stmt.
	(c99_block_lineno_labeled_stmt): Likewise.
	(compstmt_primary_start): Use c_begin_stmt_expr.
	(simple_if, select_or_iter_stmt): Update calls to stmt builders.
	(do_stmt_start): Fill in body directly.
	(lineno_stmt): Avoid setting lineno on constants.
	* c-pretty-print.c (pp_c_statement): Handle STATEMENT_LIST.
	Remove SCOPE_STMT.
	* c-semantics.c (begin_stmt_tree): Remove.
	(push_stmt_list, re_push_stmt_list, pop_stmt_list): New.
	(add_stmt): Use statement lists.
	(add_scope_stmt, finish_stmt_tree): Remove.
	(push_cleanup): New.
	* c-tree.h: Move some decls from c-common.h.
	* c-typeck.c (c_tree_expr_nonnegative_p): Simplify for statement lists.
	(do_case, c_finish_case): Likewise.
	(c_finish_then): Take body for then as argument.
	(c_finish_else): Similarly.
	(c_begin_for_stmt, c_finish_for_stmt_init, c_finish_for_stmt_cond,
	c_finish_for_stmt_incr, c_finish_for_stmt): New.
	(c_begin_stmt_expr, c_finish_stmt_expr): New.
	(c_begin_compound_stmt): Do scope management.
	(c_end_compound_stmt): New.
	* fold-const.c (tree_expr_nonnegative_p): Fix BIND_EXPR.
	* gimplify.c (voidify_wrapper_expr): Accept temporary argument.
	Look through exception handling constructs.
	(gimplify_bind_expr): Accept temporary argument.
	(gimplify_target_expr): Special case BIND_EXPR bodies.
	(gimplify_expr): Handle fallback == fb_none like a statement.
	* langhooks-def.h (LANG_HOOKS_TREE_INLINING_TREE_CHAIN_MATTERS_P): Kill.
	* langhooks.c (lhd_tree_inlining_tree_chain_matters_p): Remove.
	* langhooks.h (tree_chain_matters_p): Remove.
	* stub-objc.c (objc_clear_super_receiver): New.
	* tree-gimple.h (voidify_wrapper_expr): Update decl.
	(append_to_statement_list, append_to_statement_list_force): Move
	to tree-iterator.h.
	* tree-inline.c (expand_call_inline): Update call.
	(clone_body): Use statement lists.
	(walk_tree): Don't check tree_chain_matters_p.
	(copy_tree_r): Likewise.
	* tree-iterator.c (alloc_stmt_list): Clear lang bits.
	(tsi_link_before, tsi_link_after): Set TREE_SIDE_EFFECTS properly.
	* tree-iterator.h (append_to_statement_list,
	append_to_statement_list_force): Moved from tree-gimple.h.
	* tree-pretty-print.c (dump_generic_node): Clean up TARGET_EXPR dump.
	* objc/objc-act.c (build_module_descriptor): Use c_begin_compound_stmt.
	(objc_enter_block): Likewise.
	(objc_exit_block): Use c_end_compound_stmt.
	(objc_build_try_enter_fragment): Add #error and comment for
	rewriting for OBJCPLUS.
	(objc_build_extract_fragment, objc_build_try_epilogue,
	objc_build_catch_stmt, objc_build_finally_prologue,
	objc_build_finally_epilogue): Update for C statement builders.
	* objc/objc-lang.c (LANG_HOOKS_TREE_INLINING_TREE_CHAIN_MATTERS_P):
	Remove.
cp/
	* call.c (initialize_reference): Don't build CLEANUP_STMT here.
	* cp-gimplify.c (cp_gimplify_stmt): Remove next_p argument.
	(genericize_try_block): Use gimplify_stmt.
	(genericize_catch_block, genericize_eh_spec_block): Likewise.
	(cp_gimplify_init_expr): Remove STMT_EXPR special case.
	(gimplify_must_not_throw_expr): Update voidify_wrapper_expr call.
	* cp-lang.c (LANG_HOOKS_TREE_INLINING_TREE_CHAIN_MATTERS_P): Remove.
	(cp_tree_chain_matters_p): Remove.
	* cp-tree.h (COMPOUND_STMT_TRY_BLOCK): New.
	(COMPOUND_STMT_BODY_BLOCK): New.
	(STATEMENT_LIST_NO_SCOPE, STATEMENT_LIST_TRY_BLOCK): New.
	(EXPR_STMT_STMT_EXPR_RESULT): New.
	(building_stmt_tree): Check cur_stmt_list.
	(tf_stmt_expr_cmpd, tf_stmt_expr_body): Remove.
	(BCS_NO_SCOPE, BCS_TRY_BLOCK, BCS_FN_BODY): New.
	* decl.c (poplevel): Use pop_stmt_list for minding cleanups.
	(cp_finish_decl): Use push_cleanup.
	(start_function, finish_function): Use statement lists.
	(finish_stmt): Do nothing.
	* except.c (begin_eh_spec_block): Use statement lists.
	(check_handlers_1, check_handlers): Likewise.
	* init.c (construct_virtual_base): Don't add extra compound stmts.
	(build_vec_init): Likewise.
	* name-lookup.c (maybe_push_cleanup_level): Use statement lists.
	* name-lookup.h (struct cp_binding_level): Add statement_list.
	* parser.c (cp_parser_statement): Take the STMT_EXPR node, not a bool.
	(cp_parser_labeled_statement, cp_parser_expression_statement,
	cp_parser_statement_seq_opt): Likewise.
	(cp_parser_compound_statement): Likewise.  Take bool for try block.
	(cp_parser_selection_statement): Tidy if processing.
	(cp_parser_already_scoped_statement): Rewrite to do what it says.
	* pt.c (tsubst_copy): Move STMT_EXPR to tsubst_expr.
	(tsubst_expr): Rewrite STMT_EXPR processing.  Handle STATEMENT_LIST.
	Mind COMPOUND_STMT_TRY_BLOCK, EXPR_STMT_STMT_EXPR_RESULT.
	* semantics.c (do_poplevel, do_pushlevel): Use statement lists.
	(finish_cond): New, rewritten from FINISH_COND.
	(simplify_loop_decl_cond): New.
	(finish_expr_stmt): Avoid nested EXPR_STMTs.
	(begin_if_stmt, finish_if_stmt_cond, finish_then_clause,
	begin_else_clause, finish_else_clause, finish_if_stmt,
	begin_while_stmt, finish_while_stmt_cond, finish_while_stmt,
	begin_do_stmt, finish_do_body, begin_for_stmt, finish_for_init_stmt,
	finish_for_cond, finish_for_stmt, begin_switch_stmt,
	finish_switch_cond, finish_switch_stmt, begin_try_block,
	finish_try_block, finish_cleanup_try_block, finish_function_try_block,
	finish_handler_sequence, finish_function_handler_sequence,
	begin_handler, finish_handler_parms, finish_handler,
	begin_stmt_expr, finish_stmt_expr_expr, finish_stmt_expr): Rewrite
	using statement lists.
	(begin_compound_stmt): Replace has_no_scope argument with flags.
	Update all callers.  Use statement lists.
	(finish_compound_stmt): Likewise.
	(finish_decl_cleanup, finish_eh_cleanup): Use push_cleanup.
	(current_scope_stmt_stack): Remove.
	(simplify_aggr_init_expr): Don't muck with TREE_CHAIN.
	* typeck2.c (split_nonconstant_init_1, split_nonconstant_init):
	Rewrite with statement lists.
testsuite/
	* g++.dg/ext/stmtexpr1.C: XFAIL.
	* gcc.dg/20030612-1.c: XFAIL.

From-SVN: r83221
2004-06-15 18:21:38 -07:00
Paolo Bonzini
3dd8069d49 fold-const.c (operand_equal_p): Update comment.
2004-06-15  Paolo Bonzini  <bonzini@gnu.org>

	* fold-const.c (operand_equal_p): Update comment.

From-SVN: r83173
2004-06-15 10:27:30 +00:00
Andrew Pinski
a40de696ac fold-const.c (fold_checksum_tree <case 't'>): Only look at TREE_VALUES if the EXPR is an ENUMERAL_TYPE.
2004-06-13  Andrew Pinski  <pinskia@physics.uc.edu>

        * fold-const.c (fold_checksum_tree <case 't'>): Only
        look at TREE_VALUES if the EXPR is an ENUMERAL_TYPE.
        Only look at TYPE_MIN_VALUE and TYPE_MAX_VALUE if
        EXPR is an INTEGERAL_TYPE or a scalar float type.

From-SVN: r83068
2004-06-13 15:15:51 -07:00
Roger Sayle
08039bd80b fold-const.c (omit_two_operands): New function.
* fold-const.c (omit_two_operands): New function.
	* tree.h (omit_two_operands): Prototype here.
	* builtins.c (fold_builtin_unordered_cmp): New function to lower
	C99 unordered comparison builtins to the appropriate tree nodes.
	(fold_builtin_1): Use fold_builtin_unordered_cmp to lower
	BUILT_IN_ISGREATER, BUILT_IN_ISGREATEREQUAL, BUILT_IN_ISLESS,
	BUILT_IN_ISLESSEQUAL and BUILT_IN_ISLESSGREATER.  Manually lower
	BUILT_IN_ISUNORDERED comparisons to an UNORDERED_EXPR tree node.
	(simplify_builtin_memcmp, simplify_builtin_strncmp,
	simplify_builtin_strncat, simplify_builtin_strspn): Use the new
	omit_two_operands function to build the required COMPOUND_EXPRs.

From-SVN: r83040
2004-06-12 19:41:51 +00:00
Jeff Law
3100d64725 fold-const.c (fold_inf_compare): Avoid creating non-gimple code when we are in gimple form.
* fold-const.c (fold_inf_compare): Avoid creating non-gimple
        code when we are in gimple form.


        * gcc.c-torture/compile/20040610-1.c: New test.

From-SVN: r82958
2004-06-10 21:22:30 -06:00
Roger Sayle
9655d83b75 fold-const.c (fold_abs_const): Make extern.
* fold-const.c (fold_abs_const): Make extern.
	* tree.h (fold_abs_const): Prototype here.
	* builtins.c (fold_builtin_fabs): New function to transform
	fabs, fabsf and fabsl builtins into ABS_EXPR tree nodes.
	(fold_builtin_abs): New function to transform abs, labs, llabs
	and imaxabs builtins into ABS_EXPR tree nodes.
	(expand_builtin): Fall back to a function call for abs, labs,
	llabs and imaxabs builtins that survive constant folding.
	(fold_builtin_1): Call fold_builtin_fabs for FABS, FABSF and
	FABSL, and fold_builtin_abs for ABS, LABS, LLABS and IMAXABS.

From-SVN: r82916
2004-06-10 13:29:34 +00:00
Roger Sayle
a653e758f6 fold-const.c (fold_not_const): New function.
* fold-const.c (fold_not_const): New function.
	(fold) <ABS_EXPR>: Don't bother testing wins.
	(fold) <BIT_NOT_EXPR>: Call fold_not_const.
	(nondestructive_fold_unary_to_constant) <BIT_NOT_EXPR>: Likewise.

From-SVN: r82868
2004-06-10 00:02:48 +00:00
Jason Merrill
cd3ce9b44c Gimplify VA_ARG_EXPR into simpler forms.
* target.h: Add gimplify_va_arg_expr hook.
        * target-def.h: Add TARGET_GIMPLIFY_VA_ARG_EXPR.
        * fold-const.c (build_fold_addr_expr)
        (build_fold_addr_expr_with_type): Move from gimplify.c.
        * tree.h: Declare them.
        * gimplify.c (gimplify_and_add): New fn.
        (build_addr_expr, build_addr_expr_with_type): Move to fold-const.c.
        (gimplify_array_ref_to_plus, gimplify_modify_expr)
        (gimplify_expr): Use build_fold_*.
        (copy_if_shared_r): Only mark VA_ARG_EXPR volatile if we
        don't know how to gimplify it.
        * builtins.c (std_gimplify_va_arg_expr): New fn.
        (dummy_object): New static fn.
        (gimplify_va_arg_expr): New fn.
        (stabilize_va_list): Use build_fold_*.
        * tree-gimple.h: Declare new fns.
        * config/i386/i386.c (TARGET_GIMPLIFY_VA_ARG_EXPR): Define.
        (ix86_gimplify_va_arg): New fn.
        * config/i386/ia64.c (TARGET_GIMPLIFY_VA_ARG_EXPR): Define.
        (ia64_gimplify_va_arg): New fn.
        * config/i386/rs6000.c (rs6000_gimplify_va_arg): New fn.
        (TARGET_GIMPLIFY_VA_ARG_EXPR): Define.
        * config/i386/sparc.c (sparc_gimplify_va_arg): New fn.
        * alias.c (get_varargs_alias_set): Just return 0 for now.

        * c-objc-common.c (c_tree_printer): Improve handling of %T.

From-SVN: r82838
2004-06-09 11:32:44 -04:00
Andrew Pinski
908d0773f0 fold-const.c (fold_convert): Treat OFFSET_TYPE like POINTER_TYPE and INTEGER_TYPE.
2004-06-08  Andrew Pinski  <pinskia@physics.uc.edu>

        * fold-const.c (fold_convert): Treat OFFSET_TYPE like
        POINTER_TYPE and INTEGER_TYPE.

From-SVN: r82792
2004-06-08 15:03:29 -07:00
Roger Sayle
67057c537b real.c (real_copysign): New function to implement libm's copysign.
* real.c (real_copysign): New function to implement libm's copysign.
	* real.h (real_copysign): Prototype here.
	* fold-const.c (tree_expr_nonnegative_p): The result of sqrt, sqrtf
	and sqrtl can be negative, as sqrt(-0.0) = -0.0.  Correct whitespace.
	* builtins.c (fold_builtin_isascii, fold_builtin_toascii,
	fold_builtin_isdigit): Add function prototypes.
	(fold_builtin_copysign): New function to fold copysign, copysignf
	and copysignl.  Optimize copysign(x,x) as x.  Evaluate copysign of
	constant arguments at compile-time using real_copysign.  Fold
	copysign(X,Y) as fabs(X) if Y is always non-negative.
	(fold_builtin_1): Correct minor whitespace/style issues.  Call
	fold_builtin_copysign for BUILT_IN_COPYSIGN{,F,L}.

	* gcc.dg/builtins-41.c: New test case.
	* gcc.dg/builtins-42.c: New test case.

From-SVN: r82721
2004-06-07 20:50:14 +00:00
Roger Sayle
1f7a8dccd4 re PR c++/15069 (a bit test on a variable of enum type is miscompiled)
PR middle-end/15069
	* fold-const.c (fold_single_bit_test): Only perform "(X & C) != 0"
	into "X < 0" (where C is the signbit) if X's type is a full mode.

	* g++.dg/opt/fold3.C: New test case.

From-SVN: r82490
2004-05-31 17:01:17 +00:00
Roger Sayle
1b0f3e79b1 fold-const.c (combine_comparisons, [...]): Use constant_boolean_node where appropriate.
* fold-const.c (combine_comparisons, optimize_bit_field_compare,
	range_binop, fold_truthop, fold_binary_op_with_conditional_arg,
	fold_mathfn_compare, fold_inf_compare, fold,
	fold_relational_hi_lo, nondestructive_fold_binary_to_constant):
	Use constant_boolean_node where appropriate.  Don't bother using
	fold_convert on the second argument to omit_one_operand.

From-SVN: r82468
2004-05-30 22:23:19 +00:00
Andrew Pinski
d22b7e1406 fold-const.c (fold): Make sure the type is of BOOLEAN_TYPE.
2004-05-30  Andrew Pinski  <pinskia@physics.uc.edu>

        * fold-const.c (fold) [case TRUTH_NOT_EXPR]: Make sure the type is
        of BOOLEAN_TYPE.

From-SVN: r82456
2004-05-30 09:18:59 -07:00
Kazu Hirata
1ea7e6ad84 c-common.c, [...]: Fix comment typos.
* c-common.c, calls.c, cfgcleanup.c, cgraph.c, cgraphunit.c,
	ddg.c, ddg.h, df.c, df.h, except.c, expr.c, flags.h,
	fold-const.c, gcc.c, gimplify.c, haifa-sched.c,
	modulo-sched.c, tree-inline.c, tree-into-ssa.c, tree-nested.c,
	tree-nrv.c, tree-ssa-ccp.c, tree-ssa-dom.c, tree-ssa-live.c,
	tree-ssa-loop.c, tree-ssa-pre.c, tree-tailcall.c, tree.h: Fix
	comment typos.  Follow spelling conventions.

From-SVN: r82439
2004-05-30 07:12:58 +00:00
Paolo Bonzini
d1a7edafe6 re PR rtl-optimization/15649 (ICE with __builtin_isgreater and -ffast-math)
gcc/ChangeLog:
2004-05-27  Paolo Bonzini  <bonzini@gnu.org>
	    Roger Sayle  <roger@eyesopen.com>

	PR rtl-optimization/15649
	Add LTGT_EXPR and improve pretty-printing of unordered
	comparisons.
	* c-common.c (c_common_truthvalue_conversion):
	Handle LTGT_EXPR.
	* c-typeck.c (build_binary_op): Likewise.
	* dojump.c (do_jump): Likewise.
	* expr.c (expand_expr_real_1, do_store_flag): Likewise.
	* predict.c (tree_predict_by_opcode): Likewise.
	* real.c (real_compare): Likewise.
	* tree-cfg.c (verify_expr): Likewise.
	* tree-inline.c (estimate_num_insns_1): Likewise.
	* tree-pretty-print.c (dump_generic_node): Likewise.
	Handle ORDERED_EXPR, UNORDERED_EXPR.
	(op_symbol): Print unordered comparisons differently
	than ordered ones.
	* tree.def (LTGT_EXPR): New '<' tree code.
	* doc/c-tree.texi (Expressions): Document floating-point
	comparison nodes.

	Fold comparisons between floating point values.
	* fold-const.c (enum comparison_code): New, from
	#define'd constants.  Define compcodes for unordered
	comparisons and for invalid transformations.
	(invert_tree_comparison): Add "honor_nans" parameter.
	(fold_truthop): Revamp to work on floating-point types too.
	(comparison_to_compcode): Support unordered comparisons.
	Use new enum comparison_code.
	(compcode_to_comparison): Likewise.
	(combine_compcodes): New function.
	(invert_truthvalue): Let invert_tree_comparison decide
	whether it is valid to fold the comparison.  Fold ORDERED
	and UNORDERED even if flag_unsafe_math_optimizations is off,
	and the remaining even if flag_unsafe_math_optimizations
	is off but we are under -fno-trapping-math.
	(fold_relational_const): Integer modes do not honor NaNs.

gcc/testsuite/ChangeLog:
2004-05-27  Paolo Bonzini  <bonzini@gnu.org>

	* gcc.c-torture/compare-fp-1.c, gcc.c-torture/compare-fp-2.c,
	gcc.c-torture/compare-fp-3.c, gcc.c-torture/compare-fp-4.c,
	gcc.c-torture/compare-fp-3.x, gcc.c-torture/compare-fp-4.x,
	gcc.c-torture/pr15649-1.c: New.

Co-Authored-By: Roger Sayle <roger@eyesopen.com>

From-SVN: r82365
2004-05-28 16:37:08 +00:00
Roger Sayle
8d4a2ff6c6 fold-const.c (non_lvalue): Explicitly list the tree codes that need to be wrapped by NON_LVALUE_EXPR...
* fold-const.c (non_lvalue): Explicitly list the tree codes that
	need to be wrapped by NON_LVALUE_EXPR, instead of those that don't.

From-SVN: r82195
2004-05-24 03:02:44 +00:00
Ulrich Weigand
12fea1f9fc fold-const.c (fold_read_from_constant_string): Convert result to requested type.
* fold-const.c (fold_read_from_constant_string): Convert result to
	requested type.

From-SVN: r82120
2004-05-22 00:27:23 +00:00
Roger Sayle
b953ebd647 fold-const.c (fold, [...]): Use fold_convert instead of convert.
* fold-const.c (fold, fold_relational_hi_lo,
	nondestructive_fold_binary_to_constant,
	fold_read_from_constant_string): Use fold_convert instead of convert.
	* builtins.c (simplify_builtin, simplify_builtin_strstr,
	simplify_builtin_strchr, simplify_builtin_strrchr,
	simplify_builtin_strpbrk): Use fold_convert instead of convert.

From-SVN: r82102
2004-05-21 16:39:38 +00:00
Roger Sayle
59ce6d6bee tree.c (array_type_nelts, [...]): Replace build with build2.
* tree.c (array_type_nelts, save_expr, substitute_in_expr,
	get_unwidened, get_narrower): Replace build with build2.
	* fold-const.c (negate_expr, associate_trees, size_binop,
	fold_convert, eval_subst, omit_one_operand, invert_truthvalue,
	pedantic_omit_one_operand, distribute_bit_expr,
	make_bit_field_ref, optimize_bit_field_compare,
	decode_field_reference, range_binop, make_range,
	build_range_check, fold_range_test, fold_truthop,
	optimize_minmax_comparison, extract_muldiv_1,
	fold_binary_op_with_conditional_arg, fold_mathfn_compare,
	fold_inf_compare, fold_single_bit_test, fold,
	fold_relational_hi_lo, nondestructive_fold_binary_to_constant):
	Likewise replace build with either build2 or build3.

From-SVN: r82083
2004-05-21 00:54:35 +00:00
Roger Sayle
f4085d4c0b re PR middle-end/3074 (Statement with no effect not flagged with -Wall)
PR middle-end/3074
	* fold-const.c (strip_compound_expr): Delete function.
	(count_cond): Delete function.
	(fold_binary_op_with_conditional_arg): Only perform transformations
	"a + (b?c:d) -> b ? a+c : a+d" and "(b?c:d) + a -> b ? c+a : d+a"
	when a is constant.  This greatly simplifies this routine.

	* tree.c (saved_expr_p): Delete function.
	* tree.h (saved_expr_p): Delete function prototype.

	* gcc.dg/pr3074-1.c: New test case.
	* gcc.dg/sequence-pt-1.c: Remove an XFAIL.

From-SVN: r82071
2004-05-20 22:08:46 +00:00
Paolo Bonzini
d28f752bd3 fold-const.c: Remove non-printable character 160.
2004-05-19  Paolo Bonzini  <bonzini@gnu.org>

	* fold-const.c: Remove non-printable character 160.

From-SVN: r82024
2004-05-19 13:14:18 +00:00
Steven Bosscher
673fda6b48 c-gimplify.c (c_genericize): Replace calls via (*lang_hooks.foo) with lang_hooks.foo.
* c-gimplify.c (c_genericize):
	Replace calls via (*lang_hooks.foo) with lang_hooks.foo.
	* c-parse.in <expr_no_commas>: Likewise.
	<if_prefix>: Likewise.
	<select_or_iter_stmt>: Likewise.
	* expr.c (expand_var, expand_expr_real_1): Likewise.
	* expr.h (expand_expr): Make it a static inline function.
	Move prototype for expand_expr_real up before this.
	* fold-const.c (fold_relational_hi_lo, fold_relational_const):
	Likewise.
	* gimplify.c (gimple_boolify, gimplify_addr_expr,
	gimplify_asm_expr, gimplify_expr): Likewise.
	* tree-cfg.c (dump_tree_cfg, dump_cfg_stats, tree_cfg2vcg,
	dump_function_to_file): Likewise.
	* tree-dfa.c (dump_immediate_uses, dump_dfa_stats): Likewise.
	* tree-inline.c (remap_block, save_body, walk_tree): Likewise.
	* tree-into-ssa.c (dump_tree_ssa): Likewise.
	* tree-mudflap.c (mf_varname_tree, mf_file_function_line_tree):
	Likewise.
	* tree-optimize.c (execute_one_pass): Likewise.
	* tree-pretty-print.c (dump_generic_bb_buff): Likewise.
	* tree-ssa-alias.c (dump_alias_stats, dump_alias_info): Likewise.

objc/
	* objc-act.c (objc_build_try_enter_fragment,
	objc_build_try_epilogue, objc_build_catch_stmt,
	objc_build_finally_prologue): Replace calls via (*lang_hooks.foo)
	with lang_hooks.foo ().

From-SVN: r81907
2004-05-15 23:07:53 +00:00
Diego Novillo
6de9cd9a88 Merge tree-ssa-20020619-branch into mainline.
From-SVN: r81764
2004-05-13 02:41:07 -04:00
Roger Sayle
8dc2384cc9 fold-const.c (fold_div_compare): New function to optimize X/C1 op C2 where op is a comparison operator and C1...
* fold-const.c (fold_div_compare): New function to optimize X/C1 op C2
	where op is a comparison operator and C1 and C2 are integer constants
	into a range check.
	(fold): Call fold_div_compare.

	* gcc.c-torture/execute/divcmp-1.c: New test case.
	* gcc.c-torture/execute/divcmp-2.c: New test case.
	* gcc.c-torture/execute/divcmp-3.c: New test case.

From-SVN: r81645
2004-05-08 17:36:21 +00:00
Kaveh R. Ghazi
fc62753005 fold-const.c (fold_convert_const, fold): Add missing FIX_ROUND_EXPR case.
* fold-const.c (fold_convert_const, fold): Add missing
	FIX_ROUND_EXPR case.

From-SVN: r81410
2004-05-02 13:41:20 +00:00
Kazu Hirata
1ae58c30e2 bb-reorder.c, [...]: Fix comment typos.
* bb-reorder.c, c-opts.c, cfglayout.c, cgraph.c, cgraphunit.c,
	cppfiles.c, fold-const.c, ggc-zone.c, loop-doloop.c, optabs.c,
	reg-stack.c, varasm.c, config/alpha/ev4.md,
	config/alpha/ev5.md, config/alpha/ev6.md, config/arm/arm.c,
	config/c4x/c4x.c, config/c4x/c4x.md, config/cris/cris.c,
	config/cris/cris.h, config/fr30/fr30.h, config/frv/frv.c,
	config/frv/frv.h, config/frv/frv.md, config/h8300/h8300.c,
	config/i386/i386.c, config/i386/i386.md, config/i386/winnt.c,
	config/ia64/itanium2.md, config/ip2k/ip2k.c,
	config/mips/mips.c, config/mips/mips.h, config/mips/sr71k.md,
	config/pa/pa.c, config/s390/s390.c, config/sh/sh.c: Fix
	comment typos.

From-SVN: r81345
2004-04-30 16:27:30 +00:00
Kazu Hirata
2b8a92de97 builtins.c, [...]: Fix comment typos.
* builtins.c, cgraph.c, cgraphunit.c, final.c, fold-const.c:
	Fix comment typos.

From-SVN: r81291
2004-04-29 15:39:12 +00:00
Roger Sayle
7c95f621b3 fold-const.c (fold): Prefer fold_convert (negate_expr (...)) to fold (build1 (NEGATE_EXPR, ...)).
* fold-const.c (fold): Prefer fold_convert (negate_expr (...)) to
	fold (build1 (NEGATE_EXPR, ...)).  Optimize X / -1 as -X and
	X % -1 as 0.

From-SVN: r81177
2004-04-26 03:43:17 +00:00
Roger Sayle
e419fe91e5 fold-const.c (fold_convert): Make function extern/public.
* fold-const.c (fold_convert): Make function extern/public.
	* tree.h (fold_convert): Prototype here.
	* builtins.c (expand_builtin_strstr, expand_builtin_strchr,
	expand_builtin_strrchr, expand_builtin_strpbrk,
	expand_builtin_mempcpy, expand_builtin_bcopy,
	expand_builtin_bzero, expand_builtin_memcmp,
	expand_builtin_strcmp, expand_builtin_strncmp,
	stabilize_va_list, expand_builtin_sprintf,
	fold_trunc_transparent_mathfn, fold_builtin_logarithm,
	fold_builtin_exponent, fold_builtin_mempcpy,
	fold_builtin_strcpy, fold_builtin_strcmp, fold_builtin_strncmp,
	fold_builtin_signbit, fold_builtin_isdigit, fold_builtin): Prefer
	fold_convert to "convert" or "fold (build1 (NOP_EXPR, ...))".

From-SVN: r80878
2004-04-20 02:56:44 +00:00
Kaveh R. Ghazi
a69934e07e builtins.c (fold_builtin_cabs, [...]): Use `mathfn_built_in' to determine the new builtin.
* builtins.c (fold_builtin_cabs, fold_builtin): Use
	`mathfn_built_in' to determine the new builtin.
	* fold-const.c (fold): Likewise.

From-SVN: r80680
2004-04-14 14:29:35 +00:00
Roger Sayle
b3e65ebba9 fold-const.c (fold_binary_op_with_conditional_arg): Tweak calling convention to allow a NULL_TREE to be returned.
* fold-const.c (fold_binary_op_with_conditional_arg):  Tweak
	calling convention to allow a NULL_TREE to be returned.  Factor
	sanity checks from callers, return NULL_TREE when appropriate.
	(fold): Handle COMPOUND_EXPR operands of binary expressions
	before COND_EXPR operands.  Use reorder_operands_p(a,b) to check
	whether a op (b,c) can be rewritten as (b, a op c).  Simplify
	calls to fold_binary_op_with_conditional_arg.

From-SVN: r80609
2004-04-11 21:18:40 +00:00
Roger Sayle
2f63a4570c fold-const.c (fold): Guard (-A)+B -> B-A transformation with reorder_operands_p.
* fold-const.c (fold) <PLUS_EXPR>: Guard (-A)+B -> B-A transformation
	with reorder_operands_p.

From-SVN: r80381
2004-04-03 20:05:40 +00:00
Waldek Hebisch
af5bdf6ad7 * fold-const.c (folda): Preserve types of comparisons.
From-SVN: r80327
2004-04-01 14:30:09 -08:00
Jakub Jelinek
0b61218593 re PR c++/14755 (miscompilation in bitfielded signed integers)
PR c++/14755
	* fold-const.c (fold) <EQ_EXPR>: Properly compute newconst in
	"bitfld++ == const" to "++bitfld == const + incr" transformations.

	* gcc.c-torture/execute/20040331-1.c: New test.
	* gcc.dg/20040331-1.c: New test.

From-SVN: r80294
2004-04-01 17:50:11 +02:00
Richard Kenner
a150de2951 expr.c (get_inner_reference): Use DECL_UNSIGNED, not TREE_UNSIGNED.
* expr.c (get_inner_reference): Use DECL_UNSIGNED, not TREE_UNSIGNED.
	* stor-layout.c (layout_decl): Likewise.
	* tree.c (get_narrower): Likewise and also use BIT_FIELD_REF_UNSIGNED.
	* fold-const.c (make_bit_field_ref): Use BIT_FIELD_REF_UNSIGNED.
	* print-tree.c (print_node): Handle various used of unsigned_flag.
	* tree.def (BIT_FIELD_REF): Update comment.
	* tree.h (TREE_UNSIGNED): Deleted.
	(DECL_UNSIGNED, BIT_FIELD_REF_UNSIGNED): New macros.

	* cp/class.c (VTT_TOP_LEVEL_P): Use unsigned_flag directly.

	* f/com.c (ffe_truthvalue_conversion, case COMPONENT_REF):
	Use DECL_UNSIGNED and integer_onep.

From-SVN: r80293
2004-04-01 08:41:37 -05:00
Richard Kenner
8df83eae1e builtins.c, [...]: Change most occurrences of TREE_UNSIGNED to TYPE_UNSIGNED.
* builtins.c, c-aux-info.c, c-common.c, c-cppbuiltin.c, c-decl.c:
	Change most occurrences of TREE_UNSIGNED to TYPE_UNSIGNED.
	* c-format.c, c-opts.c, c-pretty-print.c, c-typeck.c: Likewise.
	* calls.c, convert.c, dbxout.c, dojump.c, dwarf2out.c: Likewise.
	* expmed.c, expr.c, fold-const.c, function.c, integrate.c: Likewise.
	* optabs.c, sdbout.c, stmt.c, stor-layout.c, tree-dump.c: Likewise.
	* tree.c, config/iq2000/iq2000.c, config/m32r/m32r.c: Likewise.
	* config/mips/mips.c, config/rs6000/rs6000.c: Likewise.
	* config/s390/s390.c, config/sparc/sparc.c, objc/objc-act.c: Likewise.
	* stor-layout.c (layout_type, case COMPLEX_TYPE): Test for
	REAL_TYPE, not INTEGER_TYPE.
	(layout_type, case VECTOR_TYPE): Simplify code.
	* tree.c (build_vector_type_for_mode): Remove dup unsigned setting.
	* tree.h: Update comments.
	(STRIP_NOPS): Use TYPE_UNSIGNED.
	(TYPE_UNSIGNED): New macro.
	(TYPE_TRAP_SIGNED): Remove now redundant check.
	(SAVE_EXPR_NOPLACEHOLDER): Don't use TREE_UNSIGNED.

	* cp/call.c (joust): Use TYPE_UNSIGNED, not TREE_UNSIGNED.
	* cp/class.c (check_bitfield_decl): Likewise.
	* cp/cvt.c (type_promotes_to): Likewise.
	* cp/decl.c (finish_enum): Likewise.
	* cp/mangle.c (write_builtin_type): Likewise.
	* cp/semantics.c (finish_switch_cond, finish_unary_op_expr): Likewise.
	* cp/typeck.c (type_after_usual_arithmetic_conversions): Likewise.
	(build_binary_op): Likewise.

	* f/com.c (ffecom_arrayref_): Use TYPE_UNSIGNED, not TREE_UNSIGNED.
	(ffecom_expr_): Likewise.

	* java/jcf-write.c (generate_bytecode_insns): Use TYPE_UNSIGNED.

	* treelang/treetree.c (tree_lang_signed_or_unsigned_type):
	Use TYPE_UNSIGNED, not TREE_UNSIGNED.

	* ada/decl.c (gnat_to_gnu_entity, make_type_from_size):
	Use TYPE_UNSIGNED, not TREE_UNSIGNED.
	* ada/trans.c (tree_transform, convert_with_check): Likewise.
	* ada/utils.c (gnat_signed_or_unsigned_type): Likewise.
	(build_vms_descriptor, unchecked_convert): Likewise.
	* ada/utils2.c (nonbinary_modular_operation): Likewise.

From-SVN: r80287
2004-03-31 22:50:43 -05:00
Fariborz Jahanian
0af5da7fb0 Reassociate multiply expression with an adjacent non-multiply expression.
Reviewed by Roger Sayle.

From-SVN: r80093
2004-03-30 20:00:23 +00:00
Roger Sayle
22e63bd346 fold-const.c (tree_expr_nonnegative_p): Handle BIT_XOR_EXPR like BIT_IOR_EXPR...
* fold-const.c (tree_expr_nonnegative_p): Handle BIT_XOR_EXPR like
	BIT_IOR_EXPR; A^B is nonnegative when A and B are nonnegative.

	* gcc.dg/compare8.c: Add an additional test for XOR.

From-SVN: r79979
2004-03-26 01:20:46 +00:00
Kaveh R. Ghazi
e19f6bded7 builtins.c (fold_builtin): Add new builtin optimizations for sqrt and/or cbrt.
* builtins.c (fold_builtin): Add new builtin optimizations for
	sqrt and/or cbrt.
	* fold-const.c (fold): Likewise.

testsuite:
	* gcc.dg/torture/builtin-explog-1.c: Add new cases.
	* gcc.dg/torture/builtin-math-1.c: Likewise.
	* builtin-power-1.c: New test.

From-SVN: r79959
2004-03-25 17:51:17 +00:00
Roger Sayle
b1500d001a fold-const.c (tree_expr_nonnegative_p): A&B is nonnegative when A is nonnegative or B is nonnegative.
* fold-const.c (tree_expr_nonnegative_p): A&B is nonnegative when
	A is nonnegative or B is nonnegative.  Similarly A|B is nonnegative
	when both A and B are nonnegative.
	(tree_expr_nonzero_p): A|B is nonzero when A is nonzero or B is
	nonzero.

From-SVN: r79870
2004-03-23 19:11:35 +00:00
Kazu Hirata
73b91357c9 fold-const.c (fold): Remove cases for INTEGER_CST...
* fold-const.c (fold): Remove cases for INTEGER_CST, REAL_CST,
	VECTOR_CST, STRING_CST, COMPLEX_CST, and CONSTRUCTOR.

From-SVN: r79862
2004-03-23 15:16:51 +00:00
Roger Sayle
bb3a37acf0 re PR rtl-optimization/14669 (Wrong code with -O for enum values expression E4 <= t && t <= E6)
2004-03-23  Kazu Hirata  <kazu@cs.umass.edu>

	PR optimization/14669
	* fold-const.c (fold): Only unwiden integer comparisons for equality
	or inequality operators, or when the signedness is the same.

	* g++.dg/opt/fold2.C: New test case.

From-SVN: r79859
2004-03-23 14:26:43 +00:00
Richard Kenner
6fce44af56 alias.c (get_alias_set): Remove handling of PLACEHOLDER_EXPR.
* alias.c (get_alias_set): Remove handling of PLACEHOLDER_EXPR.
	* emit-rtl.c (component_ref_for_mem_expr): Likewise.
	(set_mem_attributes_minus_bitpos): Call SUBSTITUTE_PLACEHOLDER_IN_EXPR.
	* explow.c (expr_size): Likewise.
	* expr.h (placeholder_list, find_placeholder): Deleted.
	* expr.c (store_constructor): Likewise.
	(get_inner_reference): Likewise.  Also don't call find_placeholder.
	(placeholder_list, find_placeholder): Deleted.
	(is_aligning_offset): Don't handle WITH_RECORD_EXPR, PLACEHOLDER_EXPR.
	(expand_expr_real, cases PLACEHOLDER_EXPR, WITH_RECORD_EXPR): Likewise.
	(highest_pow2_factor, case WITH_RECORD_EXPR): Remove.
	* dojump.c (do_jump, case WITH_RECORD_EXPR): Likewise.
	* dwarf2out.c (loc_descriptor_from_tree, case WITH_RECORD_EXPR):
	Likewise.
	* fold-const.c (invert_truthvalue, case WITH_RECORD_EXPR): Likewise.
	(extract_muldiv, case WITH_RECORD_EXPR): Likewise.
	* tree.c (expr_align, case WITH_RECORD_EXPR): Likewise.
	(contains_placeholder_p): Don't handle WITH_RECORD_EXPR.
	Clean up by using first_rtl_op.
	(substitute_in_expr): Use SUBSTITUTE_IN_EXPR for recursive call.
	(substitute_placeholder_in_expr): New function.
	* tree.def (WITH_RECORD_EXPR): Deleted.
	* tree.h (SUBSTITUTE_IN_EXPR, SUBSTITUTE_PLACEHOLDER_IN_EXPR): New.
	(substitute_placeholder_in_expr): New.

	* ada/decl.c (gnat_to_gnu_entity): Use SUBSTITUTE_PLACEHOLDER_IN_EXPR.
	* ada/trans.c (tree_transform, emit_index_check): Likewise.
	* ada/utils.c (build_template): Likewise.
	(max_size, convert): Remove handling of WITH_RECORD_EXPR.
	(maybe_unconstrained_array, unchecked_convert): Likewise.
	* ada/utils2.c (gnat_truthvalue_conversion, build_binary_op): Likewise.
	(build_unary_op): Likewise.
	(compare_arrays, build_allocator): Use SUBSTITUTE_PLACEHOLDER_IN_EXPR.
	(fill_vms_descriptor): Likewise.
	(build_call_alloc_dealloc): Likewise.
	ALIGN is unsigned.
	* ada/gigi.h (build_call_alloc_dealloc): Alignment is unsigned.

From-SVN: r79789
2004-03-21 13:09:20 -05:00
Kazu Hirata
05fe5c6724 * fold-const.c (fold): Replace "expr" with "t".
From-SVN: r79761
2004-03-20 22:12:17 +00:00
Kazu Hirata
079f946dad fold-const.c (fold): Replace "final_type" with "type".
* fold-const.c (fold): Replace "final_type" with "type".
	Remove variable "final_type".

From-SVN: r79754
2004-03-20 20:29:26 +00:00
Kazu Hirata
8d3784af8c fold-const.c (fold): Constify "type".
* fold-const.c (fold): Constify "type".
	Replace "TREE_TYPE (t)" with "type".

From-SVN: r79753
2004-03-20 20:23:33 +00:00
Kazu Hirata
ea993805e0 fold-const.c (fold): Replace "t" with "tem" where it is used as a temporary variable.
* fold-const.c (fold): Replace "t" with "tem" where it is used
	as a temporary variable.  Remove "orig_t" and all of its uses.

From-SVN: r79746
2004-03-20 15:00:31 +00:00
Kazu Hirata
8e7b3a43df fold-const.c (fold): Remove variable "invert".
* fold-const.c (fold): Remove variable "invert".
	Move the handling of relational expressions that can be folded
	to a constant ...
	(fold_relational_const): ... here.
	(tree_expr_nonzero_p): New.

From-SVN: r79745
2004-03-20 14:13:28 +00:00
Kazu Hirata
73c4ab99de fold-const.c (fold): Move the handling of constants ...
* fold-const.c (fold) <ABS_EXPR>: Move the handling of constants
	...
	(fold_abs_const): ... here.

From-SVN: r79709
2004-03-19 23:07:29 +00:00
Kazu Hirata
33d13fac08 fold-const.c (negate_expr): Move the handling of constants ...
* fold-const.c (negate_expr): Move the handling of constants
	...
	(fold_negate_const): ... here.

From-SVN: r79693
2004-03-19 18:25:55 +00:00
Mark Mitchell
cc785e1949 Fix stuff accidentally committed in previous patch
From-SVN: r79574
2004-03-17 05:30:55 +00:00
Mark Mitchell
88020bd8ea re PR c++/14481 (strange warning when assigning to bitfield)
PR c++/14481
	* fold-const.c (fold): Set TREE_NO_UNUSED_WARNING on implicitly
	generated COMPOUND_EXPRs.

	PR c++/14481
	* g++.dg/warn/Wunused-7.C: New test.

From-SVN: r79570
2004-03-17 04:33:28 +00:00
Roger Sayle
5785c7de74 fold-const.c (negate_expr, [...]): Replace calls via (*lang_hooks.foo) () with lang_hooks.foo ().
* fold-const.c (negate_expr, operand_equal_for_comparison_p,
	optimize_bit_field_compare, decode_field_reference, all_ones_mask_p,
	make_range, build_range_check, fold_range_test, unextend,
	constant_boolean_node, fold_binary_op_with_conditional_arg,
	fold_truthop, fold_mathfn_compare, fold_inf_compare,
	fold_single_bit_test, fold): Replace calls via (*lang_hooks.foo) ()
	with lang_hooks.foo ().

From-SVN: r79471
2004-03-14 01:07:16 +00:00
Roger Sayle
239a625ee8 fold-const.c (negate_expr_p): We can optimize -((int)X>>C) where C is an integer constant one bit less than...
* fold-const.c (negate_expr_p) <RSHIFT_EXPR>: We can optimize
	-((int)X>>C) where C is an integer constant one bit less than the
	size of X into (unsigned)X>>C.  Similarly for unsigned->signed.
	(negate_expr) <RSHIFT_EXPR>: Implement the above transformations.

	* simplify-rtx.c (simplify_unary_operation): Also implement the
	above transformations at the RTL level.

	* gcc.c-torture/execute/20040311-1.c: New test case.

From-SVN: r79334
2004-03-11 17:45:03 +00:00
Kaveh R. Ghazi
b45d3a3626 fold-const.c (tree_expr_nonnegative_p): Add more builtin cases.
* fold-const.c (tree_expr_nonnegative_p): Add more builtin cases.

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

From-SVN: r79269
2004-03-10 18:18:22 +00:00
Kaveh R. Ghazi
280e63ec66 fold-const.c (tree_expr_nonnegative_p): Reformat checks for builtins.
* fold-const.c (tree_expr_nonnegative_p): Reformat checks for
	builtins.

From-SVN: r79088
2004-03-08 01:55:44 +00:00
Roger Sayle
cd2f1c7a62 fold-const.c (fold): Fold x | x as x.
* fold-const.c (fold) <IOR_EXPR>: Fold x | x as x.
	<XOR_EXPR>: Fold x ^ x as zero.
	<AND_EXPR>: Fold x & x as x.

From-SVN: r79065
2004-03-07 20:13:50 +00:00
Roger Sayle
350f4ea897 fold-const.c (fold): Rewrite optimization to transform "foo++ == const" into "++foo == const+incr".
* fold-const.c (fold) <EQ_EXPR>: Rewrite optimization to transform
	"foo++ == const" into "++foo == const+incr".

	* gcc.c-torture/execute/20040307-1.c: New test case.

From-SVN: r79064
2004-03-07 14:45:42 +00:00
Kaveh R. Ghazi
82b4201fd5 tree.h (BUILTIN_EXP10_P, [...]): New macros.
* tree.h (BUILTIN_EXP10_P, BUILTIN_EXPONENT_P, BUILTIN_SQRT_P,
	BUILTIN_CBRT_P, BUILTIN_ROOT_P): New macros.

	* builtins.c (fold_builtin_logarithm, fold_builtin): Use new
	macros.
	* fold-const.c (fold_mathfn_compare, fold): Likewise.

From-SVN: r79023
2004-03-06 17:47:58 +00:00
Jeff Law
9bf793f935 fold-const.c (fold): An equality comparison of a non-weak object against zero has a known result.
* fold-const.c (fold): An equality comparison of a non-weak object
	against zero has a known result.  Similarly an equality comparison
	of the address of two non-weak, unaliased symbols has a known result.

	* ggc-page.c (struct page_entry): New field PREV.
	(ggc_alloc): Update PREV field appropriately.
	(sweep_pages): Likewise.
	(ggc_free): Likewise.  Use PREV field rather than loop to
	improve ggc_free performance.

cp/
	* init.c (build_vec_delete_1): Convert 2nd argument to NE_EXPR to
	the proper type.

From-SVN: r78713
2004-03-01 12:18:01 -07:00
Eric Botcazou
68a1a5da2b fold-const.c (fold): Strip NOPs that change the signedness for RSHIFT too.
* fold-const.c (fold): Strip NOPs that change the signedness
	for RSHIFT too.  Expand comment.

From-SVN: r78603
2004-02-28 07:33:10 +00:00
Eric Botcazou
288dc1eae2 fold-const.c (fold): Revert 2004-02-25 change.
* fold-const.c (fold): Revert 2004-02-25 change.  Use the original
	operands to build a tree with swapped operands.
	* expr.c (expand_expr_real) <MAX_EXPR>: Consistently use the
	'unsignedp' predicate to specify the signedness.

Co-Authored-By: Roger Sayle <roger@eyesopen.com>

From-SVN: r78558
2004-02-27 08:11:34 +00:00
Kazu Hirata
a110561799 c-decl.c, [...]: Fix comment typos and formatting.
* c-decl.c, c-ppoutput.c, combine.c, cppfiles.c, dwarf2out.c,
	expr.c, fold-const.c, gcc.c, haifa-sched.c, loop-iv.c,
	params.def, read-rtl.c, rtl.c, rtlanal.c, toplev.c: Fix
	comment typos and formatting.  Follow spelling conventions.

From-SVN: r78555
2004-02-27 07:09:43 +00:00
Eric Botcazou
81fbecace5 fold-const.c (fold): Treat MAX_EXPR and MIN_EXPR like comparisons with regard to signedness.
* fold-const.c (fold): Treat MAX_EXPR and MIN_EXPR like
	comparisons with regard to signedness.

From-SVN: r78441
2004-02-25 18:15:52 +00:00
Kazu Hirata
bee07d3f4f combine.c (SHIFT_COUNT_TRUNCATED): Remove.
* combine.c (SHIFT_COUNT_TRUNCATED): Remove.
	* defaults.h (SHIFT_COUNT_TRUNCATED): Provide the default.
	* expmed.c: Assume SHIFT_COUNT_TRUNCATED is always defined.
	* fold-const.c: Likewise.
	* simplify-rtx.c: Likewise.

From-SVN: r78230
2004-02-21 18:41:48 +00:00
Jeff Law
f46e5baad6 fold-const.c (invert_truthvalue): Do not call invert_tree_comparison for unordered comparison codes.
* fold-const.c (invert_truthvalue): Do not call invert_tree_comparison
        for unordered comparison codes.

From-SVN: r78103
2004-02-19 09:57:52 -07:00
Richard Henderson
875427f0e6 * fold-const.c (operand_equal_p): Fix VECTOR_CST comparison.
From-SVN: r77883
2004-02-16 03:59:49 -08:00
Paolo Bonzini
31cc608177 re PR middle-end/14092 (fold strips conversion from pointer to integer)
PR c/14092
* gcc.dg/pr14092-1.c: New testcase.
* fold-const.c (fold) <NEGATE_EXPR>: Convert result of
negate_expr back to the original type.

From-SVN: r77602
2004-02-10 13:41:16 +00:00
Roger Sayle
b83c403610 fold-const.c (fold): Use the original type conversion tree code rather than call fold_convert...
* fold-const.c (fold) <NOP_EXPR>: Use the original type conversion
	tree code rather than call fold_convert, which doesn't specify a
	default floating point to integer conversion.

	* gcc.c-torture/compile/20040209-1.c: New test case.

From-SVN: r77535
2004-02-09 14:00:36 +00:00
Roger Sayle
088414c122 re PR middle-end/13696 (enum not useable as array index?)
PR middle-end/13696
	* fold-const.c (fold_convert): New function to provide type
	conversion to the middle-end without using convert.
	(negate_expr, associate_trees, size_diffop, omit_one_operand,
	operand_equal_for_comparison_p, pedantic_omit_one_operand,
	invert_truthvalue, optimize_bit_field_compare, range_binop,
	decode_field_reference, make_range, build_range_check, unextend,
	fold_truthop, extract_muldiv_1, fold_mathfn_compare,
	fold_binary_op_with_conditional_arg, fold_inf_compare,
	fold_single_bit_test, fold, multiple_of_p): Replace all calls to
	convert with calls to fold_convert.

	* g++.dg/opt/fold1.C: New test case.

From-SVN: r77464
2004-02-07 18:57:35 +00:00
Roger Sayle
dfb36f9be2 fold-const.c (negate_expr_p, [...]): Optimize -(A+B) into either (-A)-B or (-B)-A...
* fold-const.c (negate_expr_p, negate_expr): Optimize -(A+B) into
	either (-A)-B or (-B)-A, if A or B is easily negated respectively.
	(fold) <MINUS_EXPR>: Optimize (A*C) - (B*C) -> (A-B)*C for both
	integer types and floating point with unsafe_math_optimizations.
	Add similar optimization for (A*C1) - (A*C2) -> A*(C1-C2).
	Optimize A - B as A + (-B), if B is easily negated.

From-SVN: r77453
2004-02-07 15:35:40 +00:00
Jeff Law
3168cb9927 tree.c (commutative_tree_code, [...]): New functions.
* tree.c (commutative_tree_code, associative_tree_code): New
	functions.
	(iterative_hash_expr): Use commutative_tree_code.
	* tree.h (commutative_tree_code, associative_tree_code): Declare.
	* fold-const.c (operand_equal_p): Use commutative_tree_code
	rather than inlining the commutativity check.
	(fold): Likewise.

Co-Authored-By: Roger Sayle <roger@eyesopen.com>

From-SVN: r77152
2004-02-03 03:03:43 +00:00
Eric Botcazou
0a944ef648 fold-const.c (fold_binary_op_with_conditional_arg): Only build a COMPOUND_EXPR if 'arg' is really a SAVE_EXPR.
* fold-const.c (fold_binary_op_with_conditional_arg): Only
	build a COMPOUND_EXPR if 'arg' is really a SAVE_EXPR.

Co-Authored-By: Olivier Hainque <hainque@act-europe.fr>

From-SVN: r76434
2004-01-23 16:52:07 +00:00
Roger Sayle
fdb33708b4 fold-const.c (fold_convert): Rename to fold_convert_const.
* fold-const.c (fold_convert): Rename to fold_convert_const.
	(fold_convert_const): Change arguments to take a tree_code,
	a type and the operand/expression to be converted.  Return
	NULL_TREE if no simplification is possible.  Add support for
	FIX_CEIL_EXPR and FIX_FLOOR_EXPR in addition to FIX_TRUNC_EXPR.
	(fold): Handle FIX_CEIL_EXPR and FIX_FLOOR_EXPR.
	Adjust call to fold_convert to match new fold_convert_const.
	Avoid modifying the tree passed to fold in-place.

From-SVN: r76237
2004-01-20 22:59:59 +00:00
Joseph Myers
53cd18ec8e c-decl.c (c_init_decl_processing): Set pedantic_lvalues to true unconditionally.
* c-decl.c (c_init_decl_processing): Set pedantic_lvalues to
	true unconditionally.
	* c-typeck.c (unary_complex_lvalue, pedantic_lvalue_warning):
	Remove.
	(build_unary_op, build_modify_expr): Don't handle extended
	lvalues.
	(build_component_ref, build_conditional_expr): Call non_lvalue
	instead of pedantic_non_lvalue.
	(build_c_cast): Don't condition use of non_lvalue on pedantic.
	* fold-const.c (fold): Don't check pedantic directly for
	COMPOUND_EXPR.  Ensure that results for COMPOUND_EXPR are
	passed to pedantic_non_lvalue.
	* doc/extend.texi: Remove documentation of extended lvalues.

testsuite:
	* gcc.c-torture/compile/981022-1.c: Remove.
	* gcc.dg/array-5.c: Remove XFAIL.
	* gcc.dg/sequence-pt-1.c: Remove test using extended lvalues.
	* gcc.dg/cast-lvalue-1.c, gcc.dg/compound-lvalue-1.c,
	gcc.dg/cond-lvalue-1.c: Update.
	* gcc.dg/cast-lvalue-2.c: New test.

From-SVN: r76192
2004-01-20 01:38:27 +00:00
Kazu Hirata
e0a21ab90e c-common.h: Fix comment formatting.
* c-common.h: Fix comment formatting.
	* c-cppbuiltin.c: Likewise.
	* c-pragma.c: Likewise.
	* calls.c: Likewise.
	* collect2.c: Likewise.
	* cppcharset.c: Likewise.
	* cpptrad.c: Likewise.
	* dbxout.c: Likewise.
	* defaults.h: Likewise.
	* dwarf2out.c: Likewise.
	* fold-const.c: Likewise.
	* genautomata.c: Likewise.
	* genconditions.c: Likewise.
	* genflags.c: Likewise.
	* gengtype.c: Likewise.
	* integrate.c: Likewise.
	* loop.c: Likewise.
	* predict.c: Likewise.
	* sdbout.c: Likewise.

From-SVN: r75957
2004-01-16 01:44:06 +00:00
Kazu Hirata
5d3cc25206 alias.c: Fix comment typos.
* alias.c: Fix comment typos.
	* builtins.c: Likewise.
	* cfg.c: Likewise.
	* df.c: Likewise.
	* dominance.c: Likewise.
	* dwarf2out.c: Likewise.
	* emit-rtl.c: Likewise.
	* expr.c: Likewise.
	* final.c: Likewise.
	* fold-const.c: Likewise.
	* gcse.c: Likewise.
	* genattrtab.c: Likewise.
	* genrecog.c: Likewise.
	* gensupport.c: Likewise.
	* ggc-zone.c: Likewise.
	* integrate.c: Likewise.
	* local-alloc.c: Likewise.
	* loop.c: Likewise.
	* recog.c: Likewise.
	* regmove.c: Likewise.
	* reg-stack.c: Likewise.
	* reorg.c: Likewise.
	* rtlanal.c: Likewise.
	* rtl.h: Likewise.
	* sched-ebb.c: Likewise.
	* simplify-rtx.c: Likewise.
	* toplev.c: Likewise.
	* varasm.c: Likewise.

From-SVN: r75475
2004-01-06 16:51:21 +00:00
Roger Sayle
8bc6369b8b fold-const.c (fold): Don't require strict type equality...
* fold-const.c (fold) <COND_EXPR>: Don't require strict type
	equality, instead just prevent replacing a COND_EXPR of non-void
	type by one of its operands of void type.

From-SVN: r75239
2003-12-30 17:21:54 +00:00
Roger Sayle
b66906a8ff re PR fortran/12632 ([g77 only] -fbounds-check ICE)
PR fortran/12632
	* fold-const.c (fold) <COND_EXPR>: Don't fold a constant condition,
	if the type of the selected branch doesn't match its' parent.

	* com.c (ffecom_subscript_check_): Take as an extra argument the
	(possibly NULL) decl of the array.  Don't create unnecessary tree
	nodes if the array index is known to be safe at compile-time.
	If the array index is unsafe, force the array decl into memory to
	avoid RTL expansion problems.
	(ffecom_array_ref_): Update calls to ffecom_subscript_check_.
	(ffecom_char_args_x_): Likewise.

	* g77.dg/12632.f: New test case.

From-SVN: r75203
2003-12-29 16:16:39 +00:00
Kazu Hirata
020036b90e expr.c (check_max_integer_computation_mode): Remove.
* expr.c (check_max_integer_computation_mode): Remove.
	* dojump.c (do_jump): Don't use MAX_INTEGER_COMPUTATION_MODE.
	* fold-const.c (fold): Likewise.
	* system.h (MAX_INTEGER_COMPUTATION_MODE): Poison.
	* doc/tm.texi (MAX_INTEGER_COMPUTATION_MODE): Remove.

From-SVN: r74868
2003-12-20 01:40:41 +00:00
Jan Hubicka
0ba646fe67 fold-const.c (fold): Do not return early when optimizing COMPONENT_REF and constant.
* fold-const.c (fold):  Do not return early when optimizing COMPONENT_REF
	and constant.

From-SVN: r73870
2003-11-24 00:50:31 +00:00