Commit Graph

74 Commits

Author SHA1 Message Date
Richard Guenther
e021c122e5 re PR middle-end/50890 (ICE in fold_convert_loc, at fold-const.c:1894)
2010-11-02  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/50890
	* gimple.h (gimple_fold_call): Remove.
	* gimple-fold.c (fold_stmt_1): Move all call related code to ...
	(gimple_fold_call): ... here.  Make static.  Update the
	cannot-inline flag on direct calls.
	* ipa-inline.c (early_inliner): Copy the cannot-inline flag
	from the statements to the edges.

	* gcc.dg/torture/pr50890.c: New testcase.

From-SVN: r180763
2011-11-02 08:46:08 +00:00
Richard Guenther
e256dfce35 re PR tree-optimization/50768 (ICE: in execute_todo, at passes.c:1731 with -O2 -ftracer)
2011-10-19  Richard Guenther  <rguenther@suse.de>

	PR middle-end/50768
	* gimple-fold.c (gimplify_and_update_call_from_tree): Rewrite.

	* gcc.dg/torture/pr50768.c: New testcase.

From-SVN: r180187
2011-10-19 12:59:21 +00:00
Richard Guenther
a24ac4609a re PR tree-optimization/50389 (ICE: in execute_todo, at passes.c:1730 with -O -freorder-blocks -ftracer and __builtin___memcpy_chk())
2011-10-10  Richard Guenther  <rguenther@suse.de>

	PR middle-end/50389
	* gimple-fold.c (gimplify_and_update_call_from_tree): Do not
	mark symbols for renaming.  Append the VUSE to all statements
	that possibly can have one.

	* gcc.dg/torture/pr50389.c: New testcase.

From-SVN: r179757
2011-10-10 15:45:53 +00:00
Jakub Jelinek
e7f9dae09c tree.h (avoid_folding_inline_builtin): New prototype.
* tree.h (avoid_folding_inline_builtin): New prototype.
	* builtins.c (avoid_folding_inline_builtin): No longer static.
	* gimple-fold.c (gimple_fold_builtin): Give up if
	avoid_folding_inline_builtin returns true.

From-SVN: r179614
2011-10-06 16:34:48 +02:00
Richard Guenther
d3878abfcc gimple-fold.c (gimple_fold_stmt_to_constant_1): For ternary ops with an embedded expression valueize and fold that as well.
2011-10-05  Richard Guenther  <rguenther@suse.de>

	* gimple-fold.c (gimple_fold_stmt_to_constant_1): For
	ternary ops with an embedded expression valueize and fold
	that as well.
	* tree-ssa-sccvn.c (try_to_simplify): Also allow SSA name
	results from gimple_fold_stmt_to_constant_1.

From-SVN: r179543
2011-10-05 10:54:14 +00:00
Richard Guenther
eb8f1123d9 re PR middle-end/50609 (FAIL: gcc.c-torture/execute/pr23135.c compilation, -O2 -flto (ICE))
2011-10-05  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/50609
	* gimple-fold.c (fold_array_ctor_reference): Also handle
	vector typed constructors.
	(fold_ctor_reference): Dispatch to fold_array_ctor_reference
	for vector typed constructors.

From-SVN: r179540
2011-10-05 09:31:40 +00:00
Jakub Jelinek
383841506e re PR inline-asm/50571 (Undesirable folding in "m" constrained asm operands)
PR inline-asm/50571
	* gimple-fold.c (fold_stmt_1) <case GIMPLE_ASM>: If
	input constraints allow mem and not reg, pass true instead of
	false as second argument to maybe_fold_reference.

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

From-SVN: r179389
2011-09-30 17:01:27 +02:00
Jakub Jelinek
2186081438 gimple-fold.c (gimplify_and_update_call_from_tree): Set gctx.into_ssa after push_gimplify_context.
* gimple-fold.c (gimplify_and_update_call_from_tree): Set
	gctx.into_ssa after push_gimplify_context.

	* gimple.c (gimple_build_call_valist): New function.
	* gimple.h (gimple_build_call_valist): New prototype.
	* tree-ssa-propagate.c (finish_update_gimple_call): New function.
	(update_gimple_call): Likewise.
	(update_call_from_tree): Use finish_update_gimple_call.
	* tree-ssa-propagate.h (update_gimple_call): New prototype.

From-SVN: r179204
2011-09-26 18:19:55 +02:00
Richard Guenther
f8a7df4594 re PR tree-optimization/50472 (Volatile qualification in data is not enough to avoid optimization over pointer to data)
2011-09-26  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/50472
	* gimple-fold.c (fold_const_aggregate_ref_1): Do not fold
	volatile references.

	* gcc.dg/torture/pr50472.c: New testcase.

From-SVN: r179196
2011-09-26 12:58:35 +00:00
Jan Hubicka
5548ca3540 re PR lto/50430 (Constructors of static external vars are throwed away leading to missed optimizations (and ipa-cp ICE).)
PR lto/50430
	* gimple-fold.c (gimple_get_virt_method_for_binfo): Do not ICE on
	error_mark_node in the DECL_INITIAL of vtable.

From-SVN: r178908
2011-09-16 14:40:06 +00:00
Richard Guenther
59401b92b3 gimple.h (fold_stmt_inplace): Adjust to take a gimple_stmt_iterator instead of a statement.
2011-09-09  Richard Guenther  <rguenther@suse.de>

	* gimple.h (fold_stmt_inplace): Adjust to take a gimple_stmt_iterator
	instead of a statement.
	* gimple-fold.c (fold_stmt_inplace): Likewise.
	* sese.c (graphite_copy_stmts_from_block): Adjust.
	* tree-ssa-dom.c (propagate_rhs_into_lhs): Likewise.
	* tree-ssa-forwprop.c (forward_propagate_into_comparison): Use
	fold_stmt.
	(forward_propagate_addr_into_variable_array_index): Likewise.
	(forward_propagate_addr_expr_1): adjust.
	(associate_plusminus): Likewise.
	(ssa_forward_propagate_and_combine): Likewise.
	* tree-ssa-mathopts.c (replace_reciprocal): Adjust.
	(execute_cse_reciprocals): Likewise.
	* tree-ssa.c (insert_debug_temp_for_var_def): Adjust.

