Robert Kidd [Mon, 10 Sep 2007 12:49:46 +0000 (12:49 +0000)]
bb-reorder.c (rest_of_handler_reorder_blocks): Removed call to RTL level tracer pass.
2007-09-10 Robert Kidd <rkidd@crhc.uiuc.edu>
* bb-reorder.c (rest_of_handler_reorder_blocks): Removed call to
RTL level tracer pass.
* passes.c (init_optimization_passes): Move pass_tracer from
after pass_rtl_ifcvt to after pass_dce.
* tracer.c: Update copyright.
(layout_superblocks): Remove function.
(mark_bb_seen): New.
(bb_seen_p): New.
(count_insns): Change to estimate instructions in a Tree-SSA
statement.
(find_trace): Use bb_seen_p.
(tail_duplicate): Use bb_seen_p. Call add_phi_args_after_copy
after duplicate_block.
(tracer): Change prototype to match that of a pass execute
callback.
(gate_tracer): Rename from gate_handle_tracer.
(rest_of_handle_tracer): Remove function.
* rtl.h: Remove prototype for tracer.
* testsuite/gcc.dg/tree-prof/tracer-1.c: New.
Ed Schonberg [Mon, 10 Sep 2007 12:49:04 +0000 (14:49 +0200)]
sem_ch12.adb (Build_Local_Package): A formal package with no associations is legal if all formals have defaults.
2007-09-10 Ed Schonberg <schonberg@adacore.com>
* sem_ch12.adb (Build_Local_Package): A formal package with no
associations is legal if all formals have defaults. It is not
equivalent to a formal declared with a box.
Ed Schonberg [Mon, 10 Sep 2007 12:48:54 +0000 (14:48 +0200)]
sem_aggr.adb (Build_Record_Aggr_Code): If an aggregate component is given a box association...
2007-09-10 Ed Schonberg <schonberg@adacore.com>
* sem_aggr.adb (Build_Record_Aggr_Code): If an aggregate component is
given a box association, the type of the component is discriminated,
and the value of the discriminant is the discriminant of the enclosing
type, retrieve its value from the aggregate itself, where it must have
been supplied.
* sem_ch4.adb (Analyze_One_Call): Further refinement to previous fix,
to remove other spurious ambiguities on arithmetic operations involving
literals and addresses, on systems where Address is a visible integer
type, when the operator is called in functional notation.
(Try_Primitive_Operation): Within an instance, a call in prefixed form
is legal when the types match, even if the operation is currently
hidden.
Gary Dismukes [Mon, 10 Sep 2007 12:48:35 +0000 (14:48 +0200)]
exp_ch3.adb (Predef_Spec_Or_Body): When the type is abstract, only create an abstract subprogram in the case of 'Input.
2007-09-10 Gary Dismukes <dismukes@adacore.com>
Thomas Quinot <quinot@adacore.com>
* exp_ch3.adb (Predef_Spec_Or_Body): When the type is abstract, only
create an abstract subprogram in the case of 'Input. For 'Output we now
create a real spec/body when the type is abstract, since it can
potentially be called.
(Predefined_Primitive_Bodies): Now allow the creation of a predefined
body for 'Output when the type is abstract (only the creation of the
body for 'Input is excluded when the type is abstract).
(Stream_Operation_OK): Add an additional condition in the return
statement, so that False will be returned for TTS_Stream_Input if the
associated tagged type is an abstract extension. Add comments for
return statement.
(Expand_N_Object_Declaration): For the case of a shared passive
variable, insert init proc call only after the shared variable
procedures have been processed, because the IP call needs to undergo
shared passive variable reference expansion, which requires these
procedures to be available (and elaborated).
re PR target/33369 (suffix or operands invalid for `pslld')
PR target/33369
* gcc/config/i386/sse.md (ashr<mode>3): Change op2 mode to SImode.
Use 'N' operand constraint for op2.
(lshr<mode>3): Ditto.
(ashl<mode>3): Ditto.
(vec_shl_<mode>): Use const_0_to_255_mul_8_operand predicate for op2.
(vec_shr_<mode>): Use const_0_to_255_mul_8_operand predicate for op2.
* gcc/config/i386/i386.c (ix86_expand_builtin) [IX86_BUILTIN_PSLL?128,
IX86_BUILTIN_PSRA*?128, IX86_BUILTIN_PSRL?128]: Convert op1 to SImode.
testsuite/ChangeLog:
PR target/33369
* gcc.dg/vect/pr33369.c: New test.
Paul Thomas [Mon, 10 Sep 2007 07:54:17 +0000 (07:54 +0000)]
re PR fortran/33370 (Structure component arrays)
2007-09-10 Paul Thomas <pault@gcc.gnu.org>
PR fortran/33370
* trans-expr.c (copyable_array_p): Add tests that expression
is a variable, that it has no subreferences and that it is a
full array.
(gfc_trans_assignment): Change conditions to suit modifications
to copyable_array_p.
2007-09-10 Paul Thomas <pault@gcc.gnu.org>
PR fortran/33370
* gfortran.dg/array_memcpy_5.f90: New test.
Michael Matz [Mon, 10 Sep 2007 07:40:30 +0000 (07:40 +0000)]
tree-pass.h (pass_cselim): Declare new pass.
* tree-pass.h (pass_cselim): Declare new pass.
* passes.c (init_optimization_passes): Link in pass_cselim.
* tree-ssa-phiopt.c (tree_ssa_phiopt_worker): Renamed from
tree_ssa_phiopt; add do_store_elim parameter, handle it by calling
cond_store_replacement.
(condstoretemp): New static variable.
(cond_store_replacement): New function.
(tree_ssa_phiopt, tree_ssa_cs_elim): New wrappers around
tree_ssa_phiopt_worker.
(struct name_to_bb): New.
(get_non_trapping, name_to_bb_hash, name_to_bb_eq, add_or_mark_expr,
nt_init_block, nt_fini_block): New static functions.
(seen_ssa_names, nontrap_set): New static variables.
(gate_cselim, pass_cselim): Define new pass.
* common.opt (ftree-cselim): New flag.
* toplev.c (process_options): Set flag_tree_cselim if required.
Ira Rosen [Sun, 9 Sep 2007 11:22:24 +0000 (11:22 +0000)]
tree-vectorizer.h (stmt_vinfo_set_inside_of_loop_cost, [...]): New functions.
* tree-vectorizer.h (stmt_vinfo_set_inside_of_loop_cost,
stmt_vinfo_set_outside_of_loop_cost): New functions.
* tree-vect-transform.c (vect_get_cost_fields): Remove.
(vect_model_simple_cost): Call
stmt_vinfo_set_inside/outside_of_loop_cost to set the relevant cost
field instead of calling vect_get_cost_fields.
(vect_model_store_cost, vect_model_load_cost): Likewise.
(prologue): Use (const_int 0) as never generated filler insn.
(epilogue): Ditto.
(sibcall_epilogue): Ditto.
(eh_return_si): Ditto.
(eh_return_di): Ditto.
(add<mode>3): Rename from adddf3 and addsf3. Macroize expander
using MODEF mode iterator.
(sub<mode>3): Rename from subdf3 and subsf3. Macroize expander
using MODEF mode iterator.
(mul<mode>3): Rename from muldf3 and mulsf3. Macroize expander
using MODEF mode iterator.
(nearbyint<mode>2): Rename from nearbyintdf2 and nearbyintsf2.
Macroize expander using MODEF mode iterator.
Ira Rosen [Sun, 9 Sep 2007 08:46:12 +0000 (08:46 +0000)]
tree-vectorizer.h (enum vect_def_type): Start enumeration from 1.
* tree-vectorizer.h (enum vect_def_type): Start enumeration from 1.
(struct _slp_tree, struct _slp_instance): Define new data structures
along macros for their access.
(struct _loop_vec_info): Define new fields: strided_stores,
slp_instances, and slp_unrolling_factor along macros for their access.
(enum slp_vect_type): New.
(struct _stmt_vec_info): Define new field, slp_type, and macros for its
access.
(STMT_VINFO_STRIDED_ACCESS): New macro.
(vect_free_slp_tree): Declare.
(vectorizable_load): Add an argument of type slp_tree.
(vectorizable_store, vectorizable_operation, vectorizable_conversion,
vectorizable_assignment): Likewise.
(vect_model_simple_cost, vect_model_store_cost, vect_model_load_cost):
Declare (make extern).
* tree-vectorizer.c (new_stmt_vec_info): Initiliaze the new field.
(new_loop_vec_info): Likewise.
(destroy_loop_vec_info): Free memory allocated for SLP structures.
* tree-vect-analyze.c: Include recog.h.
(vect_update_slp_costs_according_to_vf): New.
(vect_analyze_operations): Add argument for calls to vectorizable_ ()
functions. For not pure SLP stmts with strided access check that the
group size is power of 2. Update the vectorization factor according to
SLP. Call vect_update_slp_costs_according_to_vf.
(vect_analyze_group_access): New.
(vect_analyze_data_ref_access): Call vect_analyze_group_access.
(vect_free_slp_tree): New functions.
(vect_get_and_check_slp_defs, vect_build_slp_tree, vect_print_slp_tree,
vect_mark_slp_stmts, vect_analyze_slp_instance, vect_analyze_slp,
vect_make_slp_decision, vect_detect_hybrid_slp_stmts,
vect_detect_hybrid_slp): Likewise.
(vect_analyze_loop): Call vect_analyze_slp, vect_make_slp_decision
and vect_detect_hybrid_slp.
* tree-vect-transform.c (vect_estimate_min_profitable_iters): Take
SLP costs into account.
(vect_get_cost_fields): New function.
(vect_model_simple_cost): Make extern, add SLP parameter and handle
SLP.
(vect_model_store_cost, vect_model_load_cost): Likewise.
(vect_get_constant_vectors): New function.
(vect_get_slp_vect_defs, vect_get_slp_defs,
vect_get_vec_defs_for_stmt_copy, vect_get_vec_defs_for_stmt_copy,
vect_get_vec_defs): Likewise.
(vectorizable_reduction): Don't handle SLP for now.
(vectorizable_call): Don't handle SLP for now. Add argument to
vect_model_simple_cost.
(vectorizable_conversion): Handle SLP (call vect_get_vec_defs to
get SLPed and vectorized defs). Fix indentation and spacing.
(vectorizable_assignment): Handle SLP.
(vectorizable_induction): Don't handle SLP for now.
(vectorizable_operation): Likewise.
(vectorizable_type_demotion): Add argument to
vect_model_simple_cost.
(vectorizable_type_promotion): Likewise.
(vectorizable_store, vectorizable_load): Handle SLP.
(vectorizable_condition): Don't handle SLP for now.
(vect_transform_stmt): Add a new argument for SLP. Check that there is
no SLP transformation required for unsupported cases. Add SLP
argument for supported cases.
(vect_remove_stores): New function.
(vect_schedule_slp_instance, vect_schedule_slp): Likewise.
(vect_transform_loop): Schedule SLP instances.
* Makefile.in: (tree-vect-analyze.o): Depend on recog.h.
Divide REG_LABEL notes into REG_LABEL_OPERAND and REG_LABEL_TARGET.
* doc/rtl.texi (Insns): Specify when a label_ref makes a jump_insn.
Similar for what label_refs can go in the JUMP_TARGET field. Split
REG_LABEL documentation into REG_LABEL_TARGET and REG_LABEL_OPERAND.
* reload.c (find_reloads): Generate REG_LABEL_OPERAND, not
REG_LABEL when replacing an operand with a LABEL_REF for a
non-jump insn.
(subst_reloads): When replacing a LABEL_REG with a register,
instead of generating a REG_LABEL note, assert that there already
is one or that the label is a known target for the insn.
* rtlanal.c (computed_jump_p): Instead of looking for a REG_LABEL
note, check the JUMP_LABEL field. Remove "else" after return.
* reorg.c (emit_delay_sequence): Replace case for REG_LABEL with
cases for REG_LABEL_OPERAND and REG_LABEL_TARGET.
(fill_slots_from_thread): Handle both REG_LABEL_OPERAND and
REG_LABEL_TARGET notes, including the JUMP_TARGET field on JUMP_P
insns. Iterate over all notes; don't assume there's only one.
* cse.c (recorded_label_ref): Adjust comment to refer to
REG_LABEL_OPERAND.
(cse_extended_basic_block): Do LABEL_REF check for all INSN_P
insns, not just NONJUMP_INSN_P.
(check_for_label_ref): For JUMP_P insns, check that the LABEL_REF
isn't a jump target.
* jump.c (rebuild_jump_labels): Adjust head comment.
(init_label_info): Ditto. Remove REG_LABEL_OPERAND notes only;
don't reset REG_LABEL_TARGET notes, including the JUMP_LABEL field.
(mark_all_labels): For JUMP_P insns without a target, check if the
the target is noted on the previous nonjump insn.
(mark_jump_label_1): New function, guts from mark_jump_label.
<case IF_THEN_ELSE>: Handle first operand as a non-target when
marking jump target labels.
<case LABEL_REF>: Adjust for whether to generate a
REG_LABEL_TARGET or a REG_LABEL_OPERAND note.
For 'E' format rtl, iterate in descending element order.
(delete_related_insns): Handle both REG_LABEL_TARGET and
REG_LABEL_OPERAND notes. For JUMP_P insns with labels with zero
reference count, delete and fallthrough. Move finding-next-
non-deleted insn last in the function. Look at all INSN_P insns
for REG_LABEL_OPERAND notes.
(redirect_jump_2): Assert that OLABEL equals the old JUMP_LABEL of
JUMP.
* print-rtl.c (print_rtx): For JUMP_P insns and a non-NULL
JUMP_LABEL, output the INSN_UID of it.
* gcse.c: Adjust comments as appropriate to say REG_LABEL_OPERAND
and/or REG_LABEL_TARGET.
(add_label_notes): Only add REG_LABEL_OPERAND notes. Put in line
with jump.c copy by only adding notes for labels actually
referenced in the insn.
* emit-rtl.c (try_split): Don't assume only NONJUMP_INSN_P need
usage count increment; handle all INSN_P trial insns.
(emit_copy_of_insn_after): Change to not copy REG_LABEL_OPERAND
notes.
* rtl.h (struct rtx_def) <volatil>: Adjust to mention
REG_LABEL_TARGET and REG_LABEL_OPERAND.
(LABEL_REF_NONLOCAL_P): Allow REG_LABEL_TARGET and
REG_LABEL_OPERAND.
* combine.c (distribute_notes): Adjust for REG_LABEL_TARGET on
JUMP_P insns and REG_LABEL_OPERAND everywhere.
* sched-rgn.c (is_cfg_nonregular): Check for REG_LABEL_OPERANDS
on all INSN_P insns.
* reg-notes.def (LABEL_TARGET, LABEL_OPERAND): Split from LABEL.
* cfgrtl.c (delete_insn): Adjust to handle REG_LABEL_TARGET and
REG_LABEL_OPERAND notes.
* reload1.c (calculate_needs_all_insns): Adjust comments.
(set_label_offsets): Adjust to look for REG_LABEL_OPERAND notes.
* config/alpha/alpha.md (split for load of an address into a
four-insn sequence on Unicos/Mk): Adjust to use
REG_LABEL_OPERAND.
* config/sh/sh.md (sh_reorg, final_prescan_insn): Ditto.
revert: regrename.c (copyprop_hardreg_forward_1): New variable next.
Revert:
2007-09-05 Laurynas Biveinis <laurynas.biveinis@gmail.com>
* regrename.c (copyprop_hardreg_forward_1): New variable next. Use
FOR_BB_INSNS_SAFE instead of for loop.
* cse.c (cse_extended_basic_block): Likewise.
* postreload.c (reload_cse_regs_1): New variable next. Make sure
that the for loop does not invoke NEXT_INSN on a deleted insn.
* function.c (instantiate_virtual_regs): Likewise.
* lower-subreg.c (remove_retval_note): Likewise.
(decompose_multiword_subregs): Use FOR_BB_INSNS_SAFE instead of
FOR_BB_INSNS.
* emit-rtl.c (remove_insn): Set NEXT_INSN and PREV_INSN to NULL on
a deleted insn.
* cfgrtl.c (delete_insn): Set JUMP_LABEL to NULL on a deleted
insn, if it's a jump.
(try_redirect_by_replacing_jump): New variable jump_p. Call
tablejump_p before delete_insn_chain.
* reload1.c (reload): New variable next. Make sure that the for
loop does not invoke NEXT_INSN on a deleted insn.
(fixup_eh_region_note): Make the loop terminate if i becomes NULL.
(delete_output_reload): New variable prev. Make sure the the for
loops do not invoke PREV_INSN on a deleted insn.
re PR rtl-optimization/32283 (Missed induction variable optimization)
PR tree-optimization/32283
* tree-ssa-loop-ivopts.c (may_eliminate_iv): Use
estimated_loop_iterations.
(determine_use_iv_cost_condition): Decrease cost of expressions
used in iv elimination.
re PR target/33329 (ICE in expand_simple_binop, at optabs.c:1294)
PR target/33329
PR target/26449
* config/i386/sse.md (mulv4si3): Do not expand sse2 sequence.
(*sse2_mulv4si3): New define_insn_and_split pattern. Split insn in
split1 pass.
(mulv16qi3): Implement as define_insn_and_split pattern instead of
define_expand, to split insn in split1 pass.
(mulv2di3): Ditto.
testsuite/ChangeLog:
PR target/33329
PR target/26449
* gcc.target/i386/pr33329.c: New file.
Eric Botcazou [Sat, 8 Sep 2007 10:30:06 +0000 (10:30 +0000)]
decl.c (gnat_to_gnu_entity): Simplify the condition under which a constant renaming is treated as a normal...
* decl.c (gnat_to_gnu_entity) <Object>: Simplify the condition under
which a constant renaming is treated as a normal object declaration.
* trans.c (lvalue_required_p) <N_Slice>: New case, extracted from
the N_Indexed_Component case.
<N_Indexed_Component>: Fall through to above case.
<N_Object_Renaming_Declaration>: Return true for all composite types.
re PR tree-optimization/32183 (reassoc2 can more extra calculations into a loop)
2007-09-07 Zdenek Dvorak <ook@ucw.cz>
PR tree-optimization/32183
* Makefile.in (tree-ssa-reassoc.o): Also depend on $(CFGLOOP_H).
* tree-ssa-reassoc.c: Include cfgloop.h.
(is_reassociable_op): Add a loop argument and return true only
for inside loop.
(linearize_expr): Updated.
(should_break_up_subtract): Likewise.
(linearize_expr_tree): Likewise.
(init_reassoc): Call loop_optimizer_init with
AVOID_CFG_MODIFICATIONS. Remove calculate_dominance_info call
with CDI_DOMINATORS.
(fini_reassoc): Call loop_optimizer_finalize.
Eric Botcazou [Fri, 7 Sep 2007 19:57:59 +0000 (19:57 +0000)]
Re-apply accidentally reverted change:
2007-02-07 Andreas Krebbel <krebbel1@de.ibm.com>
* raise-gcc.c (get_region_description_for, get_call_site_action_for,
get_action_description_for): Replace _Unwind_Word with _uleb128_t
and _Unwind_SWord with _sleb128_t.
re PR tree-optimization/32586 (New VN misses FRE opportunities)
2007-09-07 Richard Guenther <rguenther@suse.de>
PR tree-optimization/32586
* tree-ssa-sccvn.c (simplify_binary_expression): Avoid
folding if nothing changed.
(simplify_unary_expression): New function. Do tree combining
on conversion like codes.
(try_to_simplify): Call it.
Roman Zippel [Fri, 7 Sep 2007 16:46:23 +0000 (16:46 +0000)]
function.h (struct function): Rename calls_unwind_init to saves_all_registers.
* function.h (struct function): Rename calls_unwind_init
to saves_all_registers.
(current_function_saves_all_registers): Renamed from
current_function_calls_unwind_init.
* reload1.c (reload): Set current_function_saves_all_registers.
* except.c (expand_builtin_unwind_init): Likewise.
* config/m68k/m68k.c (m68k_save_reg): Use
current_function_saves_all_registers to save pic register.
Diego Novillo [Fri, 7 Sep 2007 16:38:46 +0000 (12:38 -0400)]
tree-flow.h (const_block_stmt_iterator): Remove.
* tree-flow.h (const_block_stmt_iterator): Remove.
Update all users to use block_stmt_iterator.
* tree-iterator.h (const_tree_stmt_iterator): Remove.
Update all users to use tree_stmt_iterator.
re PR tree-optimization/33299 (miscompilation with gfortran -O2 -ffast-math -ftree-vectorize)
PR tree-optimization/33299
* tree-vect-transform.c (vect_create_epilog_for_reduction): Update uses
for all relevant loop-exit phis, not just the first.
revert: re PR tree-optimization/32586 (New VN misses FRE opportunities)
2007-09-07 Richard Guenther <rguenther@suse.de>
Revert
2007-09-06 Richard Guenther <rguenther@suse.de>
PR tree-optimization/32586
* tree-ssa-sccvn.c (simplify_binary_expression): Avoid
folding if nothing changed.
(simplify_unary_expression): New function. Do tree combining
on conversion like codes.
(try_to_simplify): Call it.
mips.c (build_mips16_call_stub): Emit all direct float calls here, rather than leaving some to the caller.
gcc/
* config/mips/mips.c (build_mips16_call_stub): Emit all direct
float calls here, rather than leaving some to the caller.
Use call_internal_direct and call_value_internal_direct.
* config/mips/mips.md (call_internal_direct): New pattern.
(call_value_internal_direct): Likewise.
mips.c (mips_base_move_loop_invariants): New variable.
gcc/
* config/mips/mips.c (mips_base_move_loop_invariants): New variable.
(mips_set_mips16_mode): Restore flag_move_loop_invariants, then set
to 0 for MIPS16.
(override_options): Set mips_base_move_loop_invariants.
gcc/
* doc/invoke.texi: Document the MIPS -mlocal-sdata, -mextern-sdata
and -mgpopt options. Adjust the -G documentation to match.
* config/mips/mips.opt (mextern-data, mgpopt, mlocal-data): New.
* config/mips/mips.c (mips_rtx_constant_in_small_data_p): New
function, split out from mips_classify_symbol. Return false for
!TARGET_LOCAL_SDATA.
(mips_classify_symbol): Call mips_rtx_constant_in_small_data_p.
Only use GP-relative accesses for non-pool symbols if TARGET_GPOPT.
(override_options): Check whether the -mgpopt setting is consistent
with the other flags.
(symbolic_expression_p): Delete.
(mips_select_rtx_section): Use mips_rtx_constant_in_small_data_p
and default_elf_select_rtx_section.
(mips_in_small_data_p): Honor section attributes for MIPS16 too.
Return false for local data unless TARGET_LOCAL_SDATA. Likewise
external data and TARGET_EXTERN_SDATA.
gcc/testsuite/
* gcc.dg/attr-alias-3.c: Use real asm for MIPS.
* gcc.target/mips/mips.exp (setup_mips_tests): Set mips_forced_gp
and mips_forced_no_er.
(dg-mips-options): Add -mno-abicalls when a small-data option is
specified. Skip tests with small-data options if mips_forced_gp.
Skip tests with -mexplicit-relocs if mips_forced_no_er.
* gcc.target/mips/sdata-1.c: New test.
* gcc.target/mips/sdata-2.c: Likewise.
* gcc.target/mips/sdata-3.c: Likewise.
* gcc.target/mips/sdata-4.c: Likewise.
* regrename.c (copyprop_hardreg_forward_1): New variable next. Use
FOR_BB_INSNS_SAFE instead of for loop.
* cse.c (cse_extended_basic_block): Likewise.
* postreload.c (reload_cse_regs_1): New variable next. Make sure
that the for loop does not invoke NEXT_INSN on a deleted insn.
* function.c (instantiate_virtual_regs): Likewise.
* lower-subreg.c (remove_retval_note): Likewise.
(decompose_multiword_subregs): Use FOR_BB_INSNS_SAFE instead of
FOR_BB_INSNS.
* emit-rtl.c (remove_insn): Set NEXT_INSN and PREV_INSN to NULL on
a deleted insn.
* cfgrtl.c (delete_insn): Set JUMP_LABEL to NULL on a deleted
insn, if it's a jump.
(try_redirect_by_replacing_jump): New variable jump_p. Call
tablejump_p before delete_insn_chain.
* reload1.c (reload): New variable next. Make sure that the for
loop does not invoke NEXT_INSN on a deleted insn.
(fixup_eh_region_note): Make the loop terminate if i becomes NULL.
(delete_output_reload): New variable prev. Make sure the the for
loops do not invoke PREV_INSN on a deleted insn.