From-SVN: r178726
2011-09-09 11:52:51 +00:00
Martin Jambor
81fa35bd59 cgraph.h (cgraph_indirect_call_info): Removed field thunk_delta.
2011-09-02  Martin Jambor  <mjambor@suse.cz>

	* cgraph.h (cgraph_indirect_call_info): Removed field thunk_delta.
	* gimple-fold.c (gimple_get_virt_method_for_binfo): Rewritten to use
	BINFO_VTABLE.  Parameter delta removed, all callers updated.
	* tree.c (free_lang_data_in_binfo): Clear BINFO_VIRTUALs instead
	BINFO_VTABLE.
	* cgraph.c (cgraph_make_edge_direct): Removed parameter delta, updated
	all calls.
	* cgraphunit.c (cgraph_redirect_edge_call_stmt_to_callee): Removed
	handling of thunk_delta.
	* ipa-cp.c (get_indirect_edge_target): Removed parameter delta.
	(devirtualization_time_bonus): Do not handle thunk deltas.
	(ipcp_discover_new_direct_edges): Likewise.
	* ipa-prop.c (ipa_make_edge_direct_to_target): Likewise.
	(try_make_edge_direct_simple_call): Likewise.
	(try_make_edge_direct_virtual_call): Likewise.
	* lto-cgraph.c (output_cgraph_opt_summary_p): Likewise.  Mark
	parameter set as unused.
	(output_edge_opt_summary): Likewise.  Mark both parameters as unused.
	* lto-cgraph.c (output_cgraph_opt_summary_p): Likewise.  Mark
	parameter set as unused.
	(output_edge_opt_summary): Likewise.  Mark both parameters as unused.
	(input_edge_opt_summary): Likewise.
	* lto-streamer-out.c (lto_output_ts_binfo_tree_pointers): Do not stream
	BINFO_VIRTUALS at all.
	* lto-streamer-in.c (lto_input_ts_binfo_tree_pointers): Likewise.

	* testsuite/g++.dg/ipa/devirt-3.C: Added a distraction method.
	* testsuite/g++.dg/ipa/ivinline-7.C: Added a test for direct call
	discovery, xfailed test for inlining.
	* testsuite/g++.dg/ipa/ivinline-9.C: Likewise.

From-SVN: r178472
2011-09-02 15:26:30 +02:00
Richard Guenther
4e71066d7e expr.c (expand_expr_real_2): Move COND_EXPR and VEC_COND_EXPR handling here, from ...
2011-08-31  Richard Guenther  <rguenther@suse.de>

	* expr.c (expand_expr_real_2): Move COND_EXPR and VEC_COND_EXPR
	handling here, from ...
	(expand_expr_real_1): ... here.
	* gimple-pretty-print.c (dump_ternary_rhs): Handle COND_EXPR
	and VEC_COND_EXPR.
	* gimple.c (gimple_rhs_class_table): Make COND_EXPR and VEC_COND_EXPR
	a GIMPLE_TERNARY_RHS.
	* tree-cfg.c (verify_gimple_assign_ternary): Handle COND_EXPR
	and VEC_COND_EXPR here ...
	(verify_gimple_assign_single): ... not here.
	* gimple-fold.c (fold_gimple_assign): Move COND_EXPR folding.
	* tree-object-size.c (cond_expr_object_size): Adjust.
	(collect_object_sizes_for): Likewise.
	* tree-scalar-evolution.c (interpret_expr): Don't handle
	ternary RHSs.
	* tree-ssa-forwprop.c (forward_propagate_into_cond): Fix and
	simplify.
	(ssa_forward_propagate_and_combine): Adjust.
	* tree-ssa-loop-im.c (move_computations_stmt): Build the COND_EXPR
	as ternary.
	* tree-ssa-threadedge.c (fold_assignment_stmt): Adjust.
	* tree-vect-loop.c (vect_is_simple_reduction_1): Likewise.
	* tree-vect-stmt.c (vectorizable_condition): Likewise.
	* tree-vrp.c (extract_range_from_cond_expr): Likewise.
	(extract_range_from_assignment): Likewise.

From-SVN: r178408
2011-09-01 11:46:08 +00:00
Richard Guenther
315f5f1bfb re PR tree-optimization/48571 (Missed data-dependence for (bogus?) reconstructed array-refs)
2011-08-30  Richard Guenther  <rguenther@suse.de>

	PR middle-end/48571
	* gimple.h (maybe_fold_offset_to_address): Remove.
	(maybe_fold_offset_to_reference): Likewise.
	(maybe_fold_stmt_addition): Likewise.
	(may_propagate_address_into_dereference): Likewise.
	* tree-inline.c (remap_gimple_op_r): Do not reconstruct
	array references.
	* gimple-fold.c (canonicalize_constructor_val): Likewise.
	Canonicalize invariant POINTER_PLUS_EXPRs to invariant MEM_REF
	addresses instead.
	(may_propagate_address_into_dereference): Remove.
	(maybe_fold_offset_to_array_ref): Likewise.
	(maybe_fold_offset_to_reference): Likewise.
	(maybe_fold_offset_to_address): Likewise.
	(maybe_fold_stmt_addition): Likewise.
	(fold_gimple_assign): Do not reconstruct array references but
	instead canonicalize invariant POINTER_PLUS_EXPRs to invariant
	MEM_REF addresses.
	(gimple_fold_stmt_to_constant_1): Likewise.
	* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Likewise.
	* gimplify.c (gimplify_conversion): Likewise.
	(gimplify_expr): Likewise.

	* gcc.c-torture/execute/pr48571-1.c: New testcase.
	* gcc.dg/tree-ssa/ssa-ccp-25.c: Remove.
	* gcc.dg/tree-ssa/ssa-ccp-26.c: Likewise.
	* gcc.dg/pr36902.c: XFAIL.

From-SVN: r178312
2011-08-30 14:06:00 +00:00
Richard Guenther
4d59a001d3 gimple-fold.c (gimple_fold_stmt_to_constant_1): Set a location on the built ADDR_EXPR.
2011-08-29  Richard Guenther  <rguenther@suse.de>

	* gimple-fold.c (gimple_fold_stmt_to_constant_1): Set a location
	on the built ADDR_EXPR.

From-SVN: r178172
2011-08-29 09:03:41 +00:00
Richard Guenther
0d82a1c872 tree.h (convert_to_ptrofftype_loc): New function.
2011-08-17  Richard Guenther  <rguenther@suse.de>

	* tree.h (convert_to_ptrofftype_loc): New function.
	(convert_to_ptrofftype): Define.
	* builtins.c (expand_builtin_bzero): Use size_type_node.
	(fold_builtin_bzero): Likewise.
	(std_gimplify_va_arg_expr): Build the BIT_AND_EXPR on the pointer.
	* c-typeck.c (build_unary_op): Use convert_to_ptrofftype_loc.
	* cgraphunit.c (thunk_adjust): Use fold_build_pointer_plus_loc.
	(cgraph_redirect_edge_call_stmt_to_callee): Use size_int.
	* expr.c (expand_expr_addr_expr_1): Use fold_build_pointer_plus.
	* fold-const.c (build_range_check): Negate using the original
	type.
	(fold_unary_loc): Use fold_build_pointer_plus_loc.
	* gimple-fold.c (gimple_adjust_this_by_delta): Use
	convert_to_ptrofftype.
	* gimplify.c (gimplify_self_mod_expr): Likewise.
	* graphite-clast-to-gimple.c (clast_to_gcc_expression): Likewise.
	(graphite_create_new_loop_guard): Likewise.
	* graphite-sese-to-poly.c (my_long_long): Remove.
	(scop_ivs_can_be_represented): Adjust.
	* tree-cfg.c (verify_gimple_assign_unary): Use ptrofftype_p.
	* tree-chrec.c (chrec_fold_plus_1): Use fold_build_pointer_plus.
	* tree-loop-distribution.c (build_size_arg_loc): Use
	size_type_node.
	(generate_memset_zero): Simplify.
	* tree-mudflap.c: Use fold_convert, not convert.
	* tree-predcom.c (suitable_reference_p): Expand DR_OFFSET in
	its own type.
	(determine_offset): Likewise for DR_STEP.
	(valid_initializer_p): Likewise.
	* tree-profile.c (prepare_instrumented_value): Convert the pointer
	to an integer type of same size.
	* tree-scalar-evolution.c (interpret_rhs_expr): Do not refer
	to sizetype without need.
	* tree-ssa-address.c (tree_mem_ref_addr): Likewise.
	* tree-ssa-loop-ivopts.c (find_bivs): Use convert_to_ptrofftype.
	* tree-ssa-loop-manip.c (create_iv): Likewise.
	(determine_exit_conditions): Adjust comment.
	* tree-ssa-pre.c (create_expression_by_pieces): Use
	convert_to_ptrofftype.
	* tree-ssa-structalias.c (get_constraint_for_1): Likewise.
	* varasm.c (array_size_for_constructor): Compute using double_ints.

From-SVN: r177828
2011-08-17 12:00:35 +00:00
Kai Tietz
9b80d091af gimple.c (canonicalize_cond_expr_cond): Handle cast from boolean-type.
* gimple.c (canonicalize_cond_expr_cond): Handle cast from
	boolean-type.
	(ssa_forward_propagate_and_combine): Interprete result of
	forward_propagate_comparison.
	* gcc/gimple-fold.c (fold_gimple_assign): Add canonicalization for
	boolean-typed operands for comparisons.

	* gcc.dg/tree-ssa/forwprop-15.c: New testcase.

From-SVN: r177170
2011-08-02 16:55:47 +02:00
Kai Tietz
eb9820c0a3 gimple-fold.c (or_comparisons_1): Remove TRUTH_AND/OR expression handling.
2011-07-27  Kai Tietz  <ktietz@redhat.com>

        * gimple-fold.c (or_comparisons_1): Remove TRUTH_AND/OR
        expression handling.
        (and_var_with_comparison_1): Likewise.

From-SVN: r176827
2011-07-27 16:59:40 +02:00
Jakub Jelinek
b8b2b0094a re PR tree-optimization/49768 (C99 style union initializations does not work as expected with optimizations)
PR tree-optimization/49768
	* gimple-fold.c (fold_nonarray_ctor_reference): Return NULL
	if offset is smaller than bitoffset, but offset+size is bigger
	than bitoffset.

	* gcc.c-torture/execute/pr49768.c: New test.

From-SVN: r176437
2011-07-19 11:24:28 +02:00
Richard Guenther
5fbcc0ed20 gimple-fold.c (fold_gimple_assign): Remove operand swapping.
2011-07-14  Richard Guenther  <rguenther@suse.de>

	* gimple-fold.c (fold_gimple_assign): Remove operand swapping.
	(fold_stmt_1): Do it here directly on gimple and as a first thing.

From-SVN: r176273
2011-07-14 14:21:07 +00:00
Jan Hubicka
f1724940a9 ipa-cp.c (ipcp_process_devirtualization_opportunities): Update call of gimple_get_virt_method_for_binfo.
* ipa-cp.c (ipcp_process_devirtualization_opportunities):
	Update call of gimple_get_virt_method_for_binfo.
	* gimple-fold.c (gimple_get_virt_method_for_binfo): Remove
	refuse_thunks parameter.
	(gimple_fold_call): Update.
	* ipa-prop.c (try_make_edge_direct_virtual_call): Update.

From-SVN: r174905
2011-06-10 13:24:30 +00:00
Bill Schmidt
06bc3ec790 re PR tree-optimization/46728 (GCC does not generate fmadd for pow (x, 0.75)+y on powerpc)
2011-06-07  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

	PR tree-optimization/46728
	* tree-ssa-math-opts.c (gimple_expand_builtin_pow): Change FIXME
	to use gimple_val_nonnegative_real_p.
	* gimple-fold.c (gimple_val_nonnegative_real_p): New function.
	* gimple.h (gimple_val_nonnegative_real_p): New declaration.

From-SVN: r174752
2011-06-07 15:12:04 +00:00
Jakub Jelinek
a9d245448f re PR c++/49264 (Internal compiler error: segmentation fault)
PR c++/49264
	* gimple-fold.c (fold_stmt_1): Don't try to fold *& on the lhs
	if stmt folded into nothing.
	* tree-inline.c (fold_marked_statements): If a builtin at the
	end of a bb folded into nothing, just update cgraph edges
	and move to next bb.
	* cgraph.c (cgraph_update_edges_for_call_stmt_node): Allow new_stmt
	to be NULL.  Don't compute count and frequency if new_call is NULL.

	* g++.dg/opt/pr49264.C: New test.

From-SVN: r174711
2011-06-06 19:12:25 +02:00
Jakub Jelinek
0e8b84ec02 re PR bootstrap/49086 (libgomp/task.c:79:1: internal compiler error: Segmentation fault)
PR bootstrap/49086
	* gimple-fold.c (and_comparisons_1, or_comparisons_1): Return NULL
	for PHI args that are SSA_NAME_IS_DEFAULT_DEF.

From-SVN: r173967
2011-05-20 20:22:49 +02:00
Jakub Jelinek
6c66f73369 re PR tree-optimization/49073 (g++ optimizer breaks do-while code)
PR tree-optimization/49073
	* gimple-fold.c (and_comparisons_1, or_comparisons_1): Return
	NULL if PHI argument is SSA_NAME, whose def_stmt is dominated
	by the PHI.
	* tree-ssa-ifcombine.c (tree_ssa_ifcombine): Calculate dominators.

	* gcc.c-torture/execute/pr49073.c: New test.

From-SVN: r173948
2011-05-20 16:19:05 +02:00
Richard Guenther
d35936ab70 tree.h (int_const_binop): Remove notrunc argument.
2011-05-04  Richard Guenther  <rguenther@suse.de>

	* tree.h (int_const_binop): Remove notrunc argument.
	* fold-const.c (int_const_binop): Remove notrunc argument.  Always
	create integer constants that are properly truncated.
	(extract_muldiv_1): Expand one notrunc int_const_binop caller.
	(const_binop): Remove zero notrunc argument to int_const_binop.
	(size_binop_loc): Likewise.
	(fold_div_compare): Likewise.
	(maybe_canonicalize_comparison_1): Likewise.
	(fold_comparison): Likewise.
	(fold_binary_loc): Likewise.
	(multiple_of_p): Likewise.
	* expr.c (store_constructor): Likewise.
	* gimple-fold.c (maybe_fold_offset_to_array_ref): Likewise.
	(maybe_fold_stmt_addition): Likewise.
	* ipa-prop.c (ipa_modify_call_arguments): Likewise.
	* stor-layout.c (layout_type): Likewise.
	* tree-data-ref.c (tree_fold_divides_p): Likewise.
	* tree-sra.c (build_ref_for_offset): Likewise.
	(build_user_friendly_ref_for_offset): Likewise.
	* tree-ssa-address.c (maybe_fold_tmr): Likewise.
	* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Likewise.
	* tree-ssa-loop-niter.c (inverse): Likewise.
	* tree-ssa-pre.c (create_component_ref_by_pieces_1): Likewise.
	* tree-ssa.c (maybe_rewrite_mem_ref_base): Likewise.
	* tree-switch-conversion.c (check_range): Likewise.
	(build_constructors): Likewise.
	* tree-vect-generic.c (expand_vector_piecewise): Likewise.
	* tree-vrp.c (set_and_canonicalize_value_range): Likewise.
	(extract_range_from_assert): Likewise.
	(vrp_int_const_binop): Likewise.
	(extract_range_from_binary_expr): Likewise.
	(extract_range_from_unary_expr): Likewise.
	(check_array_ref): Likewise.
	(find_case_label_range): Likewise.
	(simplify_div_or_mod_using_ranges): Likewise.
	* tree-cfg.c (group_case_labels_stmt): Use double-ints for
	comparing case labels for merging.


	ada/
	* gcc-interface/trans.c (gnat_to_gnu): Remove zero notrunc argument to
	int_const_binop.
	(pos_to_constructor): Likewise.

	fortran/
	* trans-types.c (gfc_get_array_type_bounds): Remove zero notrunc
	argument to int_const_binop.

From-SVN: r173356
2011-05-04 09:04:53 +00:00
Richard Sandiford
25583c4f45 Makefile.in (INTERNAL_FN_DEF, [...]): Define.
gcc/
	* Makefile.in (INTERNAL_FN_DEF, INTERNAL_FN_H): Define.
	(GIMPLE_H): Include $(INTERNAL_FN_H).
	(OBJS-common): Add internal-fn.o.
	(internal-fn.o): New rule.
	* internal-fn.def: New file.
	* internal-fn.h: Likewise.
	* internal-fn.c: Likewise.
	* gimple.h: Include internal-fn.h.
	(GF_CALL_INTERNAL): New gf_mask.
	(gimple_statement_call): Put fntype into a union with a new
	internal_fn field.
	(gimple_build_call_internal): Declare.
	(gimple_build_call_internal_vec): Likewise.
	(gimple_call_same_target_p): Likewise.
	(gimple_call_internal_p): New function.
	(gimple_call_internal_fn): Likewise.
	(gimple_call_fntype): Return null for internal calls.
	(gimple_call_set_fntype): Assert that the function is not internal.
	(gimple_call_set_fn): Likewise.
	(gimple_call_set_fndecl): Likewise.
	(gimple_call_set_internal_fn): New function.
	(gimple_call_addr_fndecl): Handle null functions.
	(gimple_call_return_type): Likewise null types.
	* gimple.c (gimple_build_call_internal_1): New function.
	(gimple_build_call_internal): Likewise.
	(gimple_build_call_internal_vec): Likewise.
	(gimple_call_same_target_p): Likewise.
	(gimple_call_flags): Handle calls to internal functions.
	(gimple_call_fnspec): New function.
	(gimple_call_arg_flags, gimple_call_return_flags): Use it.
	(gimple_has_side_effects): Handle null functions.
	(gimple_rhs_has_side_effects): Likewise.
	(gimple_call_copy_skip_args): Handle calls to internal functions.
	* cfgexpand.c (expand_call_stmt): Likewise.
	* expr.c (expand_expr_real_1): Assert that the call isn't internal.
	* gimple-fold.c (gimple_fold_call): Handle null functions.
	(gimple_fold_stmt_to_constant_1): Don't fold
	calls to internal functions.
	* gimple-low.c (gimple_check_call_args): Handle calls to internal
	functions.
	* gimple-pretty-print.c (dump_gimple_call): Likewise.
	* ipa-prop.c (ipa_analyze_call_uses): Handle null functions.
	* tree-cfg.c (verify_gimple_call): Handle calls to internal functions.
	(do_warn_unused_result): Likewise.
	* tree-eh.c (same_handler_p): Use gimple_call_same_target_p.
	* tree-ssa-ccp.c (ccp_fold_stmt): Handle calls to internal functions.
	* tree-ssa-dom.c (hashable_expr): Use the gimple statement to record
	the target of a call.
	(initialize_hash_element): Update accordingly.
	(hashable_expr_equal_p): Use gimple_call_same_target_p.
	(iterative_hash_hashable_expr): Handle calls to internal functions.
	(print_expr_hash_elt): Likewise.
	* tree-ssa-pre.c (can_value_number_call): Likewise.
	(eliminate): Handle null functions.
	* tree-ssa-sccvn.c (visit_use): Handle calls to internal functions.
	* tree-ssa-structalias.c (get_fi_for_callee): Likewise.
	(find_func_aliases): Likewise.
	* value-prof.c (gimple_ic_transform): Likewise.
	(gimple_indirect_call_to_profile): Likewise.
	* lto-streamer-in.c (input_gimple_stmt): Likewise.
	* lto-streamer-out.c (output_gimple_stmt): Likewise.

From-SVN: r172758
2011-04-20 08:21:25 +00:00
Martin Jambor
49c471e3d8 ipa-cp.c (ipcp_process_devirtualization_opportunities): Devirtualize also according to actual contants.
2011-04-19  Martin Jambor  <mjambor@suse.cz>

	* ipa-cp.c (ipcp_process_devirtualization_opportunities): Devirtualize
	also according to actual contants.
	* gimple-fold.c (gimple_extract_devirt_binfo_from_cst): New function.
	(gimple_fold_call): Use it.
	* gimple.h (gimple_extract_devirt_binfo_from_cst): Declare.

	* testsuite/g++.dg/opt/devirt1.C: Bump to -O2, remove XFAIL.
	* testsuite/g++.dg/opt/devirt2.C: New test.
	* testsuite/g++.dg/ipa/devirt-g-1.C: Likewise.

From-SVN: r172719
2011-04-19 18:35:33 +02:00
Jakub Jelinek
848257079a re PR middle-end/48661 (wrong-code regression with devirtualization)
PR middle-end/48661
	* gimple-fold.c (gimple_get_virt_method_for_binfo): Return NULL
	if TREE_TYPE (v) is non-NULL.

	* gimple-fold.c (gimple_get_virt_method_for_binfo): Renamed from
	gimple_get_virt_mehtod_for_binfo.
	* gimple.h (gimple_get_virt_method_for_binfo): Likewise.
	* ipa-cp.c (ipcp_process_devirtualization_opportunities): Adjust
	callers.
	* ipa-prop.c (try_make_edge_direct_virtual_call): Likewise.

	* g++.dg/torture/pr48661.C: New test.

From-SVN: r172677
2011-04-18 23:58:51 +02:00
Richard Guenther
3b45a007ef gimple.h (gimple_call_addr_fndecl): New function.
2011-04-18  Richard Guenther  <rguenther@suse.de>

	* gimple.h (gimple_call_addr_fndecl): New function.
	(gimple_call_fndecl): Use it.
	* gimple-fold.c (gimple_fold_call): Fold away OBJ_TYPE_REFs
	for direct calls.
	* tree-ssa-ccp.c (ccp_fold_stmt): Remove OBJ_TYPE_REF folding.
	* tree-ssa-pre.c (eliminate): Also simplify indirect OBJ_TYPE_REFs.

From-SVN: r172644
2011-04-18 11:59:34 +00:00
Jan Hubicka
2e9bb6ba99 re PR middle-end/20991 (ICE in cgraph_mark_reachable_node)
* cgraph.c (cgraph_clone_node): Do not handle vtable_method
	* cgraph.h (struct cgraph_local_info): Drop vtable_method.
	* cgraphunit.c (cgraph_copy_node_for_versioning): Drop vtable_method.
	* lto-cgraph.c (lto_output_node, input_overwrite_node): Drop vtable method.
	* gimple-fold.c (can_refer_decl_in_current_unit_p): Mention PR20991 in
	gimple-fold.c
	* varasm.c (mark_decl_referenced): Drop vtable_method handling code.
	* cp/class.c (cp_fold_obj_type_ref): Drop vtable_method.

From-SVN: r172613
2011-04-17 16:37:07 +00:00
Michael Matz
0038d4e090 cgraphbuild.c (record_reference): Canonicalize constructor values.
* cgraphbuild.c (record_reference): Canonicalize constructor
	values.
	* gimple-fold.c (canonicalize_constructor_val): Accept being called
	without function context.
	* cgraphunit.c (cgraph_finalize_compilation_unit): Clear
	current_function_decl and cfun.

From-SVN: r171903
2011-04-03 11:13:09 +00:00
Richard Guenther
cfef45c809 re PR tree-optimization/46562 (CCP currently needs iteration for &a[i])
2011-03-24  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/46562
	* tree.c (build_invariant_address): New function.
	* tree.h (build_invariant_address): Declare.
	* tree-dfa.c (get_addr_base_and_unit_offset): Wrap around
	a renamed function moved ...
	* tree-flow-inline.h (get_addr_base_and_unit_offset_1): ... here.
	Take valueization callback parameter.
	* tree-flow.h (gimple_fold_stmt_to_constant): Declare.
	* gimple-fold.h: New file.
	* tree-ssa-ccp.c (ccp_fold): Use gimple_fold_stmt_to_constant_1.
	(ccp_fold, fold_const_aggregate_ref,
	fold_ctor_reference, fold_nonarray_ctor_reference,
	fold_array_ctor_reference, fold_string_cst_ctor_reference,
	get_base_constructor): Move ...
	* gimple-fold.c: ... here.
	(gimple_fold_stmt_to_constant_1): New function
	split out from ccp_fold.  Take a valueization callback parameter.
	Valueize all operands.
	(gimple_fold_stmt_to_constant): New wrapper function.
	(fold_const_aggregate_ref_1): New function split out from
	fold_const_aggregate_ref.  Take a valueization callback parameter.
	(fold_const_aggregate_ref): Wrap fold_const_aggregate_ref_1.
	* tree-ssa-sccvn.c (simplify_binary_expression): Simplify
	invariant POINTER_PLUS_EXPRs to invariant form.
	(vn_valueize): New function.
	(try_to_simplify): Simplify by using gimple_fold_stmt_to_constant.
	* tree-vrp.c (vrp_valueize): New function.
	(vrp_visit_assignment_or_call): Use gimple_fold_stmt_to_constant
	to fold statements to constants.
	* tree-ssa-pre.c (eliminate): Properly guard propagation of
	function declarations.
	* Makefile.in (tree-ssa-sccvn.o, tree-vrp.o, gimple-fold.o,
	tree-ssa-ccp.o): Add gimple-fold.h dependencies.

	* c-c++-common/pr46562-2.c: New testcase.
	* c-c++-common/pr46562.c: Likewise.

From-SVN: r171386
2011-03-24 11:23:29 +00:00
Richard Guenther
f0eddb9019 gimple-fold.c (maybe_fold_reference): Open-code relevant constant folding.
2011-03-16  Richard Guenther  <rguenther@suse.de>

	* gimple-fold.c (maybe_fold_reference): Open-code relevant
	constant folding.  Move MEM_REF canonicalization first.
	Rely on fold_const_aggregate_ref for initializer folding.
	* tree-ssa-ccp.c (ccp_fold): Handle constant vector extracts.

	* gcc.dg/tree-ssa/pr14814.c: Adjust.
	* gcc.dg/tree-ssa/ssa-ccp-19.c: Likewise.

From-SVN: r171043
2011-03-16 11:36:30 +00:00
Martin Jambor
e4cba915b8 re PR tree-optimization/47382 (g++.dg/ipa/devirt-d-1.C FAILs with -finline-functions)
2011-01-25  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/47382
	* gimple-fold.c (gimple_fold_obj_type_ref_call): Removed.
	(gimple_fold_call): Do not call gimple_fold_obj_type_ref_call.

	* testsuite/g++.dg/torture/pr47382.C: New test.
	* testsuite/g++.dg/opt/devirt1.C: Xfail.

From-SVN: r169245
2011-01-25 18:08:47 +01:00
Jakub Jelinek
9fdc58ded7 re PR tree-optimization/47074 (tree check fail in create_access_replacement)
PR tree-optimization/47074
	* gimple-fold.c (gimplify_and_update_call_from_tree): Call
	pop_gimplify_context if returning early.

From-SVN: r168325
2010-12-29 22:49:37 +01:00
Martin Jambor
32aa622ca8 re PR tree-optimization/45934 (g++.old-deja/g++.other/dtor5.C FAILs with -finline-small-functions)
2010-12-22  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/45934
	PR tree-optimization/46302
	PR tree-optimization/46987
	* gimple-fold.c (get_base_binfo_for_type): Removed.
	(gimple_get_relevant_ref_binfo): Likewise.
	(gimple_fold_obj_type_ref_call): Dumb down to 4.5 functionality,
	removed parameter inplace, updated the caller.
	* gimple.h (gimple_get_relevant_ref_binfo): Remove declaration.
	* ipa-cp.c (ipcp_propagate_types): Do not derive types from constants.
	(ipcp_discover_new_direct_edges): Do not do devirtualization based on
	constants.
	* ipa-prop.c (compute_known_type_jump_func): Use
	get_ref_base_and_extent and get_binfo_at_offset instead of
	gimple_get_relevant_ref_binfo.
	(compute_known_type_jump_func): Likewise.
	(update_jump_functions_after_inlining): Do not derive types from
	constants.
	(try_make_edge_direct_virtual_call): Likewise.
	* tree.c (get_binfo_at_offset): Get type from non-artificial fields.

	* testsuite/g++.dg/ipa/ipcp-ivi-1.C: Removed.
	* testsuite/g++.dg/ipa/ivinline-6.C: Likewise.
	* testsuite/g++.dg/otr-fold-1.C: Likewise.
	* testsuite/g++.dg/otr-fold-2.C: Likewise.
	* testsuite/g++.dg/tree-ssa/pr43411.C: Xfail dump scan.
	* testsuite/g++.dg/tree-ssa/pr45605.C: Likewise.
	* testsuite/g++.dg/tree-ssa/pr46987.C: New test.

From-SVN: r168168
2010-12-22 13:56:54 +01:00
Martin Jambor
ceeffab0ba re PR tree-optimization/46053 (g++.dg/torture/pr45699.C FAILs with -fno-early-inlining)
2010-12-15  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/46053
	PR middle-end/46287
	PR middle-end/46242
	* cgraph.h (cgraph_indirect_call_info): New field thunk_delta.
	* gimple.h (gimple_fold_obj_type_ref): Declaration removed.
	(gimple_fold_call): Declare.
	(gimple_adjust_this_by_delta): Likewise.
	* cgraph.c (cgraph_make_edge_direct): New parameter delta.  Updated
	all users.
	(cgraph_clone_edge): Create a copy of indirect_info also for direct
	edges.
	* cgraphunit.c (cgraph_redirect_edge_call_stmt_to_callee): Adjust this
	parameters.
	* gimple-fold.c (gimple_fold_obj_type_ref_known_binfo): Renamed to
	gimple_get_virt_mehtod_for_binfo, new parameter delta.  Do not search
	through thunks, in fact bail out if we encounter one, check that
	BINFO_VIRTUALS is not NULL.
	(gimple_adjust_this_by_delta): New function.
	(gimple_fold_obj_type_ref): Removed.
	(gimple_fold_obj_type_ref_call): New function.
	(fold_gimple_call): Renamed to gimple_fold_call, made external.
	Updated users.  Call gimple_fold_obj_type_ref_call instead of
	gimple_fold_obj_type_ref.
	* ipa-cp.c (ipcp_process_devirtualization_opportunities): Process
	thunk deltas.
	(ipcp_discover_new_direct_edges): Likewise.
	* ipa-prop.c (ipa_make_edge_direct_to_target): New parameter delta.
	Updated callers.
	(ipa_write_indirect_edge_info): Stream thunk_delta.
	(ipa_read_indirect_edge_info): Likewise.
	* tree-ssa-ccp.c (ccp_fold_stmt): Use gimple_fold_call instead of
	gimple_fold_obj_type_ref.

	* testsuite/g++.dg/ipa/pr46053.C: New test.
	* testsuite/g++.dg/ipa/pr46287-1.C: Likewise.
	* testsuite/g++.dg/ipa/pr46287-2.C: Likewise.
	* testsuite/g++.dg/ipa/pr46287-3.C: Likewise.
	* testsuite/g++.dg/torture/covariant-1.C: Likewise.
	* testsuite/g++.dg/torture/pr46287.C: Likewise.

From-SVN: r167855
2010-12-15 14:19:46 +01:00
Jakub Jelinek
8236c8eb4f re PR tree-optimization/46909 (Logical OR expressions are miscompiled)
PR tree-optimization/46909
	* gimple-fold.c (and_var_with_comparison_1): Save partial
	result even in the is_and case, if both partial results
	are the same, return it.
	(or_var_with_comparison_1): Use is_or predicate instead of
	innercode == TRUTH_OR_EXPR test.  Save partial result
	even in the is_or case, if both partial results are the
	same, return it.  In the !is_or case when both partial
	results are the same, return the partial result instead
	of boolean_true_node.

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

From-SVN: r167800
2010-12-14 15:09:59 +01:00
Richard Guenther
73aef89eb7 re PR middle-end/46844 (regrename.c:312:22: error: unused parameter 'reg')
2010-12-09  Richard Guenther  <rguenther@suse.de>

	PR middle-end/46844
	* gimple-fold.c (canonicalize_constructor_val): Canonicalize
	addresses.

	* gcc.c-torture/compile/pr46866.c: New testcase.

From-SVN: r167649
2010-12-09 17:00:19 +00:00
Richard Guenther
3dbe945454 gimple.c (gimple_assign_copy_p): Use gimple_assign_single_p.
2010-11-27  Richard Guenther  <rguenther@suse.de>

	* gimple.c (gimple_assign_copy_p): Use gimple_assign_single_p.
	(gimple_assign_ssa_name_copy_p): Likewise.
	(gimple_assign_unary_nop_p): Use is_gimple_assign.
	(is_gimple_cast): Remove.
	(gimple_assign_single_p): Move ...
	* gimple.h (gimple_assign_single_p): ... here.
	(is_gimple_cast): Remove.
	(gimple_assign_rhs_code): Simplify.
	* gimple-fold.c (gimple_fold_builtin): Use CONVERT_EXPR_P
	instead of is_gimple_cast.
	* ipa-type-escape.c (look_for_casts): Likewise.

From-SVN: r167200
2010-11-27 14:32:47 +00:00
Richard Guenther
e961597133 gimple-fold.c (maybe_fold_reference): When canonicalizing MEM_REFs, preserve volatileness.
2010-11-22  Richard Guenther  <rguenther@suse.de>

	* gimple-fold.c (maybe_fold_reference): When canonicalizing
	MEM_REFs, preserve volatileness.
	* cgraphbuild.c (mark_address): Properly check for FUNCTION_DECL
	addresses.

From-SVN: r167030
2010-11-22 13:18:48 +00:00
Nathan Froyd
e8160c9a60 builtins.c (fold_builtin_signbit): Use build_zero_cst instead of fold_convert.
gcc/
	* builtins.c (fold_builtin_signbit): Use build_zero_cst instead of
	fold_convert.
	* c-typeck.c (build_function_call_vec): Likewise.
	* cfgexpand.c (expand_debug_expr): Likewise.
	* cgraphunit.c (assemble_thunk): Likewise.
	* config/sparc/sparc.c (sparc_fold_builtin): Likewise.
	* fold-const.c (fold_unary_loc, fold_mult_zconjz): Likewise.
	(fold_binary_loc, fold_ternary_loc): Likewise.
	* gimple-fold.c (get_symbol_constant_value): Likewise.
	* gimple-low.c (lower_builtin_setjmp): Likewise.
	* gimple.c (gimple_cond_get_ops_from_tree): Likewise.
	* gimplify.c (gimplify_init_constructor): Likewise.
	* lambda.h (build_linear_expr): Likewise.
	* omp-low.c (omp_reduction_init): Likewise.
	* tree-inline.c (remap_ssa_name): Likewise.
	* tree-object-size.c (compute_object_sizes): Likewise.
	* tree-sra.c (init_subtree_with_zero): Likewise.
	(sra_ipa_modify_assign): Likewise.
	* tree-ssa-copy.c (propagate_tree_value_into_stmt): Likewise.
	* tree-ssa-reassoc.c (eliminate_duplicate_pair): Likewise.
	(eliminate_plus_minus_pair, eliminate_not_pairs): Likewise.
	(undistribute_ops_list): Likewise.
	* tree-ssa-sccvn.c (vn_reference_lookup_3): Likewise.
	* tree-vect-stmts.c (vectorizable_call): Likewise.
	* tree.c (build_vector_from_ctor, build_one_cst): Likewise.
	(build_zero_cst): Handle more cases directly.  Update comment.

gcc/cp/
	* class.c (build_base_path, add_vcall_offset): Use build_zero_cst
	instead of fold_convert.
	* init.c (build_zero_init): Likewise.
	* typeck.c (cp_build_binary_op): Likewise.

gcc/fortran/
	* trans-decl.c (add_argument_checking): Use build_zero_cst instead of
	fold_convert.
	* trans-expr.c (gfc_conv_missing_dummy, fill_with_spaces): Likewise.
	* trans-stmt.c (gfc_trans_do): Likewise.

From-SVN: r166227
2010-11-03 00:49:00 +00:00
Martin Jambor
b85020cb46 re PR tree-optimization/45875 (ice in gimple_fold_obj_type_ref_known_binfo with -O2)
2010-11-02  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/45875
	* gimple-fold.c (get_first_base_binfo_with_virtuals): Removed.
	(gimple_get_relevant_ref_binfo): Detect primary bases according to
	their field offset.

	* testsuite/g++.dg/torture/pr45875.C: New test.

From-SVN: r166190
2010-11-02 16:06:21 +01:00
Richard Guenther
07db7d35a9 re PR tree-optimization/46137 (g++.dg/torture/pr45877.C FAILs with -fno-tree-dce)
2010-10-22  Richard Guenther  <rguenther@suse.de>

	PR middle-end/46137
	* gimple-fold.c (gimplify_and_update_call_from_tree): Properly
	remove the virtual operands if they are not needed.

	* c-c++-common/torture/pr46137.c: New testcase.

From-SVN: r165852
2010-10-22 19:03:39 +00:00
Richard Guenther
0d8485e009 re PR objc/45878 (Can't compile even a trivial ObjC program with -fexceptions -O2)
2010-10-13  Richard Guenther  <rguenther@suse.de>

	PR objc/45878
	* gimple-fold.c (gimple_fold_obj_type_ref): Leave OBJ_TYPE_REFs
	alone if there are no virtual methods.

	* objc.dg/pr45878.m: New testcase.

From-SVN: r165435
2010-10-13 20:30:10 +00:00
Martin Jambor
3f1f0ae316 re PR middle-end/45699 (Incorrect copy constructor generated with -O)
2010-10-11  Martin Jambor  <mjambor@suse.cz>

	PR middle-end/45699
	* gimple-fold.c (gimple_fold_obj_type_ref_known_binfo): Choose among
	thunks.

	* testsuite/g++.dg/torture/pr45699.C: New test.
	* testsuite/g++.dg/otr-fold-1.C: Adjusted.
	* testsuite/g++.dg/otr-fold-1.C: Likewise.

From-SVN: r165327
2010-10-11 20:45:23 +02:00
Richard Guenther
6e57232622 re PR middle-end/45877 (invalid write in gimplify_and_update_call_from_tree)
2010-10-05  Richard Guenther  <rguenther@suse.de>

	PR middle-end/45877
	* gimple-fold.c (gimplify_and_update_call_from_tree): Handle
	case where gimplification optimizes away the stmt.

	* g++.dg/torture/pr45877.C: New testcase.

From-SVN: r164984
2010-10-05 10:37:12 +00:00
Jan Hubicka
b3b9f3d0a8 gimple-fold.c (static_object_in_other_unit_p): Rename to...
* gimple-fold.c (static_object_in_other_unit_p): Rename to...
	(can_refer_decl_in_current_unit_p): ... this one; reverse return
	value; handle comdats too.
	(canonicalize_constructor_val): Use it; handle function_decls
	correctly.
	(gimple_fold_obj_type_ref_known_binfo): Likewise.
	* gimple.c (get_base_address): Accept all kinds of decls.

From-SVN: r164961
2010-10-04 20:59:07 +00:00
Jan Hubicka
697c3575e2 tree-ssa-ccp.c (fold_ctor_reference): New function.
* tree-ssa-ccp.c (fold_ctor_reference): New function.
	(fold_const_aggregate_ref): Use it.
	* fold-const.c (canonicalize_constructor_val): Check that we don't fold
	into external static.

From-SVN: r164688
2010-09-28 16:28:39 +00:00