summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--ChangeLog.MELT4
-rw-r--r--MAINTAINERS2
-rw-r--r--gcc/ChangeLog440
-rw-r--r--gcc/ChangeLog.graphite31
-rw-r--r--gcc/DATESTAMP2
-rw-r--r--gcc/Makefile.in6
-rw-r--r--gcc/c-decl.c2
-rw-r--r--gcc/cfgexpand.c3
-rw-r--r--gcc/combine.c8
-rw-r--r--gcc/config/bfin/bfin.c6
-rw-r--r--gcc/config/bfin/libgcc-bfin.ver1610
-rw-r--r--gcc/config/i386/driver-i386.c39
-rw-r--r--gcc/config/i386/sse.md2
-rw-r--r--gcc/config/ia64/ia64.c27
-rw-r--r--gcc/config/rs6000/rs6000.c13
-rw-r--r--gcc/config/rs6000/rs6000.md11
-rw-r--r--gcc/config/s390/s390.c3
-rw-r--r--gcc/cp/ChangeLog28
-rw-r--r--gcc/cp/call.c7
-rw-r--r--gcc/cp/decl.c2
-rw-r--r--gcc/doc/tm.texi114
-rw-r--r--gcc/fold-const.c21
-rw-r--r--gcc/fortran/ChangeLog41
-rw-r--r--gcc/fortran/interface.c4
-rw-r--r--gcc/fortran/module.c32
-rw-r--r--gcc/fortran/resolve.c2
-rw-r--r--gcc/fortran/trans-array.c127
-rw-r--r--gcc/fortran/trans-array.h6
-rw-r--r--gcc/fortran/trans-expr.c51
-rw-r--r--gcc/gcc.c4
-rw-r--r--gcc/gimple.c8
-rw-r--r--gcc/graphite-clast-to-gimple.c24
-rw-r--r--gcc/lto-streamer-in.c11
-rw-r--r--gcc/lto-streamer-out.c3
-rw-r--r--gcc/passes.c4
-rw-r--r--gcc/po/ChangeLog6
-rw-r--r--gcc/po/exgettext32
-rw-r--r--gcc/sel-sched-ir.c133
-rw-r--r--gcc/sel-sched-ir.h16
-rw-r--r--gcc/sel-sched.c102
-rw-r--r--gcc/sese.c97
-rw-r--r--gcc/sese.h2
-rw-r--r--gcc/testsuite/ChangeLog165
-rw-r--r--gcc/testsuite/c-c++-common/pr42674.c13
-rw-r--r--gcc/testsuite/g++.dg/graphite/pr42681.C17
-rw-r--r--gcc/testsuite/g++.dg/overload/error3.C41
-rw-r--r--gcc/testsuite/g++.dg/overload/rvalue1.C10
-rw-r--r--gcc/testsuite/g++.dg/template/instantiate11.C25
-rw-r--r--gcc/testsuite/g++.dg/torture/pr42704.C44
-rw-r--r--gcc/testsuite/g++.dg/torture/pr42714.C37
-rw-r--r--gcc/testsuite/g++.dg/torture/pr42739.C16
-rw-r--r--gcc/testsuite/g++.dg/torture/pr42760.C46
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr42703.c12
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr42705.c58
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr42716.c18
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr42730.c14
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr42691.c41
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr42721.c21
-rw-r--r--gcc/testsuite/gcc.dg/ipa/pr42706.c27
-rw-r--r--gcc/testsuite/gcc.dg/pr39453.c18
-rw-r--r--gcc/testsuite/gcc.dg/pr42245-2.c20
-rw-r--r--gcc/testsuite/gcc.dg/pr42245.c30
-rw-r--r--gcc/testsuite/gcc.dg/pr42246.c36
-rw-r--r--gcc/testsuite/gcc.dg/pr42249.c37
-rw-r--r--gcc/testsuite/gcc.dg/pr42388.c67
-rw-r--r--gcc/testsuite/gcc.dg/pr42389.c87
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr42709.c28
-rw-r--r--gcc/testsuite/gcc.target/bfin/bfin.exp26
-rw-r--r--gcc/testsuite/gcc.target/bfin/l2.c38
-rw-r--r--gcc/testsuite/gcc.target/ia64/pr42542-1.c68
-rw-r--r--gcc/testsuite/gcc.target/ia64/pr42542-2.c68
-rw-r--r--gcc/testsuite/gcc.target/ia64/pr42542-3.c76
-rw-r--r--gcc/testsuite/gcc.target/powerpc/pr42747.c8
-rw-r--r--gcc/testsuite/gfortran.dg/alloc_comp_scalar_1.f9017
-rw-r--r--gcc/testsuite/gfortran.dg/alloc_comp_transformational_1.f9080
-rw-r--r--gcc/testsuite/gfortran.dg/generic_19.f9037
-rw-r--r--gcc/testsuite/gfortran.dg/graphite/pr42732.f23
-rw-r--r--gcc/testsuite/gfortran.dg/interface_31.f9041
-rw-r--r--gcc/testsuite/gfortran.dg/lto/20100110-1_0.f9019
-rw-r--r--gcc/testsuite/gfortran.dg/pr42246-2.f21
-rw-r--r--gcc/testsuite/gfortran.dg/pr42294.f41
-rw-r--r--gcc/tree-cfg.c9
-rw-r--r--gcc/tree-cfgcleanup.c53
-rw-r--r--gcc/tree-complex.c34
-rw-r--r--gcc/tree-inline.c6
-rw-r--r--gcc/tree-pass.h1
-rw-r--r--gcc/tree-scalar-evolution.c20
-rw-r--r--gcc/tree-scalar-evolution.h1
-rw-r--r--gcc/tree-sra.c99
-rw-r--r--gcc/tree-ssa-ccp.c4
-rw-r--r--gcc/tree-ssa-loop-im.c2
-rw-r--r--gcc/tree-ssa-reassoc.c6
-rw-r--r--gcc/tree-vect-slp.c15
-rw-r--r--gcc/var-tracking.c62
-rw-r--r--gcc/varasm.c7
-rw-r--r--include/ChangeLog5
-rw-r--r--include/dwarf2.h1
-rw-r--r--libgfortran/ChangeLog6
-rw-r--r--libgfortran/io/format.c7
-rw-r--r--libstdc++-v3/ChangeLog24
-rw-r--r--libstdc++-v3/config.h.in6
-rw-r--r--libstdc++-v3/include/c_global/cstring18
-rw-r--r--libstdc++-v3/include/c_std/cstring19
-rw-r--r--libstdc++-v3/include/profile/iterator_tracker.h28
-rw-r--r--libstdc++-v3/python/libstdcxx/v6/printers.py19
-rw-r--r--libstdc++-v3/testsuite/Makefile.am15
-rw-r--r--libstdc++-v3/testsuite/Makefile.in14
108 files changed, 4675 insertions, 391 deletions
diff --git a/ChangeLog b/ChangeLog
index 22791c4ec21..82b9781320e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2010-01-15 Thierry Lafage <thierry.lafage@inria.fr>
+
+ * MAINTAINERS (Write After Approval): Add myself.
+
+2010-01-15 Konrad Trifunovic <konrad.trifunovic@inria.fr>
+
+ * MAINTAINERS (Write After Approval): Add myself.
+
2010-01-11 Richard Guenther <rguenther@suse.de>
PR lto/41569
diff --git a/ChangeLog.MELT b/ChangeLog.MELT
index 0086b3dc876..4355f1bffb3 100644
--- a/ChangeLog.MELT
+++ b/ChangeLog.MELT
@@ -1,4 +1,8 @@
+2010-01-16 Basile Starynkevitch <basile@starynkevitch.net>
+
+ MELT branch merged with trunk rev 155960
+
2010-01-13 Basile Starynkevitch <basile@starynkevitch.net>
MELT branch merged with trunk rev 155849
diff --git a/MAINTAINERS b/MAINTAINERS
index 8bdf8ab5c24..451a234e8a9 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -385,6 +385,7 @@ Maxim Kuvyrkov maxim@codesourcery.com
Doug Kwan dougkwan@google.com
Scott Robert Ladd scott.ladd@coyotegulch.com
Razya Ladelsky razya@gcc.gnu.org
+Thierry Lafage thierry.lafage@inria.fr
Aaron W. LaFramboise aaronavay62@aaronwl.com
Rask Ingemann Lambertsen ccc94453@vip.cybercity.dk
Asher Langton langton2@llnl.gov
@@ -472,6 +473,7 @@ Gabriele Svelto gabriele.svelto@st.com
Samuel Tardieu sam@rfc1149.net
Kresten Krab Thorup krab@gcc.gnu.org
Caroline Tice ctice@apple.com
+Konrad Trifunovic konrad.trifunovic@inria.fr
David Ung davidu@mips.com
Neil Vachharajani nvachhar@gmail.com
Kris Van Hees kris.van.hees@oracle.com
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 315ebee026f..85e0daeacb9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,431 @@
+2010-01-16 Joern Rennecke <amylaar@spamcop.net>
+
+ * doc/tm.texi (TARGET_USE_BLOCKS_FOR_CONSTANT_P): Fix argument types.
+
+ (TARGET_SUPPORT_VECTOR_MISALIGNMENT): Fix argument types.
+
+ (TARGET_USE_ANCHORS_FOR_SYMBOL_P): Fix argument types.
+
+ (TARGET_SCHED_ALLOC_SCHED_CONTEXT): Put 'void *' in braces.
+
+ (TARGET_IN_SMALL_DATA_P): Fix argument type.
+
+ (TARGET_BINDS_LOCAL_P): Fix argument type.
+
+ (TARGET_ASM_FILE_END): Use prototype.
+
+ (TARGET_ASM_RECORD_GCC_SWITCHES): Don't put 'int' in braces.
+
+ (TARGET_DWARF_CALLING_CONVENTION): Fix argument type.
+
+ (TARGET_COMP_TYPE_ATTRIBUTES): Fix argument types.
+
+ (TARGET_VALID_DLLIMPORT_ATTRIBUTE_P): Fix argument type.
+
+ (TARGET_EMUTLS_VAR_ALIGN_FIXED): Don't put 'bool' in braces.
+ (TARGET_EMUTLS_DEBUG_FORM_TLS_ADDRESS): Likewise.
+
+ (TARGET_PCH_VALID_P): Put 'const char *' in braces.
+ (TARGET_CHECK_PCH_TARGET_FLAGS): Likewise.
+
+ (TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P): Don't put 'bool' in braces.
+ (TARGET_ADDR_SPACE_SUBSET_P): Likewise.
+ (TARGET_ADDR_SPACE_LEGITIMIZE_ADDRESS): Don't put 'rtx' in braces.
+ (TARGET_ADDR_SPACE_CONVERT): Likewise.
+
+ (TARGET_CASE_VALUES_THRESHOLD): Put 'unsigned int' in braces.
+
+ (TARGET_MACHINE_DEPENDENT_REORG: Use prototype.
+
+ (TARGET_INIT_BUILTINS): Use prototype.
+
+ (TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN):
+ Put 'const char *' in braces. Fix parameter types.
+ (TARGET_INVALID_CONVERSION): Fix parameter types.
+ (TARGET_INVALID_UNARY_OP, TARGET_INVALID_BINARY_OP): Likewise.
+ (TARGET_INVALID_PARAMETER_TYPE, TARGET_INVALID_RETURN_TYPE): Likewise.
+
+ (TARGET_PROMOTED_TYPE): Remove braces around 'tree'.
+ Fix argument type.
+
+ (TARGET_CONVERT_TO_TYPE): Remove braces around 'tree'.
+
+ (TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS): Remove braces around 'bool'.
+
+2010-01-15 Joern Rennecke <amylaar@spamcop.net>
+
+ * doc/tm.texi (TARGET_HELP): Fix return type.
+
+ (TARGET_PROMOTE_FUNCTION_MODE): Put 'enum machine_mode'
+ in braces. Fix argument types.
+
+ (TARGET_LIBGCC_CMP_RETURN_MODE): Use prototype.
+
+ (TARGET_LIBGCC_SHIFT_COUNT_MODE): Use prototype.
+
+ (TARGET_MS_BITFIELD_LAYOUT_P): Fix argument type.
+
+ (TARGET_DECIMAL_FLOAT_SUPPORTED_P): Don't put 'bool' in braces.
+ (TARGET_FIXED_POINT_SUPPORTED_P): Likewise.
+
+ (TARGET_MANGLE_TYPE): Fix argument types.
+
+ (TARGET_IRA_COVER_CLASSES): Use prototype.
+
+ (TARGET_BUILTIN_SETJMP_FRAME_VALUE): Fix return type. Use prototype.
+
+ (TARGET_CAN_ELIMINATE): Use identifiers for argument names.
+
+ (TARGET_PROMOTE_PROTOTYPES): Fix argument type.
+
+ (TARGET_MUST_PASS_IN_STACK): Fix argument type.
+
+ (TARGET_CALLEE_COPIES): Fix argument types.
+
+ (TARGET_SPLIT_COMPLEX_ARG): Fix argument type.
+
+ (TARGET_GIMPLIFY_VA_ARG_EXPR): Fix argument types.
+
+ (TARGET_FUNCTION_VALUE): Fix argument types.
+
+ (TARGET_RETURN_IN_MSB): Fix argument type.
+
+ (TARGET_RETURN_IN_MEMORY): Fix argument types.
+
+ (TARGET_ASM_CAN_OUTPUT_MI_THUNK): Fix argument types.
+
+ (TARGET_EXTRA_LIVE_ON_ENTRY): Fix argument type.
+
+ (TARGET_STRICT_ARGUMENT_NAMING): Make literal in text
+ agree with return type.
+
+ (TARGET_PRETEND_OUTGOING_VARARGS_NAMED): Add Prototype.
+
+2010-01-15 Jing Yu <jingyu@google.com>
+
+ PR rtl-optimization/42691
+ * combine.c (try_combine): Set changed_i3_dest to 1 when I2 and I3 set
+ a pseudo to a constant and are merged, and adjust comments.
+
+2010-01-15 Eric Botcazou <ebotcazou@adacore.com>
+
+ * config/i386/sse.md (avx_vperm2f128<mode>3): Fix typo.
+
+2010-01-15 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/42739
+ * tree-cfgcleanup.c (remove_forwarder_block): Move destination
+ labels of computed or non-local gotos to the destination.
+ * tree-cfg.c (gimple_verify_flow_info): Verify that a EH
+ landing pad label is the first label.
+
+2010-01-15 Richard Guenther <rguenther@suse.de>
+
+ * tree-ssa-loop-im.c (gen_lsm_tmp_name): Fix bogus fallthru.
+
+2010-01-14 Michael Meissner <meissner@linux.vnet.ibm.com>
+
+ PR target/42747
+ * config/rs6000/rs6000.md (sqrtdf2): Split into expander and insn
+ to allow generation of the xssqrtdp instruction on power7.
+ (sqrtdf2_fpr): Ditto.
+
+2010-01-14 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/42674
+ * c-decl.c (finish_function): Don't emit -Wreturn-type warnings in
+ functions with noreturn attribute.
+
+ PR c++/42608
+ * varasm.c (declare_weak): Add weak attribute to decl if it
+ doesn't have one already.
+ (assemble_external): Only add decls to weak_decls if they also
+ have weak attribute.
+
+2010-01-14 Alexandre Oliva <aoliva@redhat.com>
+
+ * var-tracking.c (var_reg_delete): Don't delete the association
+ between REGs and values or one-part variables if the register
+ isn't clobbered.
+
+2010-01-14 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/42657
+ * tree-inline.c (copy_debug_stmt): Don't reset debug stmt just
+ because its first operand is a non-localized variable.
+
+2010-01-14 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/42706
+ * tree-sra.c (encountered_recursive_call): New variable.
+ (encountered_unchangable_recursive_call): Likewise.
+ (sra_initialize): Initialize both new variables.
+ (callsite_has_enough_arguments_p): New function.
+ (scan_function): Call decl and flags check only for IPA-SRA, check
+ whether there is a recursive call and whether it has enough arguments.
+ (all_callers_have_enough_arguments_p): New function.
+ (convert_callers): Look for recursive calls only when
+ encountered_recursive_call is set.
+ (ipa_early_sra): Bail out either if
+ !all_callers_have_enough_arguments_p or
+ encountered_unchangable_recursive_call.
+
+2010-01-14 Alexander Monakov <amonakov@ispras.ru>
+
+ * sel-sched.c: Add 2010 to copyright years.
+ * sel-sched-ir.c: Likewise.
+ * sel-sched-ir.h: Likewise.
+
+2010-01-14 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/42714
+ * tree-sra.c (sra_ipa_modify_assign): Handle incompatible-type
+ constructors specially.
+
+2010-01-14 Andi Kleen <ak@linux.intel.com>
+
+ * config/i386/drivers-i386.c (detect_caches_intel):
+ Add l2sizekb parameter and fill in.
+ (host_detect_local_cpu): Add l2sizekb, fill in.
+ Add Atom small cache heuristic.
+
+2010-01-14 Andi Kleen <ak@linux.intel.com>
+
+ * config/i386/drivers-i386.c (detect_caches_cpuid4):
+ Add level3 parameter and fill in.
+ (detect_caches_intel): Handle level3 cache.
+
+2010-01-14 Andi Kleen <ak@linux.intel.com>
+
+ * config/i386/drivers-i386.c (host_detect_local_cpu):
+ Fix core duo detection.
+
+2010-01-14 Andi Kleen <ak@linux.intel.com>
+
+ * config/i386/drivers-i386.c (host_detect_local_cpu):
+ Fix Atom detection.
+
+2010-01-14 Alexander Monakov <amonakov@ispras.ru>
+
+ * config/rs6000/rs6000.c (rs6000_variable_issue): Rename to...
+ (rs6000_variable_issue_1): this. Use...
+ (rs6000_variable_issue): here. Reimplement. Print debug info.
+
+2010-01-14 Alexander Monakov <amonakov@ispras.ru>
+
+ * sel-sched-ir.c (sel_restore_other_notes): Rename to
+ sel_restore_notes. Update all callers. Call reemit_notes
+ for all insns.
+
+2010-01-14 Andrey Belevantsev <abel@ispras.ru>
+
+ PR rtl-optimization/42246
+ * sel-sched-ir.h (get_all_loop_exits): Include exits from inner
+ loops.
+
+2010-01-14 Andrey Belevantsev <abel@ispras.ru>
+
+ * sel-sched.c (compute_av_set_at_bb_end): Do not test that number of
+ all successors is the same as number of successors in current region.
+
+2010-01-14 Alexander Monakov <amonakov@ispras.ru>
+
+ * sel-sched.c (maybe_emit_renaming_copy): Exit early when expression
+ to rename is not separable. Otherwise check that its LHS is not NULL.
+
+2010-01-14 Alexander Monakov <amonakov@ispras.ru>
+
+ * sel-sched.c (choose_best_reg_1): Loop over all regs for mode.
+
+2010-01-14 Alexander Monakov <amonakov@ispras.ru>
+
+ * sel-sched.c (mark_unavailable_hard_regs): Do not try to search
+ available registers when failed to discover LHS register class.
+ Fix indentation. Update comment.
+
+2010-01-14 Andrey Belevantsev <abel@ispras.ru>
+ Alexander Monakov <amonakov@ispras.ru>
+
+ PR rtl-optimization/42389
+ * sel-sched.c (advance_one_cycle): Set FENCE_ISSUE_MORE
+ to can_issue_more.
+ (advance_state_on_fence): Likewise.
+ (sel_target_adjust_priority): Print debug output only when
+ sched_verbose >= 4, not 2.
+ (get_expr_cost): Do not issue all unique insns on the next cycle.
+ (fill_insns): Initialize can_issue_more from the value saved
+ with the fence.
+ * sel-sched-ir.c (flist_add): New parameter issue_more.
+ Init FENCE_ISSUE_MORE with it.
+ (merge_fences): Likewise.
+ (init_fences): Update call to flist_add.
+ (add_to_fences, add_clean_fence_to_fences)
+ (add_dirty_fence_to_fences): Likewise.
+ (move_fence_to_fences): Update call to merge_fences.
+ (invoke_reorder_hooks): Do not reset can_issue_more on insns from
+ sched groups.
+ * sel-sched-ir.h (struct _fence): New field issue_more.
+ (FENCE_ISSUE_MORE): New accessor macro.
+
+2010-01-14 Andrey Belevantsev <abel@ispras.ru>
+
+ PR rtl-optimization/42388
+ * sel-sched-ir.c (maybe_tidy_empty_bb): Do not delete empty blocks
+ that have no predecessors nor successors. Do not call move_bb_info
+ for empty blocks outside of current region.
+
+2010-01-14 Alexander Monakov <amonakov@ispras.ru>
+
+ PR rtl-optimization/42294
+ * sel-sched-ir.h (struct _sel_insn_data): Update comment.
+ * sel-sched.c (move_exprs_to_boundary): Transitively add all
+ originators' originators.
+
+2010-01-14 Alexander Monakov <amonakov@ispras.ru>
+
+ PR rtl-optimization/39453
+ PR rtl-optimization/42246
+ * sel-sched-ir.c (considered_for_pipelining_p): Do not test
+ for pipelining_p.
+ (sel_add_loop_preheaders): Add preheader to last_added_blocks.
+
+2010-01-14 Andrey Belevantsev <abel@ispras.ru>
+ Alexander Monakov <amonakov@ispras.ru>
+
+ PR middle-end/42245
+ * sel-sched-ir.c (sel_recompute_toporder): New. Use it...
+ (maybe_tidy_empty_bb): ... here. Make static. Add new
+ argument. Update all callers.
+ (tidy_control_flow): ... and here. Recompute topological order
+ of basic blocks in region if necessary.
+ (sel_redirect_edge_and_branch): Change return type. Return true
+ if topological order might have been invalidated.
+ (purge_empty_blocks): Export and move from...
+ * sel-sched.c (purge_empty_blocks): ... here.
+ * sel-sched-ir.h (sel_redirect_edge_and_branch): Update prototype.
+ (maybe_tidy_empty_bb): Delete prototype.
+ (purge_empty_blocks): Declare.
+
+2010-01-14 Andrey Belevantsev <abel@ispras.ru>
+
+ PR rtl-optimization/42249
+ * sel-sched.c (try_replace_dest_reg): When chosen register
+ and original register is the same, do not bail out early, but
+ still check all original insns for validity of replacing destination
+ register. Set EXPR_TARGET_AVAILABLE to 1 before leaving function
+ in this case.
+
+2010-01-14 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/42721
+ Port from no-undefined-overflow branch:
+ 2009-03-09 Richard Guenther <rguenther@suse.de>
+
+ * fold-const.c (add_double_with_sign): Fix unsigned overflow detection.
+
+2010-01-14 Richard Guenther <rguenther@suse.de>
+
+ PR lto/42665
+ * gimple.c (iterative_hash_gimple_type): Avoid hashing
+ error_mark_node.
+
+2010-01-14 Ira Rosen <irar@il.ibm.com>
+
+ PR tree-optimization/42709
+ * tree-vect-slp.c (vect_get_constant_vectors): Use constant's type
+ as scalar type in creation of constant vector operand.
+
+2010-01-14 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ PR testsuite/42414
+ * Makefile.in ($(TESTSUITEDIR)/site.exp, check-%)
+ (check-parallel-%): Match `testsuite' directory component only
+ at the end.
+
+2010-01-14 Shujing Zhao <pearly.zhao@oracle.com>
+
+ PR translation/39521
+ * gcc.c (do_spec_1): Wrapped the error and notice messages of specs
+ strings with _().
+
+2010-01-13 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/42730
+ * tree-ssa-ccp.c (maybe_fold_stmt_indirect): Add shortcut for
+ offset zero.
+
+2010-01-13 Steve Ellcey <sje@cup.hp.com>
+
+ PR target/pr42542
+ * config/ia64/ia64.c (ia64_expand_vecint_compare): Convert GTU to GT
+ for V2SI by subtracting (-(INT MAX) - 1) from both operands to make
+ them signed.
+
+2010-01-13 Bernd Schmidt <bernd.schmidt@analog.com>
+
+ * config/bfin/libgcc-bfin.ver: Regenerate based on current
+ libgcc-std.ver. Add entries for ___smulsi3_highpart and
+ ___umulsi3_highpart.
+
+ * config/bfin/bfin.c (bfin_reorg): Call run_selective_scheduling
+ rather than schedule_insns if the pass is enabled.
+
+2010-01-13 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/42704
+ * tree-sra.c (sra_modify_assign): Do not delete assignments to
+ SSA_NAMEs.
+
+2010-01-13 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/42703
+ * tree-sra.c (analyze_access_subtree): Check that we can build a
+ reference to the original data within the aggregate.
+
+2010-01-13 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/42705
+ * tree-ssa-reassoc.c (build_and_add_sum): Insert stmts after
+ labels.
+
+2010-01-13 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/42716
+ * fold-const.c (fold_unary_loc): Fold INDIRECT_REFs.
+
+2010-01-13 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/41371
+ * var-tracking.c (values_to_unmark): New variable.
+ (find_loc_in_1pdv): Clear VALUE_RECURSED_INTO of values in
+ values_to_unmark vector. Moved body to...
+ (find_loc_in_1pdv_1): ... this. Don't clear VALUE_RECURSED_INTO,
+ instead queue it into values_to_unmark vector.
+ (vt_find_locations): Free values_to_unmark vector.
+
+2010-01-13 Wolfgang Gellerich <gellerich@de.ibm.com>
+
+ * config/s390/s390.c (override_options): Set
+ default of max-pending-list-length to 256
+
+2010-01-13 Richard Guenther <rguenther@suse.de>
+
+ PR lto/42678
+ * tree-pass.h (PROP_gimple_lcx): New.
+ * cfgexpand.c (pass_expand): Require PROP_gimple_lcx.
+ * passes.c (init_optimization_passes): Move pass_lower_complex_O0
+ before the final cleanup_eh.
+ (dump_properties): Dump PROP_gimple_lcx.
+ * tree-complex.c (pass_lower_complex): Provide PROP_gimple_lcx.
+ (tree_lower_complex_O0): Remove.
+ (gate_no_optimization): Run if PROP_gimple_lcx is not set.
+ (pass_lower_complex_O0): Provide PROP_gimple_lcx. Run
+ tree_lower_complex, schedule TODO_update_ssa.
+ * lto-streamer-out.c (output_function): Stream the functions
+ properties.
+ * lto-streamer-in.c (input_function): Likewise.
+ (lto_read_body): Do not override them here.
+
2010-01-12 Joseph Myers <joseph@codesourcery.com>
PR c/42708
@@ -20,9 +448,9 @@
2010-01-12 Julian Brown <julian@codesourcery.com>
- * config/arm/neon-schedgen.ml (Utils): Don't try to
+ * config/arm/neon-schedgen.ml (Utils): Don't try to
open missing module.
- (find_with_result): New.
+ (find_with_result): New.
2010-01-12 Jakub Jelinek <jakub@redhat.com>
@@ -43,7 +471,7 @@
2010-01-11 Andy Hutchinson <hutchinsonandy@gcc.gnu.org>
- * config/avr/avr.h (LINKER_NAME): Remove.
+ * config/avr/avr.h (LINKER_NAME): Remove.
2010-01-11 Janis Johnson <janis187@us.ibm.com>
@@ -54,7 +482,7 @@
2010-01-11 Joseph Myers <joseph@codesourcery.com>
Shujing Zhao <pearly.zhao@oracle.com>
-
+
PR translation/42469
* common.opt (Wframe-larger-than=, fcompare-debug=, fdbg-cnt=,
fira-verbose=, flto-compression-level=, fplugin-arg-): Use tab
@@ -176,7 +604,7 @@
(*rotw<mode>3): New.
(*rotb<mode>3): New.
* config/avr/avr.c (avr_rotate_bytes): New function.
- * config/avr/avr-proto.h (avr_rotate_bytes): New function.
+ * config/avr/avr-proto.h (avr_rotate_bytes): New function.
2010-01-08 Steve Ellcey <sje@cup.hp.com>
@@ -284,7 +712,7 @@
(concat_note_lists): ... here, and ...
(unlink_other_notes, rm_other_notes): Merge into...
(remove_notes): ... here. Create REG_SAVE_NOTEs for
- NOTE_INSN_EPILOGUE_BEG.
+ NOTE_INSN_EPILOGUE_BEG.
2010-01-06 Richard Guenther <rguenther@suse.de>
diff --git a/gcc/ChangeLog.graphite b/gcc/ChangeLog.graphite
index 9ea58261e22..c2bb01e07bd 100644
--- a/gcc/ChangeLog.graphite
+++ b/gcc/ChangeLog.graphite
@@ -1,3 +1,34 @@
+2010-01-14 Sebastian Pop <sebastian.pop@amd.com>
+
+ PR middle-end/42681
+ * graphite-clast-to-gimple.c (gloog_error): New static variable.
+ (clast_to_gcc_expression): Do not build MULT_EXPR of POINTER_TYPE_P.
+ Set gloog_error when such an expression failed to be built.
+ (translate_clast): Early return when gloog_error is set.
+ (gloog): Clear gloog_error. When gloog_error is set, call
+ set_ifsese_condition to enable the original code. Return the status
+ of the code generation based on gloog_error.
+ * sese.c (set_ifsese_condition): New.
+ * sese.h (set_ifsese_condition): Declared.
+
+ * testsuite/g++.dg/graphite/pr42681.C: New.
+
+2010-01-14 Sebastian Pop <sebastian.pop@amd.com>
+
+ PR middle-end/42732
+ * graphite-clast-to-gimple.c (gloog): Call scev_reset_htab and
+ rename_nb_iterations.
+ * sese.c (rename_variables_in_operand): New.
+ (rename_variables_in_expr): New.
+ (rename_nb_iterations): New.
+ (sese_adjust_liveout_phis): Update the rename_map.
+ * sese.h (rename_nb_iterations): Declared.
+ * tree-scalar-evolution.c (scev_reset_htab): New.
+ (scev_reset): Call scev_reset_htab.
+ * tree-scalar-evolution.h (scev_reset_htab): Declared.
+
+ * testsuite/gfortran.dg/graphite/pr42732.f: New.
+
2010-01-08 Sebastian Pop <sebastian.pop@amd.com>
PR middle-end/42393
diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP
index 835ccd87d44..3d99ded7fcf 100644
--- a/gcc/DATESTAMP
+++ b/gcc/DATESTAMP
@@ -1 +1 @@
-20100113
+20100116
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index ca6b82b1e13..11cfc741d62 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -4742,7 +4742,7 @@ TESTSUITEDIR = testsuite
$(TESTSUITEDIR)/site.exp: site.exp
-test -d $(TESTSUITEDIR) || mkdir $(TESTSUITEDIR)
-rm -f $@
- sed '/set tmpdir/ s|testsuite|$(TESTSUITEDIR)|' < site.exp > $@
+ sed '/set tmpdir/ s|testsuite$$|$(TESTSUITEDIR)|' < site.exp > $@
# This is only used for check-% targets that aren't parallelized.
$(filter-out $(lang_checks_parallelized),$(lang_checks)): check-% : site.exp
@@ -4752,7 +4752,7 @@ $(filter-out $(lang_checks_parallelized),$(lang_checks)): check-% : site.exp
srcdir=`cd ${srcdir}; ${PWD_COMMAND}` ; export srcdir ; \
cd $(TESTSUITEDIR)/$*; \
rm -f tmp-site.exp; \
- sed '/set tmpdir/ s|testsuite|$(TESTSUITEDIR)/$*|' \
+ sed '/set tmpdir/ s|testsuite$$|$(TESTSUITEDIR)/$*|' \
< ../../site.exp > tmp-site.exp; \
$(SHELL) $${srcdir}/../move-if-change tmp-site.exp site.exp; \
EXPECT=${EXPECT} ; export EXPECT ; \
@@ -4839,7 +4839,7 @@ check-parallel-% : site.exp
srcdir=`cd ${srcdir}; ${PWD_COMMAND}` ; export srcdir ; \
cd $(TESTSUITEDIR)/$(check_p_subdir); \
rm -f tmp-site.exp; \
- sed '/set tmpdir/ s|testsuite|$(TESTSUITEDIR)/$(check_p_subdir)|' \
+ sed '/set tmpdir/ s|testsuite$$|$(TESTSUITEDIR)/$(check_p_subdir)|' \
< ../../site.exp > tmp-site.exp; \
$(SHELL) $${srcdir}/../move-if-change tmp-site.exp site.exp; \
EXPECT=${EXPECT} ; export EXPECT ; \
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index a244a83e787..91d58844550 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -8032,6 +8032,8 @@ finish_function (void)
&& !current_function_returns_value && !current_function_returns_null
/* Don't complain if we are no-return. */
&& !current_function_returns_abnormally
+ /* Don't complain if we are declared noreturn. */
+ && !TREE_THIS_VOLATILE (fndecl)
/* Don't warn for main(). */
&& !MAIN_NAME_P (DECL_NAME (fndecl))
/* Or if they didn't actually specify a return type. */
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index 7e542da3320..70d2b355aa1 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -3743,7 +3743,8 @@ struct rtl_opt_pass pass_expand =
NULL, /* next */
0, /* static_pass_number */
TV_EXPAND, /* tv_id */
- PROP_ssa | PROP_gimple_leh | PROP_cfg,/* properties_required */
+ PROP_ssa | PROP_gimple_leh | PROP_cfg
+ | PROP_gimple_lcx, /* properties_required */
PROP_rtl, /* properties_provided */
PROP_ssa | PROP_trees, /* properties_destroyed */
TODO_verify_ssa | TODO_verify_flow
diff --git a/gcc/combine.c b/gcc/combine.c
index 5ae557c180a..e5d4c5aafc2 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -2663,10 +2663,16 @@ try_combine (rtx i3, rtx i2, rtx i1, int *new_direct_jump_p)
i2dest = SET_DEST (temp);
i2dest_killed = dead_or_set_p (i2, i2dest);
+ /* Replace the source in I2 with the new constant and make the
+ resulting insn the new pattern for I3. Then skip to where we
+ validate the pattern. Everything was set up above. */
SUBST (SET_SRC (temp),
immed_double_const (olo, ohi, GET_MODE (SET_DEST (temp))));
newpat = PATTERN (i2);
+
+ /* The dest of I3 has been replaced with the dest of I2. */
+ changed_i3_dest = 1;
goto validate_replacement;
}
}
@@ -3038,8 +3044,6 @@ try_combine (rtx i3, rtx i2, rtx i1, int *new_direct_jump_p)
}
}
- /* We come here when we are replacing a destination in I2 with the
- destination of I3. */
validate_replacement:
/* Note which hard regs this insn has as inputs. */
diff --git a/gcc/config/bfin/bfin.c b/gcc/config/bfin/bfin.c
index 32d72abc2aa..9635d5a627d 100644
--- a/gcc/config/bfin/bfin.c
+++ b/gcc/config/bfin/bfin.c
@@ -5499,7 +5499,11 @@ bfin_reorg (void)
add_sched_insns_for_speculation ();
timevar_push (TV_SCHED2);
- schedule_insns ();
+ if (flag_selective_scheduling2
+ && !maybe_skip_selective_scheduling ())
+ run_selective_scheduling ();
+ else
+ schedule_insns ();
timevar_pop (TV_SCHED2);
/* Examine the schedule and insert nops as necessary for 64-bit parallel
diff --git a/gcc/config/bfin/libgcc-bfin.ver b/gcc/config/bfin/libgcc-bfin.ver
index a10a0f0a6ef..2ed3a317b51 100644
--- a/gcc/config/bfin/libgcc-bfin.ver
+++ b/gcc/config/bfin/libgcc-bfin.ver
@@ -1,5 +1,5 @@
-# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006,
-# 2007 Free Software Foundation, Inc.
+# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+# 2008, 2009, 2010 Free Software Foundation, Inc.
#
# This file is part of GCC.
#
@@ -255,7 +255,7 @@ GCC_3.4.4 {
%inherit GCC_4.0.0 GCC_3.4.4
GCC_4.0.0 {
- # libgcc2 ___builtin_powi helpers.
+ # libgcc2 __builtin_powi helpers.
___powisf2
___powidf2
___powixf2
@@ -274,6 +274,8 @@ GCC_4.0.0 {
%inherit GCC_4.1.0 GCC_4.0.0
GCC_4.1.0 {
+ ___smulsi3_highpart
+ ___umulsi3_highpart
}
%inherit GCC_4.2.0 GCC_4.1.0
@@ -301,4 +303,1606 @@ GCC_4.3.0 {
___bswapdi2
___emutls_get_address
___emutls_register_common
+ ___ffssi2
+ ___extendxftf2
+ ___trunctfxf2
+
+ # fixed-point routines
+ ___addqq3
+ ___addhq3
+ ___addsq3
+ ___adddq3
+ ___addtq3
+ ___adduqq3
+ ___adduhq3
+ ___addusq3
+ ___addudq3
+ ___addutq3
+ ___addha3
+ ___addsa3
+ ___addda3
+ ___addta3
+ ___adduha3
+ ___addusa3
+ ___adduda3
+ ___adduta3
+ ___ssaddqq3
+ ___ssaddhq3
+ ___ssaddsq3
+ ___ssadddq3
+ ___ssaddtq3
+ ___ssaddha3
+ ___ssaddsa3
+ ___ssaddda3
+ ___ssaddta3
+ ___usadduqq3
+ ___usadduhq3
+ ___usaddusq3
+ ___usaddudq3
+ ___usaddutq3
+ ___usadduha3
+ ___usaddusa3
+ ___usadduda3
+ ___usadduta3
+ ___subqq3
+ ___subhq3
+ ___subsq3
+ ___subdq3
+ ___subtq3
+ ___subuqq3
+ ___subuhq3
+ ___subusq3
+ ___subudq3
+ ___subutq3
+ ___subha3
+ ___subsa3
+ ___subda3
+ ___subta3
+ ___subuha3
+ ___subusa3
+ ___subuda3
+ ___subuta3
+ ___sssubqq3
+ ___sssubhq3
+ ___sssubsq3
+ ___sssubdq3
+ ___sssubtq3
+ ___sssubha3
+ ___sssubsa3
+ ___sssubda3
+ ___sssubta3
+ ___ussubuqq3
+ ___ussubuhq3
+ ___ussubusq3
+ ___ussubudq3
+ ___ussubutq3
+ ___ussubuha3
+ ___ussubusa3
+ ___ussubuda3
+ ___ussubuta3
+ ___mulqq3
+ ___mulhq3
+ ___mulsq3
+ ___muldq3
+ ___multq3
+ ___muluqq3
+ ___muluhq3
+ ___mulusq3
+ ___muludq3
+ ___mulutq3
+ ___mulha3
+ ___mulsa3
+ ___mulda3
+ ___multa3
+ ___muluha3
+ ___mulusa3
+ ___muluda3
+ ___muluta3
+ ___ssmulqq3
+ ___ssmulhq3
+ ___ssmulsq3
+ ___ssmuldq3
+ ___ssmultq3
+ ___ssmulha3
+ ___ssmulsa3
+ ___ssmulda3
+ ___ssmulta3
+ ___usmuluqq3
+ ___usmuluhq3
+ ___usmulusq3
+ ___usmuludq3
+ ___usmulutq3
+ ___usmuluha3
+ ___usmulusa3
+ ___usmuluda3
+ ___usmuluta3
+ ___divqq3
+ ___divhq3
+ ___divsq3
+ ___divdq3
+ ___divtq3
+ ___divha3
+ ___divsa3
+ ___divda3
+ ___divta3
+ ___udivuqq3
+ ___udivuhq3
+ ___udivusq3
+ ___udivudq3
+ ___udivutq3
+ ___udivuha3
+ ___udivusa3
+ ___udivuda3
+ ___udivuta3
+ ___ssdivqq3
+ ___ssdivhq3
+ ___ssdivsq3
+ ___ssdivdq3
+ ___ssdivtq3
+ ___ssdivha3
+ ___ssdivsa3
+ ___ssdivda3
+ ___ssdivta3
+ ___usdivuqq3
+ ___usdivuhq3
+ ___usdivusq3
+ ___usdivudq3
+ ___usdivutq3
+ ___usdivuha3
+ ___usdivusa3
+ ___usdivuda3
+ ___usdivuta3
+ ___negqq2
+ ___neghq2
+ ___negsq2
+ ___negdq2
+ ___negtq2
+ ___neguqq2
+ ___neguhq2
+ ___negusq2
+ ___negudq2
+ ___negutq2
+ ___negha2
+ ___negsa2
+ ___negda2
+ ___negta2
+ ___neguha2
+ ___negusa2
+ ___neguda2
+ ___neguta2
+ ___ssnegqq2
+ ___ssneghq2
+ ___ssnegsq2
+ ___ssnegdq2
+ ___ssnegtq2
+ ___ssnegha2
+ ___ssnegsa2
+ ___ssnegda2
+ ___ssnegta2
+ ___usneguqq2
+ ___usneguhq2
+ ___usnegusq2
+ ___usnegudq2
+ ___usnegutq2
+ ___usneguha2
+ ___usnegusa2
+ ___usneguda2
+ ___usneguta2
+ ___ashlqq3
+ ___ashlhq3
+ ___ashlsq3
+ ___ashldq3
+ ___ashltq3
+ ___ashluqq3
+ ___ashluhq3
+ ___ashlusq3
+ ___ashludq3
+ ___ashlutq3
+ ___ashlha3
+ ___ashlsa3
+ ___ashlda3
+ ___ashlta3
+ ___ashluha3
+ ___ashlusa3
+ ___ashluda3
+ ___ashluta3
+ ___ashrqq3
+ ___ashrhq3
+ ___ashrsq3
+ ___ashrdq3
+ ___ashrtq3
+ ___ashrha3
+ ___ashrsa3
+ ___ashrda3
+ ___ashrta3
+ ___lshruqq3
+ ___lshruhq3
+ ___lshrusq3
+ ___lshrudq3
+ ___lshrutq3
+ ___lshruha3
+ ___lshrusa3
+ ___lshruda3
+ ___lshruta3
+ ___ssashlqq3
+ ___ssashlhq3
+ ___ssashlsq3
+ ___ssashldq3
+ ___ssashltq3
+ ___ssashlha3
+ ___ssashlsa3
+ ___ssashlda3
+ ___ssashlta3
+ ___usashluqq3
+ ___usashluhq3
+ ___usashlusq3
+ ___usashludq3
+ ___usashlutq3
+ ___usashluha3
+ ___usashlusa3
+ ___usashluda3
+ ___usashluta3
+ ___cmpqq2
+ ___cmphq2
+ ___cmpsq2
+ ___cmpdq2
+ ___cmptq2
+ ___cmpuqq2
+ ___cmpuhq2
+ ___cmpusq2
+ ___cmpudq2
+ ___cmputq2
+ ___cmpha2
+ ___cmpsa2
+ ___cmpda2
+ ___cmpta2
+ ___cmpuha2
+ ___cmpusa2
+ ___cmpuda2
+ ___cmputa2
+ ___fractqqhq2
+ ___fractqqsq2
+ ___fractqqdq2
+ ___fractqqtq2
+ ___fractqqha
+ ___fractqqsa
+ ___fractqqda
+ ___fractqqta
+ ___fractqquqq
+ ___fractqquhq
+ ___fractqqusq
+ ___fractqqudq
+ ___fractqqutq
+ ___fractqquha
+ ___fractqqusa
+ ___fractqquda
+ ___fractqquta
+ ___fractqqqi
+ ___fractqqhi
+ ___fractqqsi
+ ___fractqqdi
+ ___fractqqti
+ ___fractqqsf
+ ___fractqqdf
+ ___fracthqqq2
+ ___fracthqsq2
+ ___fracthqdq2
+ ___fracthqtq2
+ ___fracthqha
+ ___fracthqsa
+ ___fracthqda
+ ___fracthqta
+ ___fracthquqq
+ ___fracthquhq
+ ___fracthqusq
+ ___fracthqudq
+ ___fracthqutq
+ ___fracthquha
+ ___fracthqusa
+ ___fracthquda
+ ___fracthquta
+ ___fracthqqi
+ ___fracthqhi
+ ___fracthqsi
+ ___fracthqdi
+ ___fracthqti
+ ___fracthqsf
+ ___fracthqdf
+ ___fractsqqq2
+ ___fractsqhq2
+ ___fractsqdq2
+ ___fractsqtq2
+ ___fractsqha
+ ___fractsqsa
+ ___fractsqda
+ ___fractsqta
+ ___fractsquqq
+ ___fractsquhq
+ ___fractsqusq
+ ___fractsqudq
+ ___fractsqutq
+ ___fractsquha
+ ___fractsqusa
+ ___fractsquda
+ ___fractsquta
+ ___fractsqqi
+ ___fractsqhi
+ ___fractsqsi
+ ___fractsqdi
+ ___fractsqti
+ ___fractsqsf
+ ___fractsqdf
+ ___fractdqqq2
+ ___fractdqhq2
+ ___fractdqsq2
+ ___fractdqtq2
+ ___fractdqha
+ ___fractdqsa
+ ___fractdqda
+ ___fractdqta
+ ___fractdquqq
+ ___fractdquhq
+ ___fractdqusq
+ ___fractdqudq
+ ___fractdqutq
+ ___fractdquha
+ ___fractdqusa
+ ___fractdquda
+ ___fractdquta
+ ___fractdqqi
+ ___fractdqhi
+ ___fractdqsi
+ ___fractdqdi
+ ___fractdqti
+ ___fractdqsf
+ ___fractdqdf
+ ___fracttqqq2
+ ___fracttqhq2
+ ___fracttqsq2
+ ___fracttqdq2
+ ___fracttqha
+ ___fracttqsa
+ ___fracttqda
+ ___fracttqta
+ ___fracttquqq
+ ___fracttquhq
+ ___fracttqusq
+ ___fracttqudq
+ ___fracttqutq
+ ___fracttquha
+ ___fracttqusa
+ ___fracttquda
+ ___fracttquta
+ ___fracttqqi
+ ___fracttqhi
+ ___fracttqsi
+ ___fracttqdi
+ ___fracttqti
+ ___fracttqsf
+ ___fracttqdf
+ ___fracthaqq
+ ___fracthahq
+ ___fracthasq
+ ___fracthadq
+ ___fracthatq
+ ___fracthasa2
+ ___fracthada2
+ ___fracthata2
+ ___fracthauqq
+ ___fracthauhq
+ ___fracthausq
+ ___fracthaudq
+ ___fracthautq
+ ___fracthauha
+ ___fracthausa
+ ___fracthauda
+ ___fracthauta
+ ___fracthaqi
+ ___fracthahi
+ ___fracthasi
+ ___fracthadi
+ ___fracthati
+ ___fracthasf
+ ___fracthadf
+ ___fractsaqq
+ ___fractsahq
+ ___fractsasq
+ ___fractsadq
+ ___fractsatq
+ ___fractsaha2
+ ___fractsada2
+ ___fractsata2
+ ___fractsauqq
+ ___fractsauhq
+ ___fractsausq
+ ___fractsaudq
+ ___fractsautq
+ ___fractsauha
+ ___fractsausa
+ ___fractsauda
+ ___fractsauta
+ ___fractsaqi
+ ___fractsahi
+ ___fractsasi
+ ___fractsadi
+ ___fractsati
+ ___fractsasf
+ ___fractsadf
+ ___fractdaqq
+ ___fractdahq
+ ___fractdasq
+ ___fractdadq
+ ___fractdatq
+ ___fractdaha2
+ ___fractdasa2
+ ___fractdata2
+ ___fractdauqq
+ ___fractdauhq
+ ___fractdausq
+ ___fractdaudq
+ ___fractdautq
+ ___fractdauha
+ ___fractdausa
+ ___fractdauda
+ ___fractdauta
+ ___fractdaqi
+ ___fractdahi
+ ___fractdasi
+ ___fractdadi
+ ___fractdati
+ ___fractdasf
+ ___fractdadf
+ ___fracttaqq
+ ___fracttahq
+ ___fracttasq
+ ___fracttadq
+ ___fracttatq
+ ___fracttaha2
+ ___fracttasa2
+ ___fracttada2
+ ___fracttauqq
+ ___fracttauhq
+ ___fracttausq
+ ___fracttaudq
+ ___fracttautq
+ ___fracttauha
+ ___fracttausa
+ ___fracttauda
+ ___fracttauta
+ ___fracttaqi
+ ___fracttahi
+ ___fracttasi
+ ___fracttadi
+ ___fracttati
+ ___fracttasf
+ ___fracttadf
+ ___fractuqqqq
+ ___fractuqqhq
+ ___fractuqqsq
+ ___fractuqqdq
+ ___fractuqqtq
+ ___fractuqqha
+ ___fractuqqsa
+ ___fractuqqda
+ ___fractuqqta
+ ___fractuqquhq2
+ ___fractuqqusq2
+ ___fractuqqudq2
+ ___fractuqqutq2
+ ___fractuqquha
+ ___fractuqqusa
+ ___fractuqquda
+ ___fractuqquta
+ ___fractuqqqi
+ ___fractuqqhi
+ ___fractuqqsi
+ ___fractuqqdi
+ ___fractuqqti
+ ___fractuqqsf
+ ___fractuqqdf
+ ___fractuhqqq
+ ___fractuhqhq
+ ___fractuhqsq
+ ___fractuhqdq
+ ___fractuhqtq
+ ___fractuhqha
+ ___fractuhqsa
+ ___fractuhqda
+ ___fractuhqta
+ ___fractuhquqq2
+ ___fractuhqusq2
+ ___fractuhqudq2
+ ___fractuhqutq2
+ ___fractuhquha
+ ___fractuhqusa
+ ___fractuhquda
+ ___fractuhquta
+ ___fractuhqqi
+ ___fractuhqhi
+ ___fractuhqsi
+ ___fractuhqdi
+ ___fractuhqti
+ ___fractuhqsf
+ ___fractuhqdf
+ ___fractusqqq
+ ___fractusqhq
+ ___fractusqsq
+ ___fractusqdq
+ ___fractusqtq
+ ___fractusqha
+ ___fractusqsa
+ ___fractusqda
+ ___fractusqta
+ ___fractusquqq2
+ ___fractusquhq2
+ ___fractusqudq2
+ ___fractusqutq2
+ ___fractusquha
+ ___fractusqusa
+ ___fractusquda
+ ___fractusquta
+ ___fractusqqi
+ ___fractusqhi
+ ___fractusqsi
+ ___fractusqdi
+ ___fractusqti
+ ___fractusqsf
+ ___fractusqdf
+ ___fractudqqq
+ ___fractudqhq
+ ___fractudqsq
+ ___fractudqdq
+ ___fractudqtq
+ ___fractudqha
+ ___fractudqsa
+ ___fractudqda
+ ___fractudqta
+ ___fractudquqq2
+ ___fractudquhq2
+ ___fractudqusq2
+ ___fractudqutq2
+ ___fractudquha
+ ___fractudqusa
+ ___fractudquda
+ ___fractudquta
+ ___fractudqqi
+ ___fractudqhi
+ ___fractudqsi
+ ___fractudqdi
+ ___fractudqti
+ ___fractudqsf
+ ___fractudqdf
+ ___fractutqqq
+ ___fractutqhq
+ ___fractutqsq
+ ___fractutqdq
+ ___fractutqtq
+ ___fractutqha
+ ___fractutqsa
+ ___fractutqda
+ ___fractutqta
+ ___fractutquqq2
+ ___fractutquhq2
+ ___fractutqusq2
+ ___fractutqudq2
+ ___fractutquha
+ ___fractutqusa
+ ___fractutquda
+ ___fractutquta
+ ___fractutqqi
+ ___fractutqhi
+ ___fractutqsi
+ ___fractutqdi
+ ___fractutqti
+ ___fractutqsf
+ ___fractutqdf
+ ___fractuhaqq
+ ___fractuhahq
+ ___fractuhasq
+ ___fractuhadq
+ ___fractuhatq
+ ___fractuhaha
+ ___fractuhasa
+ ___fractuhada
+ ___fractuhata
+ ___fractuhauqq
+ ___fractuhauhq
+ ___fractuhausq
+ ___fractuhaudq
+ ___fractuhautq
+ ___fractuhausa2
+ ___fractuhauda2
+ ___fractuhauta2
+ ___fractuhaqi
+ ___fractuhahi
+ ___fractuhasi
+ ___fractuhadi
+ ___fractuhati
+ ___fractuhasf
+ ___fractuhadf
+ ___fractusaqq
+ ___fractusahq
+ ___fractusasq
+ ___fractusadq
+ ___fractusatq
+ ___fractusaha
+ ___fractusasa
+ ___fractusada
+ ___fractusata
+ ___fractusauqq
+ ___fractusauhq
+ ___fractusausq
+ ___fractusaudq
+ ___fractusautq
+ ___fractusauha2
+ ___fractusauda2
+ ___fractusauta2
+ ___fractusaqi
+ ___fractusahi
+ ___fractusasi
+ ___fractusadi
+ ___fractusati
+ ___fractusasf
+ ___fractusadf
+ ___fractudaqq
+ ___fractudahq
+ ___fractudasq
+ ___fractudadq
+ ___fractudatq
+ ___fractudaha
+ ___fractudasa
+ ___fractudada
+ ___fractudata
+ ___fractudauqq
+ ___fractudauhq
+ ___fractudausq
+ ___fractudaudq
+ ___fractudautq
+ ___fractudauha2
+ ___fractudausa2
+ ___fractudauta2
+ ___fractudaqi
+ ___fractudahi
+ ___fractudasi
+ ___fractudadi
+ ___fractudati
+ ___fractudasf
+ ___fractudadf
+ ___fractutaqq
+ ___fractutahq
+ ___fractutasq
+ ___fractutadq
+ ___fractutatq
+ ___fractutaha
+ ___fractutasa
+ ___fractutada
+ ___fractutata
+ ___fractutauqq
+ ___fractutauhq
+ ___fractutausq
+ ___fractutaudq
+ ___fractutautq
+ ___fractutauha2
+ ___fractutausa2
+ ___fractutauda2
+ ___fractutaqi
+ ___fractutahi
+ ___fractutasi
+ ___fractutadi
+ ___fractutati
+ ___fractutasf
+ ___fractutadf
+ ___fractqiqq
+ ___fractqihq
+ ___fractqisq
+ ___fractqidq
+ ___fractqitq
+ ___fractqiha
+ ___fractqisa
+ ___fractqida
+ ___fractqita
+ ___fractqiuqq
+ ___fractqiuhq
+ ___fractqiusq
+ ___fractqiudq
+ ___fractqiutq
+ ___fractqiuha
+ ___fractqiusa
+ ___fractqiuda
+ ___fractqiuta
+ ___fracthiqq
+ ___fracthihq
+ ___fracthisq
+ ___fracthidq
+ ___fracthitq
+ ___fracthiha
+ ___fracthisa
+ ___fracthida
+ ___fracthita
+ ___fracthiuqq
+ ___fracthiuhq
+ ___fracthiusq
+ ___fracthiudq
+ ___fracthiutq
+ ___fracthiuha
+ ___fracthiusa
+ ___fracthiuda
+ ___fracthiuta
+ ___fractsiqq
+ ___fractsihq
+ ___fractsisq
+ ___fractsidq
+ ___fractsitq
+ ___fractsiha
+ ___fractsisa
+ ___fractsida
+ ___fractsita
+ ___fractsiuqq
+ ___fractsiuhq
+ ___fractsiusq
+ ___fractsiudq
+ ___fractsiutq
+ ___fractsiuha
+ ___fractsiusa
+ ___fractsiuda
+ ___fractsiuta
+ ___fractdiqq
+ ___fractdihq
+ ___fractdisq
+ ___fractdidq
+ ___fractditq
+ ___fractdiha
+ ___fractdisa
+ ___fractdida
+ ___fractdita
+ ___fractdiuqq
+ ___fractdiuhq
+ ___fractdiusq
+ ___fractdiudq
+ ___fractdiutq
+ ___fractdiuha
+ ___fractdiusa
+ ___fractdiuda
+ ___fractdiuta
+ ___fracttiqq
+ ___fracttihq
+ ___fracttisq
+ ___fracttidq
+ ___fracttitq
+ ___fracttiha
+ ___fracttisa
+ ___fracttida
+ ___fracttita
+ ___fracttiuqq
+ ___fracttiuhq
+ ___fracttiusq
+ ___fracttiudq
+ ___fracttiutq
+ ___fracttiuha
+ ___fracttiusa
+ ___fracttiuda
+ ___fracttiuta
+ ___fractsfqq
+ ___fractsfhq
+ ___fractsfsq
+ ___fractsfdq
+ ___fractsftq
+ ___fractsfha
+ ___fractsfsa
+ ___fractsfda
+ ___fractsfta
+ ___fractsfuqq
+ ___fractsfuhq
+ ___fractsfusq
+ ___fractsfudq
+ ___fractsfutq
+ ___fractsfuha
+ ___fractsfusa
+ ___fractsfuda
+ ___fractsfuta
+ ___fractdfqq
+ ___fractdfhq
+ ___fractdfsq
+ ___fractdfdq
+ ___fractdftq
+ ___fractdfha
+ ___fractdfsa
+ ___fractdfda
+ ___fractdfta
+ ___fractdfuqq
+ ___fractdfuhq
+ ___fractdfusq
+ ___fractdfudq
+ ___fractdfutq
+ ___fractdfuha
+ ___fractdfusa
+ ___fractdfuda
+ ___fractdfuta
+ ___satfractqqhq2
+ ___satfractqqsq2
+ ___satfractqqdq2
+ ___satfractqqtq2
+ ___satfractqqha
+ ___satfractqqsa
+ ___satfractqqda
+ ___satfractqqta
+ ___satfractqquqq
+ ___satfractqquhq
+ ___satfractqqusq
+ ___satfractqqudq
+ ___satfractqqutq
+ ___satfractqquha
+ ___satfractqqusa
+ ___satfractqquda
+ ___satfractqquta
+ ___satfracthqqq2
+ ___satfracthqsq2
+ ___satfracthqdq2
+ ___satfracthqtq2
+ ___satfracthqha
+ ___satfracthqsa
+ ___satfracthqda
+ ___satfracthqta
+ ___satfracthquqq
+ ___satfracthquhq
+ ___satfracthqusq
+ ___satfracthqudq
+ ___satfracthqutq
+ ___satfracthquha
+ ___satfracthqusa
+ ___satfracthquda
+ ___satfracthquta
+ ___satfractsqqq2
+ ___satfractsqhq2
+ ___satfractsqdq2
+ ___satfractsqtq2
+ ___satfractsqha
+ ___satfractsqsa
+ ___satfractsqda
+ ___satfractsqta
+ ___satfractsquqq
+ ___satfractsquhq
+ ___satfractsqusq
+ ___satfractsqudq
+ ___satfractsqutq
+ ___satfractsquha
+ ___satfractsqusa
+ ___satfractsquda
+ ___satfractsquta
+ ___satfractdqqq2
+ ___satfractdqhq2
+ ___satfractdqsq2
+ ___satfractdqtq2
+ ___satfractdqha
+ ___satfractdqsa
+ ___satfractdqda
+ ___satfractdqta
+ ___satfractdquqq
+ ___satfractdquhq
+ ___satfractdqusq
+ ___satfractdqudq
+ ___satfractdqutq
+ ___satfractdquha
+ ___satfractdqusa
+ ___satfractdquda
+ ___satfractdquta
+ ___satfracttqqq2
+ ___satfracttqhq2
+ ___satfracttqsq2
+ ___satfracttqdq2
+ ___satfracttqha
+ ___satfracttqsa
+ ___satfracttqda
+ ___satfracttqta
+ ___satfracttquqq
+ ___satfracttquhq
+ ___satfracttqusq
+ ___satfracttqudq
+ ___satfracttqutq
+ ___satfracttquha
+ ___satfracttqusa
+ ___satfracttquda
+ ___satfracttquta
+ ___satfracthaqq
+ ___satfracthahq
+ ___satfracthasq
+ ___satfracthadq
+ ___satfracthatq
+ ___satfracthasa2
+ ___satfracthada2
+ ___satfracthata2
+ ___satfracthauqq
+ ___satfracthauhq
+ ___satfracthausq
+ ___satfracthaudq
+ ___satfracthautq
+ ___satfracthauha
+ ___satfracthausa
+ ___satfracthauda
+ ___satfracthauta
+ ___satfractsaqq
+ ___satfractsahq
+ ___satfractsasq
+ ___satfractsadq
+ ___satfractsatq
+ ___satfractsaha2
+ ___satfractsada2
+ ___satfractsata2
+ ___satfractsauqq
+ ___satfractsauhq
+ ___satfractsausq
+ ___satfractsaudq
+ ___satfractsautq
+ ___satfractsauha
+ ___satfractsausa
+ ___satfractsauda
+ ___satfractsauta
+ ___satfractdaqq
+ ___satfractdahq
+ ___satfractdasq
+ ___satfractdadq
+ ___satfractdatq
+ ___satfractdaha2
+ ___satfractdasa2
+ ___satfractdata2
+ ___satfractdauqq
+ ___satfractdauhq
+ ___satfractdausq
+ ___satfractdaudq
+ ___satfractdautq
+ ___satfractdauha
+ ___satfractdausa
+ ___satfractdauda
+ ___satfractdauta
+ ___satfracttaqq
+ ___satfracttahq
+ ___satfracttasq
+ ___satfracttadq
+ ___satfracttatq
+ ___satfracttaha2
+ ___satfracttasa2
+ ___satfracttada2
+ ___satfracttauqq
+ ___satfracttauhq
+ ___satfracttausq
+ ___satfracttaudq
+ ___satfracttautq
+ ___satfracttauha
+ ___satfracttausa
+ ___satfracttauda
+ ___satfracttauta
+ ___satfractuqqqq
+ ___satfractuqqhq
+ ___satfractuqqsq
+ ___satfractuqqdq
+ ___satfractuqqtq
+ ___satfractuqqha
+ ___satfractuqqsa
+ ___satfractuqqda
+ ___satfractuqqta
+ ___satfractuqquhq2
+ ___satfractuqqusq2
+ ___satfractuqqudq2
+ ___satfractuqqutq2
+ ___satfractuqquha
+ ___satfractuqqusa
+ ___satfractuqquda
+ ___satfractuqquta
+ ___satfractuhqqq
+ ___satfractuhqhq
+ ___satfractuhqsq
+ ___satfractuhqdq
+ ___satfractuhqtq
+ ___satfractuhqha
+ ___satfractuhqsa
+ ___satfractuhqda
+ ___satfractuhqta
+ ___satfractuhquqq2
+ ___satfractuhqusq2
+ ___satfractuhqudq2
+ ___satfractuhqutq2
+ ___satfractuhquha
+ ___satfractuhqusa
+ ___satfractuhquda
+ ___satfractuhquta
+ ___satfractusqqq
+ ___satfractusqhq
+ ___satfractusqsq
+ ___satfractusqdq
+ ___satfractusqtq
+ ___satfractusqha
+ ___satfractusqsa
+ ___satfractusqda
+ ___satfractusqta
+ ___satfractusquqq2
+ ___satfractusquhq2
+ ___satfractusqudq2
+ ___satfractusqutq2
+ ___satfractusquha
+ ___satfractusqusa
+ ___satfractusquda
+ ___satfractusquta
+ ___satfractudqqq
+ ___satfractudqhq
+ ___satfractudqsq
+ ___satfractudqdq
+ ___satfractudqtq
+ ___satfractudqha
+ ___satfractudqsa
+ ___satfractudqda
+ ___satfractudqta
+ ___satfractudquqq2
+ ___satfractudquhq2
+ ___satfractudqusq2
+ ___satfractudqutq2
+ ___satfractudquha
+ ___satfractudqusa
+ ___satfractudquda
+ ___satfractudquta
+ ___satfractutqqq
+ ___satfractutqhq
+ ___satfractutqsq
+ ___satfractutqdq
+ ___satfractutqtq
+ ___satfractutqha
+ ___satfractutqsa
+ ___satfractutqda
+ ___satfractutqta
+ ___satfractutquqq2
+ ___satfractutquhq2
+ ___satfractutqusq2
+ ___satfractutqudq2
+ ___satfractutquha
+ ___satfractutqusa
+ ___satfractutquda
+ ___satfractutquta
+ ___satfractuhaqq
+ ___satfractuhahq
+ ___satfractuhasq
+ ___satfractuhadq
+ ___satfractuhatq
+ ___satfractuhaha
+ ___satfractuhasa
+ ___satfractuhada
+ ___satfractuhata
+ ___satfractuhauqq
+ ___satfractuhauhq
+ ___satfractuhausq
+ ___satfractuhaudq
+ ___satfractuhautq
+ ___satfractuhausa2
+ ___satfractuhauda2
+ ___satfractuhauta2
+ ___satfractusaqq
+ ___satfractusahq
+ ___satfractusasq
+ ___satfractusadq
+ ___satfractusatq
+ ___satfractusaha
+ ___satfractusasa
+ ___satfractusada
+ ___satfractusata
+ ___satfractusauqq
+ ___satfractusauhq
+ ___satfractusausq
+ ___satfractusaudq
+ ___satfractusautq
+ ___satfractusauha2
+ ___satfractusauda2
+ ___satfractusauta2
+ ___satfractudaqq
+ ___satfractudahq
+ ___satfractudasq
+ ___satfractudadq
+ ___satfractudatq
+ ___satfractudaha
+ ___satfractudasa
+ ___satfractudada
+ ___satfractudata
+ ___satfractudauqq
+ ___satfractudauhq
+ ___satfractudausq
+ ___satfractudaudq
+ ___satfractudautq
+ ___satfractudauha2
+ ___satfractudausa2
+ ___satfractudauta2
+ ___satfractutaqq
+ ___satfractutahq
+ ___satfractutasq
+ ___satfractutadq
+ ___satfractutatq
+ ___satfractutaha
+ ___satfractutasa
+ ___satfractutada
+ ___satfractutata
+ ___satfractutauqq
+ ___satfractutauhq
+ ___satfractutausq
+ ___satfractutaudq
+ ___satfractutautq
+ ___satfractutauha2
+ ___satfractutausa2
+ ___satfractutauda2
+ ___satfractqiqq
+ ___satfractqihq
+ ___satfractqisq
+ ___satfractqidq
+ ___satfractqitq
+ ___satfractqiha
+ ___satfractqisa
+ ___satfractqida
+ ___satfractqita
+ ___satfractqiuqq
+ ___satfractqiuhq
+ ___satfractqiusq
+ ___satfractqiudq
+ ___satfractqiutq
+ ___satfractqiuha
+ ___satfractqiusa
+ ___satfractqiuda
+ ___satfractqiuta
+ ___satfracthiqq
+ ___satfracthihq
+ ___satfracthisq
+ ___satfracthidq
+ ___satfracthitq
+ ___satfracthiha
+ ___satfracthisa
+ ___satfracthida
+ ___satfracthita
+ ___satfracthiuqq
+ ___satfracthiuhq
+ ___satfracthiusq
+ ___satfracthiudq
+ ___satfracthiutq
+ ___satfracthiuha
+ ___satfracthiusa
+ ___satfracthiuda
+ ___satfracthiuta
+ ___satfractsiqq
+ ___satfractsihq
+ ___satfractsisq
+ ___satfractsidq
+ ___satfractsitq
+ ___satfractsiha
+ ___satfractsisa
+ ___satfractsida
+ ___satfractsita
+ ___satfractsiuqq
+ ___satfractsiuhq
+ ___satfractsiusq
+ ___satfractsiudq
+ ___satfractsiutq
+ ___satfractsiuha
+ ___satfractsiusa
+ ___satfractsiuda
+ ___satfractsiuta
+ ___satfractdiqq
+ ___satfractdihq
+ ___satfractdisq
+ ___satfractdidq
+ ___satfractditq
+ ___satfractdiha
+ ___satfractdisa
+ ___satfractdida
+ ___satfractdita
+ ___satfractdiuqq
+ ___satfractdiuhq
+ ___satfractdiusq
+ ___satfractdiudq
+ ___satfractdiutq
+ ___satfractdiuha
+ ___satfractdiusa
+ ___satfractdiuda
+ ___satfractdiuta
+ ___satfracttiqq
+ ___satfracttihq
+ ___satfracttisq
+ ___satfracttidq
+ ___satfracttitq
+ ___satfracttiha
+ ___satfracttisa
+ ___satfracttida
+ ___satfracttita
+ ___satfracttiuqq
+ ___satfracttiuhq
+ ___satfracttiusq
+ ___satfracttiudq
+ ___satfracttiutq
+ ___satfracttiuha
+ ___satfracttiusa
+ ___satfracttiuda
+ ___satfracttiuta
+ ___satfractsfqq
+ ___satfractsfhq
+ ___satfractsfsq
+ ___satfractsfdq
+ ___satfractsftq
+ ___satfractsfha
+ ___satfractsfsa
+ ___satfractsfda
+ ___satfractsfta
+ ___satfractsfuqq
+ ___satfractsfuhq
+ ___satfractsfusq
+ ___satfractsfudq
+ ___satfractsfutq
+ ___satfractsfuha
+ ___satfractsfusa
+ ___satfractsfuda
+ ___satfractsfuta
+ ___satfractdfqq
+ ___satfractdfhq
+ ___satfractdfsq
+ ___satfractdfdq
+ ___satfractdftq
+ ___satfractdfha
+ ___satfractdfsa
+ ___satfractdfda
+ ___satfractdfta
+ ___satfractdfuqq
+ ___satfractdfuhq
+ ___satfractdfusq
+ ___satfractdfudq
+ ___satfractdfutq
+ ___satfractdfuha
+ ___satfractdfusa
+ ___satfractdfuda
+ ___satfractdfuta
+ ___fractunsqqqi
+ ___fractunsqqhi
+ ___fractunsqqsi
+ ___fractunsqqdi
+ ___fractunsqqti
+ ___fractunshqqi
+ ___fractunshqhi
+ ___fractunshqsi
+ ___fractunshqdi
+ ___fractunshqti
+ ___fractunssqqi
+ ___fractunssqhi
+ ___fractunssqsi
+ ___fractunssqdi
+ ___fractunssqti
+ ___fractunsdqqi
+ ___fractunsdqhi
+ ___fractunsdqsi
+ ___fractunsdqdi
+ ___fractunsdqti
+ ___fractunstqqi
+ ___fractunstqhi
+ ___fractunstqsi
+ ___fractunstqdi
+ ___fractunstqti
+ ___fractunshaqi
+ ___fractunshahi
+ ___fractunshasi
+ ___fractunshadi
+ ___fractunshati
+ ___fractunssaqi
+ ___fractunssahi
+ ___fractunssasi
+ ___fractunssadi
+ ___fractunssati
+ ___fractunsdaqi
+ ___fractunsdahi
+ ___fractunsdasi
+ ___fractunsdadi
+ ___fractunsdati
+ ___fractunstaqi
+ ___fractunstahi
+ ___fractunstasi
+ ___fractunstadi
+ ___fractunstati
+ ___fractunsuqqqi
+ ___fractunsuqqhi
+ ___fractunsuqqsi
+ ___fractunsuqqdi
+ ___fractunsuqqti
+ ___fractunsuhqqi
+ ___fractunsuhqhi
+ ___fractunsuhqsi
+ ___fractunsuhqdi
+ ___fractunsuhqti
+ ___fractunsusqqi
+ ___fractunsusqhi
+ ___fractunsusqsi
+ ___fractunsusqdi
+ ___fractunsusqti
+ ___fractunsudqqi
+ ___fractunsudqhi
+ ___fractunsudqsi
+ ___fractunsudqdi
+ ___fractunsudqti
+ ___fractunsutqqi
+ ___fractunsutqhi
+ ___fractunsutqsi
+ ___fractunsutqdi
+ ___fractunsutqti
+ ___fractunsuhaqi
+ ___fractunsuhahi
+ ___fractunsuhasi
+ ___fractunsuhadi
+ ___fractunsuhati
+ ___fractunsusaqi
+ ___fractunsusahi
+ ___fractunsusasi
+ ___fractunsusadi
+ ___fractunsusati
+ ___fractunsudaqi
+ ___fractunsudahi
+ ___fractunsudasi
+ ___fractunsudadi
+ ___fractunsudati
+ ___fractunsutaqi
+ ___fractunsutahi
+ ___fractunsutasi
+ ___fractunsutadi
+ ___fractunsutati
+ ___fractunsqiqq
+ ___fractunsqihq
+ ___fractunsqisq
+ ___fractunsqidq
+ ___fractunsqitq
+ ___fractunsqiha
+ ___fractunsqisa
+ ___fractunsqida
+ ___fractunsqita
+ ___fractunsqiuqq
+ ___fractunsqiuhq
+ ___fractunsqiusq
+ ___fractunsqiudq
+ ___fractunsqiutq
+ ___fractunsqiuha
+ ___fractunsqiusa
+ ___fractunsqiuda
+ ___fractunsqiuta
+ ___fractunshiqq
+ ___fractunshihq
+ ___fractunshisq
+ ___fractunshidq
+ ___fractunshitq
+ ___fractunshiha
+ ___fractunshisa
+ ___fractunshida
+ ___fractunshita
+ ___fractunshiuqq
+ ___fractunshiuhq
+ ___fractunshiusq
+ ___fractunshiudq
+ ___fractunshiutq
+ ___fractunshiuha
+ ___fractunshiusa
+ ___fractunshiuda
+ ___fractunshiuta
+ ___fractunssiqq
+ ___fractunssihq
+ ___fractunssisq
+ ___fractunssidq
+ ___fractunssitq
+ ___fractunssiha
+ ___fractunssisa
+ ___fractunssida
+ ___fractunssita
+ ___fractunssiuqq
+ ___fractunssiuhq
+ ___fractunssiusq
+ ___fractunssiudq
+ ___fractunssiutq
+ ___fractunssiuha
+ ___fractunssiusa
+ ___fractunssiuda
+ ___fractunssiuta
+ ___fractunsdiqq
+ ___fractunsdihq
+ ___fractunsdisq
+ ___fractunsdidq
+ ___fractunsditq
+ ___fractunsdiha
+ ___fractunsdisa
+ ___fractunsdida
+ ___fractunsdita
+ ___fractunsdiuqq
+ ___fractunsdiuhq
+ ___fractunsdiusq
+ ___fractunsdiudq
+ ___fractunsdiutq
+ ___fractunsdiuha
+ ___fractunsdiusa
+ ___fractunsdiuda
+ ___fractunsdiuta
+ ___fractunstiqq
+ ___fractunstihq
+ ___fractunstisq
+ ___fractunstidq
+ ___fractunstitq
+ ___fractunstiha
+ ___fractunstisa
+ ___fractunstida
+ ___fractunstita
+ ___fractunstiuqq
+ ___fractunstiuhq
+ ___fractunstiusq
+ ___fractunstiudq
+ ___fractunstiutq
+ ___fractunstiuha
+ ___fractunstiusa
+ ___fractunstiuda
+ ___fractunstiuta
+ ___satfractunsqiqq
+ ___satfractunsqihq
+ ___satfractunsqisq
+ ___satfractunsqidq
+ ___satfractunsqitq
+ ___satfractunsqiha
+ ___satfractunsqisa
+ ___satfractunsqida
+ ___satfractunsqita
+ ___satfractunsqiuqq
+ ___satfractunsqiuhq
+ ___satfractunsqiusq
+ ___satfractunsqiudq
+ ___satfractunsqiutq
+ ___satfractunsqiuha
+ ___satfractunsqiusa
+ ___satfractunsqiuda
+ ___satfractunsqiuta
+ ___satfractunshiqq
+ ___satfractunshihq
+ ___satfractunshisq
+ ___satfractunshidq
+ ___satfractunshitq
+ ___satfractunshiha
+ ___satfractunshisa
+ ___satfractunshida
+ ___satfractunshita
+ ___satfractunshiuqq
+ ___satfractunshiuhq
+ ___satfractunshiusq
+ ___satfractunshiudq
+ ___satfractunshiutq
+ ___satfractunshiuha
+ ___satfractunshiusa
+ ___satfractunshiuda
+ ___satfractunshiuta
+ ___satfractunssiqq
+ ___satfractunssihq
+ ___satfractunssisq
+ ___satfractunssidq
+ ___satfractunssitq
+ ___satfractunssiha
+ ___satfractunssisa
+ ___satfractunssida
+ ___satfractunssita
+ ___satfractunssiuqq
+ ___satfractunssiuhq
+ ___satfractunssiusq
+ ___satfractunssiudq
+ ___satfractunssiutq
+ ___satfractunssiuha
+ ___satfractunssiusa
+ ___satfractunssiuda
+ ___satfractunssiuta
+ ___satfractunsdiqq
+ ___satfractunsdihq
+ ___satfractunsdisq
+ ___satfractunsdidq
+ ___satfractunsditq
+ ___satfractunsdiha
+ ___satfractunsdisa
+ ___satfractunsdida
+ ___satfractunsdita
+ ___satfractunsdiuqq
+ ___satfractunsdiuhq
+ ___satfractunsdiusq
+ ___satfractunsdiudq
+ ___satfractunsdiutq
+ ___satfractunsdiuha
+ ___satfractunsdiusa
+ ___satfractunsdiuda
+ ___satfractunsdiuta
+ ___satfractunstiqq
+ ___satfractunstihq
+ ___satfractunstisq
+ ___satfractunstidq
+ ___satfractunstitq
+ ___satfractunstiha
+ ___satfractunstisa
+ ___satfractunstida
+ ___satfractunstita
+ ___satfractunstiuqq
+ ___satfractunstiuhq
+ ___satfractunstiusq
+ ___satfractunstiudq
+ ___satfractunstiutq
+ ___satfractunstiuha
+ ___satfractunstiusa
+ ___satfractunstiuda
+ ___satfractunstiuta
+}
+
+%inherit GCC_4.4.0 GCC_4.3.0
+GCC_4.4.0 {
+ ___sync_fetch_and_add_1
+ ___sync_fetch_and_sub_1
+ ___sync_fetch_and_or_1
+ ___sync_fetch_and_and_1
+ ___sync_fetch_and_xor_1
+ ___sync_fetch_and_nand_1
+ ___sync_add_and_fetch_1
+ ___sync_sub_and_fetch_1
+ ___sync_or_and_fetch_1
+ ___sync_and_and_fetch_1
+ ___sync_xor_and_fetch_1
+ ___sync_nand_and_fetch_1
+ ___sync_bool_compare_and_swap_1
+ ___sync_val_compare_and_swap_1
+ ___sync_lock_test_and_set_1
+
+ ___sync_fetch_and_add_2
+ ___sync_fetch_and_sub_2
+ ___sync_fetch_and_or_2
+ ___sync_fetch_and_and_2
+ ___sync_fetch_and_xor_2
+ ___sync_fetch_and_nand_2
+ ___sync_add_and_fetch_2
+ ___sync_sub_and_fetch_2
+ ___sync_or_and_fetch_2
+ ___sync_and_and_fetch_2
+ ___sync_xor_and_fetch_2
+ ___sync_nand_and_fetch_2
+ ___sync_bool_compare_and_swap_2
+ ___sync_val_compare_and_swap_2
+ ___sync_lock_test_and_set_2
+
+ ___sync_fetch_and_add_4
+ ___sync_fetch_and_sub_4
+ ___sync_fetch_and_or_4
+ ___sync_fetch_and_and_4
+ ___sync_fetch_and_xor_4
+ ___sync_fetch_and_nand_4
+ ___sync_add_and_fetch_4
+ ___sync_sub_and_fetch_4
+ ___sync_or_and_fetch_4
+ ___sync_and_and_fetch_4
+ ___sync_xor_and_fetch_4
+ ___sync_nand_and_fetch_4
+ ___sync_bool_compare_and_swap_4
+ ___sync_val_compare_and_swap_4
+ ___sync_lock_test_and_set_4
+
+ ___sync_fetch_and_add_8
+ ___sync_fetch_and_sub_8
+ ___sync_fetch_and_or_8
+ ___sync_fetch_and_and_8
+ ___sync_fetch_and_xor_8
+ ___sync_fetch_and_nand_8
+ ___sync_add_and_fetch_8
+ ___sync_sub_and_fetch_8
+ ___sync_or_and_fetch_8
+ ___sync_and_and_fetch_8
+ ___sync_xor_and_fetch_8
+ ___sync_nand_and_fetch_8
+ ___sync_bool_compare_and_swap_8
+ ___sync_val_compare_and_swap_8
+ ___sync_lock_test_and_set_8
+
+ ___sync_fetch_and_add_16
+ ___sync_fetch_and_sub_16
+ ___sync_fetch_and_or_16
+ ___sync_fetch_and_and_16
+ ___sync_fetch_and_xor_16
+ ___sync_fetch_and_nand_16
+ ___sync_add_and_fetch_16
+ ___sync_sub_and_fetch_16
+ ___sync_or_and_fetch_16
+ ___sync_and_and_fetch_16
+ ___sync_xor_and_fetch_16
+ ___sync_nand_and_fetch_16
+ ___sync_bool_compare_and_swap_16
+ ___sync_val_compare_and_swap_16
+ ___sync_lock_test_and_set_16
+
+ ___sync_synchronize
}
diff --git a/gcc/config/i386/driver-i386.c b/gcc/config/i386/driver-i386.c
index 05ba01e2f81..17694ef3799 100644
--- a/gcc/config/i386/driver-i386.c
+++ b/gcc/config/i386/driver-i386.c
@@ -264,7 +264,8 @@ enum cache_type
};
static void
-detect_caches_cpuid4 (struct cache_desc *level1, struct cache_desc *level2)
+detect_caches_cpuid4 (struct cache_desc *level1, struct cache_desc *level2,
+ struct cache_desc *level3)
{
struct cache_desc *cache;
@@ -289,6 +290,9 @@ detect_caches_cpuid4 (struct cache_desc *level1, struct cache_desc *level2)
case 2:
cache = level2;
break;
+ case 3:
+ cache = level3;
+ break;
default:
cache = NULL;
}
@@ -303,7 +307,7 @@ detect_caches_cpuid4 (struct cache_desc *level1, struct cache_desc *level2)
cache->sizekb = (cache->assoc * part
* cache->line * sets) / 1024;
- }
+ }
}
default:
break;
@@ -314,12 +318,13 @@ detect_caches_cpuid4 (struct cache_desc *level1, struct cache_desc *level2)
/* Returns the description of caches for an Intel processor. */
static const char *
-detect_caches_intel (bool xeon_mp, unsigned max_level, unsigned max_ext_level)
+detect_caches_intel (bool xeon_mp, unsigned max_level,
+ unsigned max_ext_level, unsigned *l2sizekb)
{
- struct cache_desc level1 = {0, 0, 0}, level2 = {0, 0, 0};
+ struct cache_desc level1 = {0, 0, 0}, level2 = {0, 0, 0}, level3 = {0, 0, 0};
if (max_level >= 4)
- detect_caches_cpuid4 (&level1, &level2);
+ detect_caches_cpuid4 (&level1, &level2, &level3);
else if (max_level >= 2)
detect_caches_cpuid2 (xeon_mp, &level1, &level2);
else
@@ -328,11 +333,18 @@ detect_caches_intel (bool xeon_mp, unsigned max_level, unsigned max_ext_level)
if (level1.sizekb == 0)
return "";
+ /* Let the L3 replace the L2. This assumes inclusive caches
+ and single threaded program for now. */
+ if (level3.sizekb)
+ level2 = level3;
+
/* Intel CPUs are equipped with AMD style L2 cache info. Try this
method if other methods fail to provide L2 cache parameters. */
if (level2.sizekb == 0 && max_ext_level >= 0x80000006)
detect_l2_cache (&level2);
+ *l2sizekb = level2.sizekb;
+
return describe_cache (level1, level2);
}
@@ -387,6 +399,8 @@ const char *host_detect_local_cpu (int argc, const char **argv)
bool arch;
+ unsigned int l2sizekb = 0;
+
if (argc < 1)
return NULL;
@@ -459,7 +473,8 @@ const char *host_detect_local_cpu (int argc, const char **argv)
else if (vendor == SIG_INTEL)
{
bool xeon_mp = (family == 15 && model == 6);
- cache = detect_caches_intel (xeon_mp, max_level, ext_level);
+ cache = detect_caches_intel (xeon_mp, max_level,
+ ext_level, &l2sizekb);
}
}
@@ -523,14 +538,18 @@ const char *host_detect_local_cpu (int argc, const char **argv)
cpu = "pentium";
break;
case PROCESSOR_PENTIUMPRO:
- if (has_longmode)
- /* It is Core 2 or Atom. */
- cpu = (model == 28) ? "atom" : "core2";
+ if (model == 28)
+ cpu = "atom";
+ else if (model >= 28 && l2sizekb < 2048)
+ /* Assume it's a small core if there's less than 2MB cache */
+ cpu = "atom";
+ else if (has_longmode)
+ cpu = "core2";
else if (arch)
{
if (has_sse3)
/* It is Core Duo. */
- cpu = "prescott";
+ cpu = "pentium-m";
else if (has_sse2)
/* It is Pentium M. */
cpu = "pentium-m";
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index 54befb4b139..50b1b144ffb 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -11935,7 +11935,7 @@
UNSPEC_VPERMIL2F128))]
"TARGET_AVX"
{
- int mask = INTVAL (operands[2]);
+ int mask = INTVAL (operands[3]);
if ((mask & 0x88) == 0)
{
rtx perm[<ssescalarnum>], t1, t2;
diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c
index 52107df3e3a..384de6d9854 100644
--- a/gcc/config/ia64/ia64.c
+++ b/gcc/config/ia64/ia64.c
@@ -1733,25 +1733,18 @@ ia64_expand_vecint_compare (enum rtx_code code, enum machine_mode mode,
{
rtx t1, t2, mask;
- /* Perform a parallel modulo subtraction. */
- t1 = gen_reg_rtx (V2SImode);
- emit_insn (gen_subv2si3 (t1, op0, op1));
-
- /* Extract the original sign bit of op0. */
- mask = GEN_INT (-0x80000000);
+ /* Subtract (-(INT MAX) - 1) from both operands to make
+ them signed. */
+ mask = GEN_INT (0x80000000);
mask = gen_rtx_CONST_VECTOR (V2SImode, gen_rtvec (2, mask, mask));
- mask = force_reg (V2SImode, mask);
- t2 = gen_reg_rtx (V2SImode);
- emit_insn (gen_andv2si3 (t2, op0, mask));
-
- /* XOR it back into the result of the subtraction. This results
- in the sign bit set iff we saw unsigned underflow. */
- x = gen_reg_rtx (V2SImode);
- emit_insn (gen_xorv2si3 (x, t1, t2));
-
+ mask = force_reg (mode, mask);
+ t1 = gen_reg_rtx (mode);
+ emit_insn (gen_subv2si3 (t1, op0, mask));
+ t2 = gen_reg_rtx (mode);
+ emit_insn (gen_subv2si3 (t2, op1, mask));
+ op0 = t1;
+ op1 = t2;
code = GT;
- op0 = x;
- op1 = CONST0_RTX (mode);
}
break;
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 906392eebf0..639e71fdc1f 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -21353,9 +21353,7 @@ static int load_store_pendulum;
instructions to issue in this cycle. */
static int
-rs6000_variable_issue (FILE *stream ATTRIBUTE_UNUSED,
- int verbose ATTRIBUTE_UNUSED,
- rtx insn, int more)
+rs6000_variable_issue_1 (rtx insn, int more)
{
last_scheduled_insn = insn;
if (GET_CODE (PATTERN (insn)) == USE
@@ -21394,6 +21392,15 @@ rs6000_variable_issue (FILE *stream ATTRIBUTE_UNUSED,
return cached_can_issue_more;
}
+static int
+rs6000_variable_issue (FILE *stream, int verbose, rtx insn, int more)
+{
+ int r = rs6000_variable_issue_1 (insn, more);
+ if (verbose)
+ fprintf (stream, "// rs6000_variable_issue (more = %d) = %d\n", more, r);
+ return r;
+}
+
/* Adjust the cost of a scheduling dependency. Return the new cost of
a dependency LINK or INSN on DEP_INSN. COST is the current cost. */
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index f30cb38d246..08475b65e54 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -1,6 +1,6 @@
;; Machine description for IBM RISC System 6000 (POWER) for GNU C compiler
;; Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-;; 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+;; 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
;; Free Software Foundation, Inc.
;; Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
@@ -6310,7 +6310,14 @@
[(set_attr "type" "dmul")
(set_attr "fp_type" "fp_maddsub_d")])
-(define_insn "sqrtdf2"
+(define_expand "sqrtdf2"
+ [(set (match_operand:DF 0 "gpc_reg_operand" "")
+ (sqrt:DF (match_operand:DF 1 "gpc_reg_operand" "")))]
+ "(TARGET_PPC_GPOPT || TARGET_POWER2) && TARGET_HARD_FLOAT && TARGET_FPRS
+ && TARGET_DOUBLE_FLOAT"
+ "")
+
+(define_insn "*sqrtdf2_fpr"
[(set (match_operand:DF 0 "gpc_reg_operand" "=d")
(sqrt:DF (match_operand:DF 1 "gpc_reg_operand" "d")))]
"(TARGET_PPC_GPOPT || TARGET_POWER2) && TARGET_HARD_FLOAT && TARGET_FPRS
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index 40bb24555a8..28cf2eb92a0 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -1639,6 +1639,9 @@ override_options (void)
if (s390_tune == PROCESSOR_2097_Z10
&& !PARAM_SET_P (PARAM_MAX_UNROLLED_INSNS))
set_param_value ("max-unrolled-insns", 100);
+
+ set_param_value ("max-pending-list-length", 256);
+
}
/* Map for smallest class containing reg regno. */
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 07a3486a404..9f73d86c22e 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,31 @@
+2010-01-15 Dodji Seketeli <dodji@redhat.com>
+
+ * error.c (dump_template_parms,count_non_default_template_args):
+ Revert changes of PR c++/42634.
+
+2010-01-14 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/42674
+ * decl.c (finish_function): Don't emit -Wreturn-type warnings in
+ functions with noreturn attribute.
+
+2010-01-14 Jason Merrill <jason@redhat.com>
+
+ PR c++/42701
+ * call.c (build_new_method_call): Don't free the vec here.
+
+ PR c++/42655
+ * call.c (convert_like_real): Do full decay_conversion for ck_rvalue.
+
+2010-01-13 Dodji Seketeli <dodji@redhat.com>
+
+ PR c++/42634
+ * error.c (dump_template_parms): Use innermost template
+ arguments before calling count_non_default_template_args.
+ (count_non_default_template_args): We are being called with
+ template innermost arguments now. There is no need to ensure
+ that again.
+
2010-01-07 Dodji Seketeli <dodji@redhat.com>
c++/40155
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 02fc4b36623..54254c37f1d 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -5013,7 +5013,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
switch (convs->kind)
{
case ck_rvalue:
- expr = convert_bitfield_to_declared_type (expr);
+ expr = decay_conversion (expr);
if (! MAYBE_CLASS_TYPE_P (totype))
return expr;
/* Else fall through. */
@@ -6256,11 +6256,10 @@ build_new_method_call (tree instance, tree fns, VEC(tree,gc) **args,
permerror (input_location,
"cannot call constructor %<%T::%D%> directly",
basetype, name);
- inform (input_location, "for a function-style cast, remove the "
- "redundant %<::%D%>", name);
+ permerror (input_location, " for a function-style cast, remove the "
+ "redundant %<::%D%>", name);
call = build_functional_cast (basetype, build_tree_list_vec (user_args),
complain);
- release_tree_vector (user_args);
return call;
}
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index e89113a2402..2409aa31b15 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -12541,6 +12541,8 @@ finish_function (int flags)
&& !current_function_returns_value && !current_function_returns_null
/* Don't complain if we abort or throw. */
&& !current_function_returns_abnormally
+ /* Don't complain if we are declared noreturn. */
+ && !TREE_THIS_VOLATILE (fndecl)
&& !DECL_NAME (DECL_RESULT (fndecl))
&& !TREE_NO_WARNING (fndecl)
/* Structor return values (if any) are set by the compiler. */
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 4ae9e2e7f9f..16e984e55a2 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -858,7 +858,7 @@ this macro!} The debugging options are not supposed to alter the
generated code.
@end defmac
-@deftypefn {Target Hook} bool TARGET_HELP (void)
+@deftypefn {Target Hook} void TARGET_HELP (void)
This hook is called in response to the user invoking
@option{--target-help} on the command line. It gives the target a
chance to display extra information on the target specific command
@@ -1054,7 +1054,7 @@ sign-extend the result to 64 bits. On such machines, set
Do not define this macro if it would never modify @var{m}.
@end defmac
-@deftypefn {Target Hook} enum machine_mode TARGET_PROMOTE_FUNCTION_MODE (tree @var{type}, enum machine_mode @var{mode}, int *@var{punsignedp}, tree @var{funtype}, int @var{for_return})
+@deftypefn {Target Hook} {enum machine_mode} TARGET_PROMOTE_FUNCTION_MODE (const_tree @var{type}, enum machine_mode @var{mode}, int *@var{punsignedp}, const_tree @var{funtype}, int @var{for_return})
Like @code{PROMOTE_MODE}, but it is applied to outgoing function arguments or
function return values. The target hook should return the new mode
and possibly change @code{*@var{punsignedp}} if the promotion should
@@ -1409,14 +1409,14 @@ You would most commonly define this macro if the @code{allocate_stack}
pattern needs to support both a 32- and a 64-bit mode.
@end defmac
-@deftypefn {Target Hook} {enum machine_mode} TARGET_LIBGCC_CMP_RETURN_MODE ()
+@deftypefn {Target Hook} {enum machine_mode} TARGET_LIBGCC_CMP_RETURN_MODE (void)
This target hook should return the mode to be used for the return value
of compare instructions expanded to libgcc calls. If not defined
@code{word_mode} is returned which is the right choice for a majority of
targets.
@end deftypefn
-@deftypefn {Target Hook} {enum machine_mode} TARGET_LIBGCC_SHIFT_COUNT_MODE ()
+@deftypefn {Target Hook} {enum machine_mode} TARGET_LIBGCC_SHIFT_COUNT_MODE (void)
This target hook should return the mode to be used for the shift count operand
of shift instructions expanded to libgcc calls. If not defined
@code{word_mode} is returned which is the right choice for a majority of
@@ -1444,7 +1444,7 @@ floating-point arithmetic.
The default definition of this macro returns false for all sizes.
@end defmac
-@deftypefn {Target Hook} bool TARGET_MS_BITFIELD_LAYOUT_P (tree @var{record_type})
+@deftypefn {Target Hook} bool TARGET_MS_BITFIELD_LAYOUT_P (const_tree @var{record_type})
This target hook returns @code{true} if bit-fields in the given
@var{record_type} are to be laid out following the rules of Microsoft
Visual C/C++, namely: (i) a bit-field won't share the same storage
@@ -1472,11 +1472,11 @@ precedence for that field, but the alignment of the rest of the structure
may affect its placement.
@end deftypefn
-@deftypefn {Target Hook} {bool} TARGET_DECIMAL_FLOAT_SUPPORTED_P (void)
+@deftypefn {Target Hook} bool TARGET_DECIMAL_FLOAT_SUPPORTED_P (void)
Returns true if the target supports decimal floating point.
@end deftypefn
-@deftypefn {Target Hook} {bool} TARGET_FIXED_POINT_SUPPORTED_P (void)
+@deftypefn {Target Hook} bool TARGET_FIXED_POINT_SUPPORTED_P (void)
Returns true if the target supports fixed-point arithmetic.
@end deftypefn
@@ -1494,7 +1494,7 @@ This hook allows the backend to perform additional instantiations on rtl
that are not actually in any insns yet, but will be later.
@end deftypefn
-@deftypefn {Target Hook} {const char *} TARGET_MANGLE_TYPE (tree @var{type})
+@deftypefn {Target Hook} {const char *} TARGET_MANGLE_TYPE (const_tree @var{type})
If your target defines any fundamental types, or any types your target
uses should be mangled differently from the default, define this hook
to return the appropriate encoding for these types as part of a C++
@@ -2922,7 +2922,7 @@ as below:
@end smallexample
@end defmac
-@deftypefn {Target Hook} {const enum reg_class *} TARGET_IRA_COVER_CLASSES ()
+@deftypefn {Target Hook} {const enum reg_class *} TARGET_IRA_COVER_CLASSES (void)
Return an array of cover classes for the Integrated Register Allocator
(@acronym{IRA}). Cover classes are a set of non-intersecting register
classes covering all hard registers used for register allocation
@@ -3239,7 +3239,7 @@ before we can access arbitrary stack frames. You will seldom need to
define this macro.
@end defmac
-@deftypefn {Target Hook} bool TARGET_BUILTIN_SETJMP_FRAME_VALUE ()
+@deftypefn {Target Hook} rtx TARGET_BUILTIN_SETJMP_FRAME_VALUE (void)
This target hook should return an rtx that is used to store
the address of the current frame into the built in @code{setjmp} buffer.
The default value, @code{virtual_stack_vars_rtx}, is correct for most
@@ -3841,10 +3841,10 @@ Note that the elimination of the argument pointer with the stack pointer is
specified first since that is the preferred elimination.
@end defmac
-@deftypefn {Target Hook} bool TARGET_CAN_ELIMINATE (const int @var{from-reg}, const int @var{to-reg})
+@deftypefn {Target Hook} bool TARGET_CAN_ELIMINATE (const int @var{from_reg}, const int @var{to_reg})
This target hook should returns @code{true} if the compiler is allowed to
-try to replace register number @var{from-reg} with register number
-@var{to-reg}. This target hook need only be defined if @code{ELIMINABLE_REGS}
+try to replace register number @var{from_reg} with register number
+@var{to_reg}. This target hook need only be defined if @code{ELIMINABLE_REGS}
is defined, and will usually be @code{true}, since most of the cases
preventing register elimination are things that the compiler already
knows about.
@@ -3868,7 +3868,7 @@ The macros in this section control how arguments are passed
on the stack. See the following section for other macros that
control passing certain arguments in registers.
-@deftypefn {Target Hook} bool TARGET_PROMOTE_PROTOTYPES (tree @var{fntype})
+@deftypefn {Target Hook} bool TARGET_PROMOTE_PROTOTYPES (const_tree @var{fntype})
This target hook returns @code{true} if an argument declared in a
prototype as an integral type smaller than @code{int} should actually be
passed as an @code{int}. In addition to avoiding errors in certain
@@ -4083,7 +4083,7 @@ defined, the argument will be computed in the stack and then loaded into
a register.
@end defmac
-@deftypefn {Target Hook} bool TARGET_MUST_PASS_IN_STACK (enum machine_mode @var{mode}, tree @var{type})
+@deftypefn {Target Hook} bool TARGET_MUST_PASS_IN_STACK (enum machine_mode @var{mode}, const_tree @var{type})
This target hook should return @code{true} if we should not pass @var{type}
solely in registers. The file @file{expr.h} defines a
definition that is usually appropriate, refer to @file{expr.h} for additional
@@ -4136,7 +4136,7 @@ The pointer is passed in whatever way is appropriate for passing a pointer
to that type.
@end deftypefn
-@deftypefn {Target Hook} bool TARGET_CALLEE_COPIES (CUMULATIVE_ARGS *@var{cum}, enum machine_mode @var{mode}, tree @var{type}, bool @var{named})
+@deftypefn {Target Hook} bool TARGET_CALLEE_COPIES (CUMULATIVE_ARGS *@var{cum}, enum machine_mode @var{mode}, const_tree @var{type}, bool @var{named})
The function argument described by the parameters to this hook is
known to be passed by reference. The hook should return true if the
function argument should be copied by the callee instead of copied
@@ -4285,7 +4285,7 @@ used for this purpose since all function arguments are pushed on the
stack.
@end defmac
-@deftypefn {Target Hook} bool TARGET_SPLIT_COMPLEX_ARG (tree @var{type})
+@deftypefn {Target Hook} bool TARGET_SPLIT_COMPLEX_ARG (const_tree @var{type})
This hook should return true if parameter of type @var{type} are passed
as two scalar parameters. By default, GCC will attempt to pack complex
arguments into the target's word size. Some ABIs require complex arguments
@@ -4315,7 +4315,7 @@ type of @var{type}. If @var{type} is not a valid va_list type, it returns
@code{NULL_TREE}.
@end deftypefn
-@deftypefn {Target Hook} tree TARGET_GIMPLIFY_VA_ARG_EXPR (tree @var{valist}, tree @var{type}, tree *@var{pre_p}, tree *@var{post_p})
+@deftypefn {Target Hook} tree TARGET_GIMPLIFY_VA_ARG_EXPR (tree @var{valist}, tree @var{type}, gimple_seq *@var{pre_p}, gimple_seq *@var{post_p})
This hook performs target-specific gimplification of
@code{VA_ARG_EXPR}. The first two parameters correspond to the
arguments to @code{va_arg}; the latter two are as in
@@ -4355,7 +4355,7 @@ must have move patterns for this mode.
This section discusses the macros that control returning scalars as
values---values that can fit in registers.
-@deftypefn {Target Hook} rtx TARGET_FUNCTION_VALUE (tree @var{ret_type}, tree @var{fn_decl_or_type}, bool @var{outgoing})
+@deftypefn {Target Hook} rtx TARGET_FUNCTION_VALUE (const_tree @var{ret_type}, const_tree @var{fn_decl_or_type}, bool @var{outgoing})
Define this to return an RTX representing the place where a function
returns or receives a value of data type @var{ret_type}, a tree node
@@ -4469,7 +4469,7 @@ need more space than is implied by @code{FUNCTION_VALUE_REGNO_P} for
saving and restoring an arbitrary return value.
@end defmac
-@deftypefn {Target Hook} bool TARGET_RETURN_IN_MSB (tree @var{type})
+@deftypefn {Target Hook} bool TARGET_RETURN_IN_MSB (const_tree @var{type})
This hook should return true if values of type @var{type} are returned
at the most significant end of a register (in other words, if they are
padded at the least significant end). You can assume that @var{type}
@@ -4499,7 +4499,7 @@ address}.
This section describes how to control returning structure values in
memory.
-@deftypefn {Target Hook} bool TARGET_RETURN_IN_MEMORY (tree @var{type}, tree @var{fntype})
+@deftypefn {Target Hook} bool TARGET_RETURN_IN_MEMORY (const_tree @var{type}, const_tree @var{fntype})
This target hook should return a nonzero value to say to return the
function value in memory, just as large structures are always returned.
Here @var{type} will be the data type of the value, and @var{fntype}
@@ -4840,7 +4840,7 @@ front end will generate a less efficient heavyweight thunk that calls
not support varargs.
@end deftypefn
-@deftypefn {Target Hook} bool TARGET_ASM_CAN_OUTPUT_MI_THUNK (tree @var{thunk_fndecl}, HOST_WIDE_INT @var{delta}, HOST_WIDE_INT @var{vcall_offset}, tree @var{function})
+@deftypefn {Target Hook} bool TARGET_ASM_CAN_OUTPUT_MI_THUNK (const_tree @var{thunk_fndecl}, HOST_WIDE_INT @var{delta}, HOST_WIDE_INT @var{vcall_offset}, const_tree @var{function})
A function that returns true if TARGET_ASM_OUTPUT_MI_THUNK would be able
to output the assembler code for the thunk function specified by the
arguments it is passed, and false otherwise. In the latter case, the
@@ -4906,7 +4906,7 @@ as the @code{sibcall} md pattern can not fail, or fall over to a
may vary greatly between different architectures.
@end deftypefn
-@deftypefn {Target Hook} void TARGET_EXTRA_LIVE_ON_ENTRY (bitmap *@var{regs})
+@deftypefn {Target Hook} void TARGET_EXTRA_LIVE_ON_ENTRY (bitmap @var{regs})
Add any hard registers to @var{regs} that are live on entry to the
function. This hook only needs to be defined to provide registers that
cannot be found by examination of FUNCTION_ARG_REGNO_P, the callee saved
@@ -5087,10 +5087,10 @@ but @code{TARGET_PRETEND_OUTGOING_VARARGS_NAMED} returns @code{true},
then all arguments are treated as named. Otherwise, all named arguments
except the last are treated as named.
-You need not define this hook if it always returns zero.
+You need not define this hook if it always returns @code{false}.
@end deftypefn
-@deftypefn {Target Hook} bool TARGET_PRETEND_OUTGOING_VARARGS_NAMED
+@deftypefn {Target Hook} bool TARGET_PRETEND_OUTGOING_VARARGS_NAMED (CUMULATIVE_ARGS *@var{ca})
If you need to conditionally change ABIs so that one works with
@code{TARGET_SETUP_INCOMING_VARARGS}, but the other works like neither
@code{TARGET_SETUP_INCOMING_VARARGS} nor @code{TARGET_STRICT_ARGUMENT_NAMING} was
@@ -5611,7 +5611,7 @@ holding the constant. This restriction is often true of addresses
of TLS symbols for various targets.
@end deftypefn
-@deftypefn {Target Hook} bool TARGET_USE_BLOCKS_FOR_CONSTANT_P (enum machine_mode @var{mode}, rtx @var{x})
+@deftypefn {Target Hook} bool TARGET_USE_BLOCKS_FOR_CONSTANT_P (enum machine_mode @var{mode}, const_rtx @var{x})
This hook should return true if pool entries for constant @var{x} can
be placed in an @code{object_block} structure. @var{mode} is the mode
of @var{x}.
@@ -5703,7 +5703,7 @@ the vectorized function shall be of vector type @var{vec_type_out} and the
argument types should be @var{vec_type_in}.
@end deftypefn
-@deftypefn {Target Hook} bool TARGET_SUPPORT_VECTOR_MISALIGNMENT (enum machine_mode @var{mode}, tree @var{type}, int @var{misalignment}, bool @var{is_packed})
+@deftypefn {Target Hook} bool TARGET_SUPPORT_VECTOR_MISALIGNMENT (enum machine_mode @var{mode}, const_tree @var{type}, int @var{misalignment}, bool @var{is_packed})
This hook should return true if the target supports misaligned vector
store/load of a specific factor denoted in the @var{misalignment}
parameter. The vector store/load should be of machine mode @var{mode} and
@@ -5771,7 +5771,7 @@ If @code{ASM_OUTPUT_DEF} is not available, the hook's default definition
is @code{NULL}, which disables the use of section anchors altogether.
@end deftypefn
-@deftypefn {Target Hook} bool TARGET_USE_ANCHORS_FOR_SYMBOL_P (rtx @var{x})
+@deftypefn {Target Hook} bool TARGET_USE_ANCHORS_FOR_SYMBOL_P (const_rtx @var{x})
Return true if GCC should attempt to use anchors to access @code{SYMBOL_REF}
@var{x}. You can assume @samp{SYMBOL_REF_HAS_BLOCK_INFO_P (@var{x})} and
@samp{!SYMBOL_REF_ANCHOR_P (@var{x})}.
@@ -6594,7 +6594,7 @@ the instruction stream. The hook notifies a target backend to extend its
per instruction data structures.
@end deftypefn
-@deftypefn {Target Hook} void * TARGET_SCHED_ALLOC_SCHED_CONTEXT (void)
+@deftypefn {Target Hook} {void *} TARGET_SCHED_ALLOC_SCHED_CONTEXT (void)
Return a pointer to a store large enough to hold target scheduling context.
@end deftypefn
@@ -6617,7 +6617,7 @@ Deallocate internal data in target scheduling context pointed to by @var{tc}.
Deallocate a store for target scheduling context pointed to by @var{tc}.
@end deftypefn
-@deftypefn {Target Hook} void * TARGET_SCHED_ALLOC_SCHED_CONTEXT (void)
+@deftypefn {Target Hook} {void *} TARGET_SCHED_ALLOC_SCHED_CONTEXT (void)
Return a pointer to a store large enough to hold target scheduling context.
@end deftypefn
@@ -6994,7 +6994,7 @@ the characters that @code{TARGET_ENCODE_SECTION_INFO}
may have added.
@end deftypefn
-@deftypefn {Target Hook} bool TARGET_IN_SMALL_DATA_P (tree @var{exp})
+@deftypefn {Target Hook} bool TARGET_IN_SMALL_DATA_P (const_tree @var{exp})
Returns true if @var{exp} should be placed into a ``small data'' section.
The default version of this hook always returns false.
@end deftypefn
@@ -7004,7 +7004,7 @@ Contains the value true if the target places read-only
``small data'' into a separate section. The default value is false.
@end deftypevr
-@deftypefn {Target Hook} bool TARGET_BINDS_LOCAL_P (tree @var{exp})
+@deftypefn {Target Hook} bool TARGET_BINDS_LOCAL_P (const_tree @var{exp})
Returns true if @var{exp} names an object for which name resolution
rules must resolve to the current ``module'' (dynamic shared library
or executable image).
@@ -7126,7 +7126,7 @@ for the primary source file, immediately after printing
this to be done. The default is false.
@end deftypevr
-@deftypefn {Target Hook} void TARGET_ASM_FILE_END ()
+@deftypefn {Target Hook} void TARGET_ASM_FILE_END (void)
Output to @code{asm_out_file} any text which the assembler expects
to find at the end of a file. The default is to output nothing.
@end deftypefn
@@ -7217,7 +7217,7 @@ need to override this if your target has special flags that might be
set via @code{__attribute__}.
@end deftypefn
-@deftypefn {Target Hook} {int} TARGET_ASM_RECORD_GCC_SWITCHES (print_switch_type @var{type}, const char * @var{text})
+@deftypefn {Target Hook} int TARGET_ASM_RECORD_GCC_SWITCHES (print_switch_type @var{type}, const char *@var{text})
Provides the target with the ability to record the gcc command line
switches that have been passed to the compiler, and options that are
enabled. The @var{type} argument specifies what is being recorded.
@@ -9158,7 +9158,7 @@ for SDB in response to the @option{-g} option.
Define this macro if GCC should produce dwarf version 2 format
debugging output in response to the @option{-g} option.
-@deftypefn {Target Hook} int TARGET_DWARF_CALLING_CONVENTION (tree @var{function})
+@deftypefn {Target Hook} int TARGET_DWARF_CALLING_CONVENTION (const_tree @var{function})
Define this to enable the dwarf attribute @code{DW_AT_calling_convention} to
be emitted for each function. Instead of an integer return the enum
value for the @code{DW_CC_} tag.
@@ -9475,7 +9475,7 @@ entities to which these attributes are applied and the arguments they
take.
@end deftypevr
-@deftypefn {Target Hook} int TARGET_COMP_TYPE_ATTRIBUTES (tree @var{type1}, tree @var{type2})
+@deftypefn {Target Hook} int TARGET_COMP_TYPE_ATTRIBUTES (const_tree @var{type1}, const_tree @var{type2})
If defined, this target hook is a function which returns zero if the attributes on
@var{type1} and @var{type2} are incompatible, one if they are compatible,
and two if they are nearly compatible (which causes a warning to be
@@ -9519,7 +9519,7 @@ to perform initial processing of the @samp{dllimport} and
@file{i386/i386.c}, for example.
@end deftypefn
-@deftypefn {Target Hook} bool TARGET_VALID_DLLIMPORT_ATTRIBUTE_P (tree @var{decl})
+@deftypefn {Target Hook} bool TARGET_VALID_DLLIMPORT_ATTRIBUTE_P (const_tree @var{decl})
@var{decl} is a variable or function with @code{__attribute__((dllimport))}
specified. Use this hook if the target needs to add extra validation
checks to @code{handle_dll_attribute}.
@@ -9667,13 +9667,13 @@ is the TLS object and @var{tmpl_addr} is the address of the
initializer. The default initializes libgcc's emulated TLS control object.
@end deftypefn
-@deftypevr {Target Hook} {bool} TARGET_EMUTLS_VAR_ALIGN_FIXED
+@deftypevr {Target Hook} bool TARGET_EMUTLS_VAR_ALIGN_FIXED
Specifies whether the alignment of TLS control variable objects is
fixed and should not be increased as some backends may do to optimize
single objects. The default is false.
@end deftypevr
-@deftypevr {Target Hook} {bool} TARGET_EMUTLS_DEBUG_FORM_TLS_ADDRESS
+@deftypevr {Target Hook} bool TARGET_EMUTLS_DEBUG_FORM_TLS_ADDRESS
Specifies whether a DWARF @code{DW_OP_form_tls_address} location descriptor
may be used to describe emulated TLS control objects.
@end deftypevr
@@ -9727,7 +9727,7 @@ This hook returns the data needed by @code{TARGET_PCH_VALID_P} and sets
@samp{*@var{sz}} to the size of the data in bytes.
@end deftypefn
-@deftypefn {Target Hook} const char *TARGET_PCH_VALID_P (const void *@var{data}, size_t @var{sz})
+@deftypefn {Target Hook} {const char *} TARGET_PCH_VALID_P (const void *@var{data}, size_t @var{sz})
This hook checks whether the options used to create a PCH file are
compatible with the current settings. It returns @code{NULL}
if so and a suitable error message if not. Error messages will
@@ -9742,7 +9742,7 @@ The default definition of @code{default_pch_valid_p} should be
suitable for most targets.
@end deftypefn
-@deftypefn {Target Hook} const char *TARGET_CHECK_PCH_TARGET_FLAGS (int @var{pch_flags})
+@deftypefn {Target Hook} {const char *} TARGET_CHECK_PCH_TARGET_FLAGS (int @var{pch_flags})
If this hook is nonnull, the default implementation of
@code{TARGET_PCH_VALID_P} will use it to check for compatible values
of @code{target_flags}. @var{pch_flags} specifies the value that
@@ -9912,7 +9912,7 @@ version of this hook returns true for the modes returned by either the
target hooks for the given address space.
@end deftypefn
-@deftypefn {Target Hook} {bool} TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P (enum machine_mode @var{mode}, rtx @var{exp}, bool @var{strict}, addr_space_t @var{as})
+@deftypefn {Target Hook} bool TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P (enum machine_mode @var{mode}, rtx @var{exp}, bool @var{strict}, addr_space_t @var{as})
Define this to return true if @var{exp} is a valid address for mode
@var{mode} in the named address space @var{as}. The @var{strict}
parameter says whether strict addressing is in effect after reload has
@@ -9921,14 +9921,14 @@ finished. This target hook is the same as the
explicit named address space support.
@end deftypefn
-@deftypefn {Target Hook} {rtx} TARGET_ADDR_SPACE_LEGITIMIZE_ADDRESS (rtx @var{x}, rtx @var{oldx}, enum machine_mode @var{mode}, addr_space_t @var{as})
+@deftypefn {Target Hook} rtx TARGET_ADDR_SPACE_LEGITIMIZE_ADDRESS (rtx @var{x}, rtx @var{oldx}, enum machine_mode @var{mode}, addr_space_t @var{as})
Define this to modify an invalid address @var{x} to be a valid address
with mode @var{mode} in the named address space @var{as}. This target
hook is the same as the @code{TARGET_LEGITIMIZE_ADDRESS} target hook,
except that it includes explicit named address space support.
@end deftypefn
-@deftypefn {Target Hook} {bool} TARGET_ADDR_SPACE_SUBSET_P (addr_space_t @var{superset}, addr_space_t @var{subset})
+@deftypefn {Target Hook} bool TARGET_ADDR_SPACE_SUBSET_P (addr_space_t @var{superset}, addr_space_t @var{subset})
Define this to return whether the @var{subset} named address space is
contained within the @var{superset} named address space. Pointers to
a named address space that is a subset of another named address space
@@ -9937,7 +9937,7 @@ arithmetic operations. Pointers to a superset address space can be
converted to pointers to a subset address space via explicit casts.
@end deftypefn
-@deftypefn {Target Hook} {rtx} TARGET_ADDR_SPACE_CONVERT (rtx @var{op}, tree @var{from_type}, tree @var{to_type})
+@deftypefn {Target Hook} rtx TARGET_ADDR_SPACE_CONVERT (rtx @var{op}, tree @var{from_type}, tree @var{to_type})
Define this to convert the pointer expression represented by the RTL
@var{op} with type @var{from_type} that points to a named address
space to a new pointer expression with type @var{to_type} that points
@@ -9994,7 +9994,7 @@ contain relative addresses only when @option{-fPIC} or @option{-fPIC}
is in effect.
@end defmac
-@deftypefn {Target Hook} unsigned int TARGET_CASE_VALUES_THRESHOLD (void)
+@deftypefn {Target Hook} {unsigned int} TARGET_CASE_VALUES_THRESHOLD (void)
This function return the smallest number of different values for which it
is best to use a jump-table instead of a tree of conditional branches.
The default is four for machines with a @code{casesi} instruction and
@@ -10623,7 +10623,7 @@ added to the @code{struct ce_if_block} structure. These should be initialized
by the @code{IFCVT_INIT_EXTRA_FIELDS} macro.
@end defmac
-@deftypefn {Target Hook} void TARGET_MACHINE_DEPENDENT_REORG ()
+@deftypefn {Target Hook} void TARGET_MACHINE_DEPENDENT_REORG (void)
If non-null, this hook performs a target-specific pass over the
instruction stream. The compiler will run it at all optimization levels,
just before the point at which it normally does delayed-branch scheduling.
@@ -10637,7 +10637,7 @@ You need not implement the hook if it has nothing to do. The default
definition is null.
@end deftypefn
-@deftypefn {Target Hook} void TARGET_INIT_BUILTINS ()
+@deftypefn {Target Hook} void TARGET_INIT_BUILTINS (void)
Define this hook if you have any machine-specific built-in functions
that need to be defined. It should be a function that performs the
necessary setup.
@@ -10936,47 +10936,47 @@ many recent processors which implement a policy of ``relaxed,''
and ia64. The default is @code{false}.
@end deftypefn
-@deftypefn {Target Hook} const char *TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN (tree @var{typelist}, tree @var{funcdecl}, tree @var{val})
+@deftypefn {Target Hook} {const char *} TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN (const_tree @var{typelist}, const_tree @var{funcdecl}, const_tree @var{val})
If defined, this macro returns the diagnostic message when it is
illegal to pass argument @var{val} to function @var{funcdecl}
with prototype @var{typelist}.
@end deftypefn
-@deftypefn {Target Hook} {const char *} TARGET_INVALID_CONVERSION (tree @var{fromtype}, tree @var{totype})
+@deftypefn {Target Hook} {const char *} TARGET_INVALID_CONVERSION (const_tree @var{fromtype}, const_tree @var{totype})
If defined, this macro returns the diagnostic message when it is
invalid to convert from @var{fromtype} to @var{totype}, or @code{NULL}
if validity should be determined by the front end.
@end deftypefn
-@deftypefn {Target Hook} {const char *} TARGET_INVALID_UNARY_OP (int @var{op}, tree @var{type})
+@deftypefn {Target Hook} {const char *} TARGET_INVALID_UNARY_OP (int @var{op}, const_tree @var{type})
If defined, this macro returns the diagnostic message when it is
invalid to apply operation @var{op} (where unary plus is denoted by
@code{CONVERT_EXPR}) to an operand of type @var{type}, or @code{NULL}
if validity should be determined by the front end.
@end deftypefn
-@deftypefn {Target Hook} {const char *} TARGET_INVALID_BINARY_OP (int @var{op}, tree @var{type1}, tree @var{type2})
+@deftypefn {Target Hook} {const char *} TARGET_INVALID_BINARY_OP (int @var{op}, const_tree @var{type1}, const_tree @var{type2})
If defined, this macro returns the diagnostic message when it is
invalid to apply operation @var{op} to operands of types @var{type1}
and @var{type2}, or @code{NULL} if validity should be determined by
the front end.
@end deftypefn
-@deftypefn {Target Hook} {const char *} TARGET_INVALID_PARAMETER_TYPE (tree @var{type})
+@deftypefn {Target Hook} {const char *} TARGET_INVALID_PARAMETER_TYPE (const_tree @var{type})
If defined, this macro returns the diagnostic message when it is
invalid for functions to include parameters of type @var{type},
or @code{NULL} if validity should be determined by
the front end. This is currently used only by the C and C++ front ends.
@end deftypefn
-@deftypefn {Target Hook} {const char *} TARGET_INVALID_RETURN_TYPE (tree @var{type})
+@deftypefn {Target Hook} {const char *} TARGET_INVALID_RETURN_TYPE (const_tree @var{type})
If defined, this macro returns the diagnostic message when it is
invalid for functions to have return type @var{type},
or @code{NULL} if validity should be determined by
the front end. This is currently used only by the C and C++ front ends.
@end deftypefn
-@deftypefn {Target Hook} {tree} TARGET_PROMOTED_TYPE (tree @var{type})
+@deftypefn {Target Hook} tree TARGET_PROMOTED_TYPE (const_tree @var{type})
If defined, this target hook returns the type to which values of
@var{type} should be promoted when they appear in expressions,
analogous to the integer promotions, or @code{NULL_TREE} to use the
@@ -10985,7 +10985,7 @@ target-specific types with special promotion rules.
This is currently used only by the C and C++ front ends.
@end deftypefn
-@deftypefn {Target Hook} {tree} TARGET_CONVERT_TO_TYPE (tree @var{type}, tree @var{expr})
+@deftypefn {Target Hook} tree TARGET_CONVERT_TO_TYPE (tree @var{type}, tree @var{expr})
If defined, this hook returns the result of converting @var{expr} to
@var{type}. It should return the converted expression,
or @code{NULL_TREE} to apply the front end's normal conversion rules.
@@ -11023,7 +11023,7 @@ different argument pointer register is needed to access the function's
argument list when stack is aligned.
@end deftypefn
-@deftypefn {Target Hook} {bool} TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS (void)
+@deftypefn {Target Hook} bool TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS (void)
When optimization is disabled, this hook indicates whether or not
arguments should be allocated to stack slots. Normally, GCC allocates
stacks slots for arguments when not optimizing in order to make
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index e1126219689..9d249cc3b2f 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -326,13 +326,17 @@ add_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
HOST_WIDE_INT h;
l = l1 + l2;
- h = h1 + h2 + (l < l1);
+ h = (HOST_WIDE_INT) ((unsigned HOST_WIDE_INT) h1
+ + (unsigned HOST_WIDE_INT) h2
+ + (l < l1));
*lv = l;
*hv = h;
if (unsigned_p)
- return (unsigned HOST_WIDE_INT) h < (unsigned HOST_WIDE_INT) h1;
+ return ((unsigned HOST_WIDE_INT) h < (unsigned HOST_WIDE_INT) h1
+ || (h == h1
+ && l < l1));
else
return OVERFLOW_SUM_SIGN (h1, h2, h);
}
@@ -8942,6 +8946,19 @@ fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0)
}
return NULL_TREE;
+ case INDIRECT_REF:
+ /* Fold *&X to X if X is an lvalue. */
+ if (TREE_CODE (op0) == ADDR_EXPR)
+ {
+ tree op00 = TREE_OPERAND (op0, 0);
+ if ((TREE_CODE (op00) == VAR_DECL
+ || TREE_CODE (op00) == PARM_DECL
+ || TREE_CODE (op00) == RESULT_DECL)
+ && !TREE_READONLY (op00))
+ return op00;
+ }
+ return NULL_TREE;
+
default:
return NULL_TREE;
} /* switch (code) */
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 09bfccfe003..af85555a2e7 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,44 @@
+2010-01-14 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ PR fortran/42684
+ * interface.c (check_interface1): Pass symbol name rather than NULL to
+ gfc_compare_interfaces. (gfc_compare_interfaces): Add assert to
+ trap MULL.
+ * resolve.c (check_generic_tbp_ambiguity): Pass symbol name rather
+ than NULL to gfc_compare_interfaces.
+
+2010-01-14 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/41478
+ * trans-array.c (duplicate_allocatable): Static version of
+ gfc_duplicate_allocatable with provision to handle scalar
+ components. New boolean argument to switch off call to malloc
+ if true.
+ (gfc_duplicate_allocatable): New function to call above with
+ new argument false.
+ (gfc_copy_allocatable_data): New function to call above with
+ new argument true.
+ (structure_alloc_comps): Do not apply indirect reference to
+ scalar pointers. Add new section to copy allocatable components
+ of arrays. Extend copying of allocatable components to include
+ scalars.
+ (gfc_copy_only_alloc_comp): New function to copy allocatable
+ component derived types, without allocating the base structure.
+ * trans-array.h : Add primitive for gfc_copy_allocatable_data.
+ Add primitive for gfc_copy_only_alloc_comp.
+ * trans-expr.c (gfc_conv_procedure_call): After calls to
+ transformational functions with results that are derived types
+ with allocatable components, copy the components in the result.
+ (gfc_trans_arrayfunc_assign): Deallocate allocatable components
+ of lhs derived types before allocation.
+
+2010-01-14 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/42481
+ * module.c (load_generic_interfaces): If a procedure that is
+ use associated but not generic is given an interface that
+ includes itself, then make it generic.
+
2010-01-11 Joseph Myers <joseph@codesourcery.com>
Shujing Zhao <pearly.zhao@oracle.com>
diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
index 0034f75b92e..2a5ece1c465 100644
--- a/gcc/fortran/interface.c
+++ b/gcc/fortran/interface.c
@@ -955,6 +955,8 @@ gfc_compare_interfaces (gfc_symbol *s1, gfc_symbol *s2, const char *name2,
{
gfc_formal_arglist *f1, *f2;
+ gcc_assert (name2 != NULL);
+
if (s1->attr.function && (s2->attr.subroutine
|| (!s2->attr.function && s2->ts.type == BT_UNKNOWN
&& gfc_get_default_type (name2, s2->ns)->type == BT_UNKNOWN)))
@@ -1126,7 +1128,7 @@ check_interface1 (gfc_interface *p, gfc_interface *q0,
if (p->sym->name == q->sym->name && p->sym->module == q->sym->module)
continue;
- if (gfc_compare_interfaces (p->sym, q->sym, NULL, generic_flag, 0,
+ if (gfc_compare_interfaces (p->sym, q->sym, q->sym->name, generic_flag, 0,
NULL, 0))
{
if (referenced)
diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c
index 140f2e2d574..667bab83c49 100644
--- a/gcc/fortran/module.c
+++ b/gcc/fortran/module.c
@@ -1,6 +1,7 @@
/* Handle modules, which amounts to loading and saving symbols and
their attendant structures.
- Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+ Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
+ 2009, 2010
Free Software Foundation, Inc.
Contributed by Andy Vaught
@@ -3750,8 +3751,9 @@ load_generic_interfaces (void)
const char *p;
char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
gfc_symbol *sym;
- gfc_interface *generic = NULL;
+ gfc_interface *generic = NULL, *gen = NULL;
int n, i, renamed;
+ bool ambiguous_set = false;
mio_lparen ();
@@ -3836,9 +3838,13 @@ load_generic_interfaces (void)
sym = st->n.sym;
if (st && !sym->attr.generic
+ && !st->ambiguous
&& sym->module
&& strcmp(module, sym->module))
- st->ambiguous = 1;
+ {
+ ambiguous_set = true;
+ st->ambiguous = 1;
+ }
}
sym->attr.use_only = only_flag;
@@ -3854,6 +3860,26 @@ load_generic_interfaces (void)
sym->generic = generic;
sym->attr.generic_copy = 1;
}
+
+ /* If a procedure that is not generic has generic interfaces
+ that include itself, it is generic! We need to take care
+ to retain symbols ambiguous that were already so. */
+ if (sym->attr.use_assoc
+ && !sym->attr.generic
+ && sym->attr.flavor == FL_PROCEDURE)
+ {
+ for (gen = generic; gen; gen = gen->next)
+ {
+ if (gen->sym == sym)
+ {
+ sym->attr.generic = 1;
+ if (ambiguous_set)
+ st->ambiguous = 0;
+ break;
+ }
+ }
+ }
+
}
}
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 7321c0dd767..9212521b2f3 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -9712,7 +9712,7 @@ check_generic_tbp_ambiguity (gfc_tbp_generic* t1, gfc_tbp_generic* t2,
}
/* Compare the interfaces. */
- if (gfc_compare_interfaces (sym1, sym2, NULL, 1, 0, NULL, 0))
+ if (gfc_compare_interfaces (sym1, sym2, sym2->name, 1, 0, NULL, 0))
{
gfc_error ("'%s' and '%s' for GENERIC '%s' at %L are ambiguous",
sym1->name, sym2->name, generic_name, &where);
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 063b26297a7..d512da4db6b 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -5711,10 +5711,12 @@ get_full_array_size (stmtblock_t *block, tree decl, int rank)
}
-/* Allocate dest to the same size as src, and copy src -> dest. */
+/* Allocate dest to the same size as src, and copy src -> dest.
+ If no_malloc is set, only the copy is done. */
-tree
-gfc_duplicate_allocatable(tree dest, tree src, tree type, int rank)
+static tree
+duplicate_allocatable(tree dest, tree src, tree type, int rank,
+ bool no_malloc)
{
tree tmp;
tree size;
@@ -5723,35 +5725,66 @@ gfc_duplicate_allocatable(tree dest, tree src, tree type, int rank)
tree null_data;
stmtblock_t block;
- /* If the source is null, set the destination to null. */
+ /* If the source is null, set the destination to null. Then,
+ allocate memory to the destination. */
gfc_init_block (&block);
- gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
- null_data = gfc_finish_block (&block);
- gfc_init_block (&block);
+ if (rank == 0)
+ {
+ tmp = null_pointer_node;
+ tmp = fold_build2 (MODIFY_EXPR, type, dest, tmp);
+ gfc_add_expr_to_block (&block, tmp);
+ null_data = gfc_finish_block (&block);
+
+ gfc_init_block (&block);
+ size = TYPE_SIZE_UNIT (type);
+ if (!no_malloc)
+ {
+ tmp = gfc_call_malloc (&block, type, size);
+ tmp = fold_build2 (MODIFY_EXPR, void_type_node, dest,
+ fold_convert (type, tmp));
+ gfc_add_expr_to_block (&block, tmp);
+ }
+
+ tmp = built_in_decls[BUILT_IN_MEMCPY];
+ tmp = build_call_expr_loc (input_location, tmp, 3,
+ dest, src, size);
+ }
+ else
+ {
+ gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
+ null_data = gfc_finish_block (&block);
+
+ gfc_init_block (&block);
+ nelems = get_full_array_size (&block, src, rank);
+ tmp = fold_convert (gfc_array_index_type,
+ TYPE_SIZE_UNIT (gfc_get_element_type (type)));
+ size = fold_build2 (MULT_EXPR, gfc_array_index_type, nelems, tmp);
+ if (!no_malloc)
+ {
+ tmp = TREE_TYPE (gfc_conv_descriptor_data_get (src));
+ tmp = gfc_call_malloc (&block, tmp, size);
+ gfc_conv_descriptor_data_set (&block, dest, tmp);
+ }
+
+ /* We know the temporary and the value will be the same length,
+ so can use memcpy. */
+ tmp = built_in_decls[BUILT_IN_MEMCPY];
+ tmp = build_call_expr_loc (input_location,
+ tmp, 3, gfc_conv_descriptor_data_get (dest),
+ gfc_conv_descriptor_data_get (src), size);
+ }
- nelems = get_full_array_size (&block, src, rank);
- size = fold_build2 (MULT_EXPR, gfc_array_index_type, nelems,
- fold_convert (gfc_array_index_type,
- TYPE_SIZE_UNIT (gfc_get_element_type (type))));
-
- /* Allocate memory to the destination. */
- tmp = gfc_call_malloc (&block, TREE_TYPE (gfc_conv_descriptor_data_get (src)),
- size);
- gfc_conv_descriptor_data_set (&block, dest, tmp);
-
- /* We know the temporary and the value will be the same length,
- so can use memcpy. */
- tmp = built_in_decls[BUILT_IN_MEMCPY];
- tmp = build_call_expr_loc (input_location,
- tmp, 3, gfc_conv_descriptor_data_get (dest),
- gfc_conv_descriptor_data_get (src), size);
gfc_add_expr_to_block (&block, tmp);
tmp = gfc_finish_block (&block);
/* Null the destination if the source is null; otherwise do
the allocate and copy. */
- null_cond = gfc_conv_descriptor_data_get (src);
+ if (rank == 0)
+ null_cond = src;
+ else
+ null_cond = gfc_conv_descriptor_data_get (src);
+
null_cond = convert (pvoid_type_node, null_cond);
null_cond = fold_build2 (NE_EXPR, boolean_type_node,
null_cond, null_pointer_node);
@@ -5759,11 +5792,30 @@ gfc_duplicate_allocatable(tree dest, tree src, tree type, int rank)
}
+/* Allocate dest to the same size as src, and copy data src -> dest. */
+
+tree
+gfc_duplicate_allocatable (tree dest, tree src, tree type, int rank)
+{
+ return duplicate_allocatable(dest, src, type, rank, false);
+}
+
+
+/* Copy data src -> dest. */
+
+tree
+gfc_copy_allocatable_data (tree dest, tree src, tree type, int rank)
+{
+ return duplicate_allocatable(dest, src, type, rank, true);
+}
+
+
/* Recursively traverse an object of derived type, generating code to
deallocate, nullify or copy allocatable components. This is the work horse
function for the functions named in this enum. */
-enum {DEALLOCATE_ALLOC_COMP = 1, NULLIFY_ALLOC_COMP, COPY_ALLOC_COMP};
+enum {DEALLOCATE_ALLOC_COMP = 1, NULLIFY_ALLOC_COMP, COPY_ALLOC_COMP,
+ COPY_ONLY_ALLOC_COMP};
static tree
structure_alloc_comps (gfc_symbol * der_type, tree decl,
@@ -5786,7 +5838,7 @@ structure_alloc_comps (gfc_symbol * der_type, tree decl,
gfc_init_block (&fnblock);
- if (POINTER_TYPE_P (TREE_TYPE (decl)))
+ if (POINTER_TYPE_P (TREE_TYPE (decl)) && rank != 0)
decl = build_fold_indirect_ref_loc (input_location,
decl);
@@ -5841,6 +5893,14 @@ structure_alloc_comps (gfc_symbol * der_type, tree decl,
dref = gfc_build_array_ref (tmp, index, NULL);
tmp = structure_alloc_comps (der_type, vref, dref, rank, purpose);
}
+ else if (purpose == COPY_ONLY_ALLOC_COMP)
+ {
+ tmp = build_fold_indirect_ref_loc (input_location,
+ gfc_conv_array_data (dest));
+ dref = gfc_build_array_ref (tmp, index, NULL);
+ tmp = structure_alloc_comps (der_type, vref, dref, rank,
+ COPY_ALLOC_COMP);
+ }
else
tmp = structure_alloc_comps (der_type, vref, NULL_TREE, rank, purpose);
@@ -5978,7 +6038,8 @@ structure_alloc_comps (gfc_symbol * der_type, tree decl,
if (c->attr.allocatable && !cmp_has_alloc_comps)
{
- tmp = gfc_duplicate_allocatable(dcmp, comp, ctype, c->as->rank);
+ rank = c->as ? c->as->rank : 0;
+ tmp = gfc_duplicate_allocatable(dcmp, comp, ctype, rank);
gfc_add_expr_to_block (&fnblock, tmp);
}
@@ -6025,7 +6086,7 @@ gfc_deallocate_alloc_comp (gfc_symbol * der_type, tree decl, int rank)
/* Recursively traverse an object of derived type, generating code to
- copy its allocatable components. */
+ copy it and its allocatable components. */
tree
gfc_copy_alloc_comp (gfc_symbol * der_type, tree decl, tree dest, int rank)
@@ -6034,6 +6095,16 @@ gfc_copy_alloc_comp (gfc_symbol * der_type, tree decl, tree dest, int rank)
}
+/* Recursively traverse an object of derived type, generating code to
+ copy only its allocatable components. */
+
+tree
+gfc_copy_only_alloc_comp (gfc_symbol * der_type, tree decl, tree dest, int rank)
+{
+ return structure_alloc_comps (der_type, decl, dest, rank, COPY_ONLY_ALLOC_COMP);
+}
+
+
/* NULLIFY an allocatable/pointer array on function entry, free it on exit.
Do likewise, recursively if necessary, with the allocatable components of
derived types. */
diff --git a/gcc/fortran/trans-array.h b/gcc/fortran/trans-array.h
index 175b3c60ff5..6807fcbe612 100644
--- a/gcc/fortran/trans-array.h
+++ b/gcc/fortran/trans-array.h
@@ -45,7 +45,9 @@ tree gfc_trans_g77_array (gfc_symbol *, tree);
/* Generate code to deallocate an array, if it is allocated. */
tree gfc_trans_dealloc_allocated (tree);
-tree gfc_duplicate_allocatable(tree dest, tree src, tree type, int rank);
+tree gfc_duplicate_allocatable (tree dest, tree src, tree type, int rank);
+
+tree gfc_copy_allocatable_data (tree dest, tree src, tree type, int rank);
tree gfc_nullify_alloc_comp (gfc_symbol *, tree, int);
@@ -53,6 +55,8 @@ tree gfc_deallocate_alloc_comp (gfc_symbol *, tree, int);
tree gfc_copy_alloc_comp (gfc_symbol *, tree, tree, int);
+tree gfc_copy_only_alloc_comp (gfc_symbol *, tree, tree, int);
+
/* Add initialization for deferred arrays. */
tree gfc_trans_deferred_array (gfc_symbol *, tree);
/* Generate an initializer for a static pointer or allocatable array. */
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 5ce5dcec4c5..bb69d454e92 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -2757,6 +2757,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
tree var;
tree len;
tree stringargs;
+ tree result = NULL;
gfc_formal_arglist *formal;
int has_alternate_specifier = 0;
bool need_interface_mapping;
@@ -3288,6 +3289,8 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
se->expr = build_fold_indirect_ref_loc (input_location,
se->expr);
+ result = build_fold_indirect_ref_loc (input_location,
+ se->expr);
retargs = gfc_chainon_list (retargs, se->expr);
}
else if (comp && comp->attr.dimension)
@@ -3310,8 +3313,8 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
callee_alloc, &se->ss->expr->where);
/* Pass the temporary as the first argument. */
- tmp = info->descriptor;
- tmp = gfc_build_addr_expr (NULL_TREE, tmp);
+ result = info->descriptor;
+ tmp = gfc_build_addr_expr (NULL_TREE, result);
retargs = gfc_chainon_list (retargs, tmp);
}
else if (!comp && sym->result->attr.dimension)
@@ -3334,8 +3337,8 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
callee_alloc, &se->ss->expr->where);
/* Pass the temporary as the first argument. */
- tmp = info->descriptor;
- tmp = gfc_build_addr_expr (NULL_TREE, tmp);
+ result = info->descriptor;
+ tmp = gfc_build_addr_expr (NULL_TREE, result);
retargs = gfc_chainon_list (retargs, tmp);
}
else if (ts.type == BT_CHARACTER)
@@ -3487,7 +3490,36 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
/* Follow the function call with the argument post block. */
if (byref)
- gfc_add_block_to_block (&se->pre, &post);
+ {
+ gfc_add_block_to_block (&se->pre, &post);
+
+ /* Transformational functions of derived types with allocatable
+ components must have the result allocatable components copied. */
+ arg = expr->value.function.actual;
+ if (result && arg && expr->rank
+ && expr->value.function.isym
+ && expr->value.function.isym->transformational
+ && arg->expr->ts.type == BT_DERIVED
+ && arg->expr->ts.u.derived->attr.alloc_comp)
+ {
+ tree tmp2;
+ /* Copy the allocatable components. We have to use a
+ temporary here to prevent source allocatable components
+ from being corrupted. */
+ tmp2 = gfc_evaluate_now (result, &se->pre);
+ tmp = gfc_copy_alloc_comp (arg->expr->ts.u.derived,
+ result, tmp2, expr->rank);
+ gfc_add_expr_to_block (&se->pre, tmp);
+ tmp = gfc_copy_allocatable_data (result, tmp2, TREE_TYPE(tmp2),
+ expr->rank);
+ gfc_add_expr_to_block (&se->pre, tmp);
+
+ /* Finally free the temporary's data field. */
+ tmp = gfc_conv_descriptor_data_get (tmp2);
+ tmp = gfc_deallocate_with_status (tmp, NULL_TREE, true, NULL);
+ gfc_add_expr_to_block (&se->pre, tmp);
+ }
+ }
else
gfc_add_block_to_block (&se->post, &post);
@@ -4906,6 +4938,15 @@ gfc_trans_arrayfunc_assign (gfc_expr * expr1, gfc_expr * expr2)
gfc_conv_array_parameter (&se, expr1, ss, 0, NULL, NULL, NULL);
+ if (expr1->ts.type == BT_DERIVED
+ && expr1->ts.u.derived->attr.alloc_comp)
+ {
+ tree tmp;
+ tmp = gfc_deallocate_alloc_comp (expr1->ts.u.derived, se.expr,
+ expr1->rank);
+ gfc_add_expr_to_block (&se.pre, tmp);
+ }
+
se.direct_byref = 1;
se.ss = gfc_walk_expr (expr2);
gcc_assert (se.ss != gfc_ss_terminator);
diff --git a/gcc/gcc.c b/gcc/gcc.c
index d7d2b3bd641..8efb5704b4a 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -5248,7 +5248,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
buf = (char *) alloca (p - q + 1);
strncpy (buf, q, p - q);
buf[p - q] = 0;
- error ("%s", buf);
+ error ("%s", _(buf));
return -1;
}
break;
@@ -5262,7 +5262,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
buf = (char *) alloca (p - q + 1);
strncpy (buf, q, p - q);
buf[p - q] = 0;
- notice ("%s\n", buf);
+ notice ("%s\n", _(buf));
if (*p)
p++;
}
diff --git a/gcc/gimple.c b/gcc/gimple.c
index 3ee15b56989..dce5ba59fb7 100644
--- a/gcc/gimple.c
+++ b/gcc/gimple.c
@@ -3707,8 +3707,12 @@ iterative_hash_gimple_type (tree type, hashval_t val,
/* For integer types hash the types min/max values and the string flag. */
if (TREE_CODE (type) == INTEGER_TYPE)
{
- v = iterative_hash_expr (TYPE_MIN_VALUE (type), v);
- v = iterative_hash_expr (TYPE_MAX_VALUE (type), v);
+ /* OMP lowering can introduce error_mark_node in place of
+ random local decls in types. */
+ if (TYPE_MIN_VALUE (type) != error_mark_node)
+ v = iterative_hash_expr (TYPE_MIN_VALUE (type), v);
+ if (TYPE_MAX_VALUE (type) != error_mark_node)
+ v = iterative_hash_expr (TYPE_MAX_VALUE (type), v);
v = iterative_hash_hashval_t (TYPE_STRING_FLAG (type), v);
}
diff --git a/gcc/graphite-clast-to-gimple.c b/gcc/graphite-clast-to-gimple.c
index bbc77d21a48..6651e95b48f 100644
--- a/gcc/graphite-clast-to-gimple.c
+++ b/gcc/graphite-clast-to-gimple.c
@@ -52,6 +52,10 @@ along with GCC; see the file COPYING3. If not see
#include "graphite-clast-to-gimple.h"
#include "graphite-dependences.h"
+/* This flag is set when an error occurred during the translation of
+ CLAST to Gimple. */
+static bool gloog_error;
+
/* Verifies properties that GRAPHITE should maintain during translation. */
static inline void
@@ -294,7 +298,11 @@ clast_to_gcc_expression (tree type, struct clast_expr *e,
newivs_index, params_index);
tree cst = gmp_cst_to_tree (type, t->val);
name = fold_convert (type, name);
- return fold_build2 (MULT_EXPR, type, cst, name);
+ if (!POINTER_TYPE_P (type))
+ return fold_build2 (MULT_EXPR, type, cst, name);
+
+ gloog_error = true;
+ return cst;
}
}
else
@@ -944,7 +952,7 @@ translate_clast (sese region, loop_p context_loop, struct clast_stmt *stmt,
htab_t newivs_index, htab_t bb_pbb_mapping, int level,
htab_t params_index)
{
- if (!stmt)
+ if (!stmt || gloog_error)
return next_e;
if (CLAST_STMT_IS_A (stmt, stmt_root))
@@ -1400,8 +1408,8 @@ debug_generated_program (scop_p scop)
print_generated_program (stderr, scop);
}
-/* Add CLooG names to parameter index. The index is used to translate back from
- * CLooG names to GCC trees. */
+/* Add CLooG names to parameter index. The index is used to translate
+ back from CLooG names to GCC trees. */
static void
create_params_index (htab_t index_table, CloogProgram *prog) {
@@ -1431,6 +1439,7 @@ gloog (scop_p scop, htab_t bb_pbb_mapping)
cloog_prog_clast pc;
timevar_push (TV_GRAPHITE_CODE_GEN);
+ gloog_error = false;
pc = scop_to_clast (scop);
@@ -1471,9 +1480,14 @@ gloog (scop_p scop, htab_t bb_pbb_mapping)
if_region->region->exit->src,
if_region->false_region->exit,
if_region->true_region->exit);
+ scev_reset_htab ();
+ rename_nb_iterations (rename_map);
recompute_all_dominators ();
graphite_verify ();
+ if (gloog_error)
+ set_ifsese_condition (if_region, integer_zero_node);
+
free (if_region->true_region);
free (if_region->region);
free (if_region);
@@ -1500,7 +1514,7 @@ gloog (scop_p scop, htab_t bb_pbb_mapping)
num_no_dependency);
}
- return true;
+ return !gloog_error;
}
#endif
diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c
index c390f272b08..f316459e083 100644
--- a/gcc/lto-streamer-in.c
+++ b/gcc/lto-streamer-in.c
@@ -1291,6 +1291,9 @@ input_function (tree fn_decl, struct data_in *data_in,
fn->va_list_gpr_size = bp_unpack_value (bp, 8);
bitpack_delete (bp);
+ /* Input the current IL state of the function. */
+ fn->curr_properties = lto_input_uleb128 (ib);
+
/* Read the static chain and non-local goto save area. */
fn->static_chain_decl = lto_input_tree (ib, data_in);
fn->nonlocal_goto_save_area = lto_input_tree (ib, data_in);
@@ -1466,14 +1469,6 @@ lto_read_body (struct lto_file_decl_data *file_data, tree fn_decl,
/* We should now be in SSA. */
cfun->gimple_df->in_ssa_p = true;
- /* Fill in properties we know hold for the rebuilt CFG. */
- cfun->curr_properties = PROP_ssa
- | PROP_cfg
- | PROP_gimple_any
- | PROP_gimple_lcf
- | PROP_gimple_leh
- | PROP_referenced_vars;
-
/* Restore decl state */
file_data->current_decl_state = file_data->global_decl_state;
diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c
index fe43dcedc6b..d5431ba5a6e 100644
--- a/gcc/lto-streamer-out.c
+++ b/gcc/lto-streamer-out.c
@@ -1872,6 +1872,9 @@ output_function (struct cgraph_node *node)
lto_output_bitpack (ob->main_stream, bp);
bitpack_delete (bp);
+ /* Output current IL state of the function. */
+ output_uleb128 (ob, fn->curr_properties);
+
/* Output the static chain and non-local goto save area. */
lto_output_tree_ref (ob, fn->static_chain_decl);
lto_output_tree_ref (ob, fn->nonlocal_goto_save_area);
diff --git a/gcc/passes.c b/gcc/passes.c
index fde3379b7c2..a04a5eff92a 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -728,7 +728,6 @@ init_optimization_passes (void)
NEXT_PASS (pass_refactor_eh);
NEXT_PASS (pass_lower_eh);
NEXT_PASS (pass_build_cfg);
- NEXT_PASS (pass_lower_complex_O0);
NEXT_PASS (pass_lower_vector);
NEXT_PASS (pass_warn_function_return);
NEXT_PASS (pass_build_cgraph_edges);
@@ -943,6 +942,7 @@ init_optimization_passes (void)
NEXT_PASS (pass_uncprop);
NEXT_PASS (pass_local_pure_const);
}
+ NEXT_PASS (pass_lower_complex_O0);
NEXT_PASS (pass_cleanup_eh);
NEXT_PASS (pass_lower_resx);
NEXT_PASS (pass_nrv);
@@ -1883,6 +1883,8 @@ dump_properties (FILE *dump, unsigned int props)
fprintf (dump, "PROP_rtl\n");
if (props & PROP_gimple_lomp)
fprintf (dump, "PROP_gimple_lomp\n");
+ if (props & PROP_gimple_lcx)
+ fprintf (dump, "PROP_gimple_lcx\n");
}
void
diff --git a/gcc/po/ChangeLog b/gcc/po/ChangeLog
index 82bd289a75f..5b09d0d8028 100644
--- a/gcc/po/ChangeLog
+++ b/gcc/po/ChangeLog
@@ -1,3 +1,9 @@
+2010-01-14 Shujing Zhao <pearly.zhao@oracle.com>
+
+ PR translation/39521
+ * exgettext: Extracted all specs %n strings and the %e strings that %e
+ is at the start of a line.
+
2010-01-11 Joseph Myers <joseph@codesourcery.com>
* fi.po: Update.
diff --git a/gcc/po/exgettext b/gcc/po/exgettext
index 9c224820603..7ff3799fa20 100644
--- a/gcc/po/exgettext
+++ b/gcc/po/exgettext
@@ -75,12 +75,12 @@ pottmp=$pwd/$T/tmp.pot
# Then generate keyword options for xgettext, by scanning for declarations
# of functions whose parameter names end in "msgid".
#
-# Finally, generate a source file containing all %e strings from
+# Finally, generate a source file containing all %e and %n strings from
# driver specs, so those can be translated too.
#
# All in one huge awk script.
-echo "scanning for keywords and %e strings..." >&2
+echo "scanning for keywords, %e and %n strings..." >&2
( cd $srcdir
lang_subdirs=`echo */config-lang.in */*/config-lang.in | sed -e 's|config-lang\.in||g'`
@@ -132,24 +132,34 @@ function keyword_option(line) {
}
function spec_error_string (line) {
- while ((percent_index = index(line, "%e")) != 0) {
- escape = substr(line, percent_index - 1, 1)
+ if (index(line, "%e") != 0 && index(line, "%n") != 0) return
+ while ((percent_index = index(line, "%e")) != 0 ||
+ (percent_index = index(line, "%n")) != 0) {
line = substr(line, percent_index + 2)
- if (escape == "%") continue
bracket_index = index(line, "}")
+ newline_index = index(line, "\\n")
+
quote_index = index(line, "\"")
- if (bracket_index == 0) return
- if (quote_index != 0 && bracket_index > quote_index) return
+ if (bracket_index == 0 && newline_index == 0) return
- msgid = substr(line, 1, bracket_index - 1)
- line = substr(line, bracket_index + 1)
+ if (bracket_index != 0) {
+ if (quote_index != 0 && bracket_index > quote_index) return
+ msgid = substr(line, 1, bracket_index - 1)
+ line = substr(line, bracket_index + 1)
+ }
+ else if (newline_index != 0) {
+ if (quote_index != 0 && quote_index > newline_index) return
+ msgid = substr(line, 1, newline_index - 1)
+ line = substr(line, newline_index + 1)
+ }
if (index(msgid, "%") != 0) continue
+ if ((newline_index = index(msgid, "\\n")) != 0)
+ msgid = substr(msgid, 1, newline_index - 1)
printf("#line %d \"%s\"\n", lineno, file) > emsg
printf("_(\"%s\")\n", msgid) > emsg
-
}
}
@@ -174,7 +184,7 @@ END {
while (getline < file) {
if (/^(#[ ]*define[ ]*)?[A-Za-z_].*\(.*msgid[,\)]/) {
keyword_option($0)
- } else if (/%e/) {
+ } else if (/%e/ || /%n/) {
spec_error_string($0)
}
lineno++
diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c
index e864eb40c7a..4647c4793d8 100644
--- a/gcc/sel-sched-ir.c
+++ b/gcc/sel-sched-ir.c
@@ -1,5 +1,5 @@
/* Instruction scheduling pass. Selective scheduler and pipeliner.
- Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+ Copyright (C) 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
This file is part of GCC.
@@ -262,7 +262,7 @@ static void
flist_add (flist_t *lp, insn_t insn, state_t state, deps_t dc, void *tc,
insn_t last_scheduled_insn, VEC(rtx,gc) *executing_insns,
int *ready_ticks, int ready_ticks_size, insn_t sched_next,
- int cycle, int cycle_issued_insns,
+ int cycle, int cycle_issued_insns, int issue_more,
bool starts_cycle_p, bool after_stall_p)
{
fence_t f;
@@ -287,6 +287,7 @@ flist_add (flist_t *lp, insn_t insn, state_t state, deps_t dc, void *tc,
FENCE_TC (f) = tc;
FENCE_LAST_SCHEDULED_INSN (f) = last_scheduled_insn;
+ FENCE_ISSUE_MORE (f) = issue_more;
FENCE_EXECUTING_INSNS (f) = executing_insns;
FENCE_READY_TICKS (f) = ready_ticks;
FENCE_READY_TICKS_SIZE (f) = ready_ticks_size;
@@ -618,6 +619,7 @@ init_fences (insn_t old_fence)
ready_ticks_size,
NULL_RTX /* sched_next */,
1 /* cycle */, 0 /* cycle_issued_insns */,
+ issue_rate, /* issue_more */
1 /* starts_cycle_p */, 0 /* after_stall_p */);
}
}
@@ -629,14 +631,14 @@ init_fences (insn_t old_fence)
3) all other fields are set to corresponding constant values.
INSN, STATE, DC, TC, LAST_SCHEDULED_INSN, EXECUTING_INSNS,
- READY_TICKS, READY_TICKS_SIZE, SCHED_NEXT, CYCLE and AFTER_STALL_P
- are the corresponding fields of the second fence. */
+ READY_TICKS, READY_TICKS_SIZE, SCHED_NEXT, CYCLE, ISSUE_MORE
+ and AFTER_STALL_P are the corresponding fields of the second fence. */
static void
merge_fences (fence_t f, insn_t insn,
state_t state, deps_t dc, void *tc,
rtx last_scheduled_insn, VEC(rtx, gc) *executing_insns,
int *ready_ticks, int ready_ticks_size,
- rtx sched_next, int cycle, bool after_stall_p)
+ rtx sched_next, int cycle, int issue_more, bool after_stall_p)
{
insn_t last_scheduled_insn_old = FENCE_LAST_SCHEDULED_INSN (f);
@@ -666,6 +668,7 @@ merge_fences (fence_t f, insn_t insn,
FENCE_CYCLE (f) = cycle;
FENCE_LAST_SCHEDULED_INSN (f) = NULL;
+ FENCE_ISSUE_MORE (f) = issue_rate;
VEC_free (rtx, gc, executing_insns);
free (ready_ticks);
if (FENCE_EXECUTING_INSNS (f))
@@ -697,6 +700,7 @@ merge_fences (fence_t f, insn_t insn,
delete_target_context (tc);
FENCE_LAST_SCHEDULED_INSN (f) = NULL;
+ FENCE_ISSUE_MORE (f) = issue_rate;
}
else
if (candidate->src == BLOCK_FOR_INSN (last_scheduled_insn))
@@ -713,6 +717,7 @@ merge_fences (fence_t f, insn_t insn,
FENCE_TC (f) = tc;
FENCE_LAST_SCHEDULED_INSN (f) = last_scheduled_insn;
+ FENCE_ISSUE_MORE (f) = issue_more;
}
else
{
@@ -799,7 +804,8 @@ add_to_fences (flist_tail_t new_fences, insn_t insn,
state_t state, deps_t dc, void *tc, rtx last_scheduled_insn,
VEC(rtx, gc) *executing_insns, int *ready_ticks,
int ready_ticks_size, rtx sched_next, int cycle,
- int cycle_issued_insns, bool starts_cycle_p, bool after_stall_p)
+ int cycle_issued_insns, int issue_rate,
+ bool starts_cycle_p, bool after_stall_p)
{
fence_t f = flist_lookup (FLIST_TAIL_HEAD (new_fences), insn);
@@ -808,7 +814,7 @@ add_to_fences (flist_tail_t new_fences, insn_t insn,
flist_add (FLIST_TAIL_TAILP (new_fences), insn, state, dc, tc,
last_scheduled_insn, executing_insns, ready_ticks,
ready_ticks_size, sched_next, cycle, cycle_issued_insns,
- starts_cycle_p, after_stall_p);
+ issue_rate, starts_cycle_p, after_stall_p);
FLIST_TAIL_TAILP (new_fences)
= &FLIST_NEXT (*FLIST_TAIL_TAILP (new_fences));
@@ -817,7 +823,7 @@ add_to_fences (flist_tail_t new_fences, insn_t insn,
{
merge_fences (f, insn, state, dc, tc, last_scheduled_insn,
executing_insns, ready_ticks, ready_ticks_size,
- sched_next, cycle, after_stall_p);
+ sched_next, cycle, issue_rate, after_stall_p);
}
}
@@ -836,7 +842,7 @@ move_fence_to_fences (flist_t old_fences, flist_tail_t new_fences)
merge_fences (f, old->insn, old->state, old->dc, old->tc,
old->last_scheduled_insn, old->executing_insns,
old->ready_ticks, old->ready_ticks_size,
- old->sched_next, old->cycle,
+ old->sched_next, old->cycle, old->issue_more,
old->after_stall_p);
}
else
@@ -862,7 +868,7 @@ add_clean_fence_to_fences (flist_tail_t new_fences, insn_t succ, fence_t fence)
NULL_RTX, NULL,
XCNEWVEC (int, ready_ticks_size), ready_ticks_size,
NULL_RTX, FENCE_CYCLE (fence) + 1,
- 0, 1, FENCE_AFTER_STALL_P (fence));
+ 0, issue_rate, 1, FENCE_AFTER_STALL_P (fence));
}
/* Add a new fence to NEW_FENCES list and initialize all of its data
@@ -886,6 +892,7 @@ add_dirty_fence_to_fences (flist_tail_t new_fences, insn_t succ, fence_t fence)
FENCE_SCHED_NEXT (fence),
FENCE_CYCLE (fence),
FENCE_ISSUED_INSNS (fence),
+ FENCE_ISSUE_MORE (fence),
FENCE_STARTS_CYCLE_P (fence),
FENCE_AFTER_STALL_P (fence));
}
@@ -3503,9 +3510,36 @@ verify_backedges (void)
/* Functions to work with control flow. */
+/* Recompute BLOCK_TO_BB and BB_FOR_BLOCK for current region so that blocks
+ are sorted in topological order (it might have been invalidated by
+ redirecting an edge). */
+static void
+sel_recompute_toporder (void)
+{
+ int i, n, rgn;
+ int *postorder, n_blocks;
+
+ postorder = XALLOCAVEC (int, n_basic_blocks);
+ n_blocks = post_order_compute (postorder, false, false);
+
+ rgn = CONTAINING_RGN (BB_TO_BLOCK (0));
+ for (n = 0, i = n_blocks - 1; i >= 0; i--)
+ if (CONTAINING_RGN (postorder[i]) == rgn)
+ {
+ BLOCK_TO_BB (postorder[i]) = n;
+ BB_TO_BLOCK (n) = postorder[i];
+ n++;
+ }
+
+ /* Assert that we updated info for all blocks. We may miss some blocks if
+ this function is called when redirecting an edge made a block
+ unreachable, but that block is not deleted yet. */
+ gcc_assert (n == RGN_NR_BLOCKS (rgn));
+}
+
/* Tidy the possibly empty block BB. */
-bool
-maybe_tidy_empty_bb (basic_block bb)
+static bool
+maybe_tidy_empty_bb (basic_block bb, bool recompute_toporder_p)
{
basic_block succ_bb, pred_bb;
edge e;
@@ -3513,12 +3547,15 @@ maybe_tidy_empty_bb (basic_block bb)
bool rescan_p;
/* Keep empty bb only if this block immediately precedes EXIT and
- has incoming non-fallthrough edge. Otherwise remove it. */
+ has incoming non-fallthrough edge, or it has no predecessors or
+ successors. Otherwise remove it. */
if (!sel_bb_empty_p (bb)
|| (single_succ_p (bb)
&& single_succ (bb) == EXIT_BLOCK_PTR
&& (!single_pred_p (bb)
- || !(single_pred_edge (bb)->flags & EDGE_FALLTHRU))))
+ || !(single_pred_edge (bb)->flags & EDGE_FALLTHRU)))
+ || EDGE_COUNT (bb->preds) == 0
+ || EDGE_COUNT (bb->succs) == 0)
return false;
/* Do not attempt to redirect complex edges. */
@@ -3552,7 +3589,7 @@ maybe_tidy_empty_bb (basic_block bb)
if (!(e->flags & EDGE_FALLTHRU))
{
- sel_redirect_edge_and_branch (e, succ_bb);
+ recompute_toporder_p |= sel_redirect_edge_and_branch (e, succ_bb);
rescan_p = true;
break;
}
@@ -3568,10 +3605,14 @@ maybe_tidy_empty_bb (basic_block bb)
{
gcc_assert (pred_bb != NULL);
- move_bb_info (pred_bb, bb);
+ if (in_current_region_p (pred_bb))
+ move_bb_info (pred_bb, bb);
remove_empty_bb (bb, true);
}
+ if (recompute_toporder_p)
+ sel_recompute_toporder ();
+
#ifdef ENABLE_CHECKING
verify_backedges ();
#endif
@@ -3589,7 +3630,7 @@ tidy_control_flow (basic_block xbb, bool full_tidying)
insn_t first, last;
/* First check whether XBB is empty. */
- changed = maybe_tidy_empty_bb (xbb);
+ changed = maybe_tidy_empty_bb (xbb, false);
if (changed || !full_tidying)
return changed;
@@ -3640,22 +3681,45 @@ tidy_control_flow (basic_block xbb, bool full_tidying)
/* Also this jump is not at the scheduling boundary. */
&& !IN_CURRENT_FENCE_P (BB_END (xbb->prev_bb)))
{
+ bool recompute_toporder_p;
/* Clear data structures of jump - jump itself will be removed
by sel_redirect_edge_and_branch. */
clear_expr (INSN_EXPR (BB_END (xbb->prev_bb)));
- sel_redirect_edge_and_branch (EDGE_SUCC (xbb->prev_bb, 0), xbb);
+ recompute_toporder_p
+ = sel_redirect_edge_and_branch (EDGE_SUCC (xbb->prev_bb, 0), xbb);
+
gcc_assert (EDGE_SUCC (xbb->prev_bb, 0)->flags & EDGE_FALLTHRU);
/* It can turn out that after removing unused jump, basic block
that contained that jump, becomes empty too. In such case
remove it too. */
if (sel_bb_empty_p (xbb->prev_bb))
- changed = maybe_tidy_empty_bb (xbb->prev_bb);
+ changed = maybe_tidy_empty_bb (xbb->prev_bb, recompute_toporder_p);
+ else if (recompute_toporder_p)
+ sel_recompute_toporder ();
}
return changed;
}
+/* Purge meaningless empty blocks in the middle of a region. */
+void
+purge_empty_blocks (void)
+{
+ /* Do not attempt to delete preheader. */
+ int i = sel_is_loop_preheader_p (BASIC_BLOCK (BB_TO_BLOCK (0))) ? 1 : 0;
+
+ while (i < current_nr_blocks)
+ {
+ basic_block b = BASIC_BLOCK (BB_TO_BLOCK (i));
+
+ if (maybe_tidy_empty_bb (b, false))
+ continue;
+
+ i++;
+ }
+}
+
/* Rip-off INSN from the insn stream. When ONLY_DISCONNECT is true,
do not delete insn's data, because it will be later re-emitted.
Return true if we have removed some blocks afterwards. */
@@ -4353,11 +4417,12 @@ sel_init_bbs (bb_vec_t bbs, basic_block bb)
sched_scan (&ssi, bbs, bb, new_insns, NULL);
}
-/* Restore other notes for the whole region. */
+/* Restore notes for the whole region. */
static void
-sel_restore_other_notes (void)
+sel_restore_notes (void)
{
int bb;
+ insn_t insn;
for (bb = 0; bb < current_nr_blocks; bb++)
{
@@ -4372,6 +4437,10 @@ sel_restore_other_notes (void)
restore_other_notes (NULL, first);
BB_NOTE_LIST (first) = NULL_RTX;
+ FOR_BB_INSNS (first, insn)
+ if (NONDEBUG_INSN_P (insn))
+ reemit_notes (insn);
+
first = first->next_bb;
}
while (first != last);
@@ -4382,7 +4451,7 @@ sel_restore_other_notes (void)
void
sel_finish_bbs (void)
{
- sel_restore_other_notes ();
+ sel_restore_notes ();
/* Remove current loop preheader from this loop. */
if (current_loop_nest)
@@ -5355,8 +5424,9 @@ sel_redirect_edge_and_branch_force (edge e, basic_block to)
sel_init_new_insn (jump, INSN_INIT_TODO_LUID | INSN_INIT_TODO_SIMPLEJUMP);
}
-/* A wrapper for redirect_edge_and_branch. */
-void
+/* A wrapper for redirect_edge_and_branch. Return TRUE if blocks connected by
+ redirected edge are in reverse topological order. */
+bool
sel_redirect_edge_and_branch (edge e, basic_block to)
{
bool latch_edge_p;
@@ -5364,6 +5434,7 @@ sel_redirect_edge_and_branch (edge e, basic_block to)
int prev_max_uid;
rtx jump;
edge redirected;
+ bool recompute_toporder_p = false;
latch_edge_p = (pipelining_p
&& current_loop_nest
@@ -5383,9 +5454,18 @@ sel_redirect_edge_and_branch (edge e, basic_block to)
gcc_assert (loop_latch_edge (current_loop_nest));
}
+ /* In rare situations, the topological relation between the blocks connected
+ by the redirected edge can change (see PR42245 for an example). Update
+ block_to_bb/bb_to_block. */
+ if (CONTAINING_RGN (e->src->index) == CONTAINING_RGN (to->index)
+ && BLOCK_TO_BB (e->src->index) > BLOCK_TO_BB (to->index))
+ recompute_toporder_p = true;
+
jump = find_new_jump (src, NULL, prev_max_uid);
if (jump)
sel_init_new_insn (jump, INSN_INIT_TODO_LUID | INSN_INIT_TODO_SIMPLEJUMP);
+
+ return recompute_toporder_p;
}
/* This variable holds the cfg hooks used by the selective scheduler. */
@@ -5819,7 +5899,7 @@ considered_for_pipelining_p (struct loop *loop)
latch. We can't use header here, because this header could be
just removed preheader and it will give us the wrong region number.
Latch can't be used because it could be in the inner loop too. */
- if (LOOP_MARKED_FOR_PIPELINING_P (loop) && pipelining_p)
+ if (LOOP_MARKED_FOR_PIPELINING_P (loop))
{
int rgn = CONTAINING_RGN (loop->latch->index);
@@ -5968,7 +6048,10 @@ sel_add_loop_preheaders (void)
for (i = 0;
VEC_iterate (basic_block, preheader_blocks, i, bb);
i++)
+ {
+ VEC_safe_push (basic_block, heap, last_added_blocks, bb);
sel_add_bb (bb);
+ }
VEC_free (basic_block, heap, preheader_blocks);
}
diff --git a/gcc/sel-sched-ir.h b/gcc/sel-sched-ir.h
index 1950a65e77f..20f0bba5374 100644
--- a/gcc/sel-sched-ir.h
+++ b/gcc/sel-sched-ir.h
@@ -1,6 +1,6 @@
/* Instruction scheduling pass. This file contains definitions used
internally in the scheduler.
- Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+ Copyright (C) 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
This file is part of GCC.
@@ -296,6 +296,9 @@ struct _fence
/* Insn, which has been scheduled last on this fence. */
rtx last_scheduled_insn;
+ /* The last value of can_issue_more variable on this fence. */
+ int issue_more;
+
/* If non-NULL force the next scheduled insn to be SCHED_NEXT. */
rtx sched_next;
@@ -325,6 +328,7 @@ typedef struct _fence *fence_t;
#define FENCE_DC(F) ((F)->dc)
#define FENCE_TC(F) ((F)->tc)
#define FENCE_LAST_SCHEDULED_INSN(F) ((F)->last_scheduled_insn)
+#define FENCE_ISSUE_MORE(F) ((F)->issue_more)
#define FENCE_EXECUTING_INSNS(F) ((F)->executing_insns)
#define FENCE_READY_TICKS(F) ((F)->ready_ticks)
#define FENCE_READY_TICKS_SIZE(F) ((F)->ready_ticks_size)
@@ -715,7 +719,8 @@ struct _sel_insn_data
bitmap found_deps;
/* An INSN_UID bit is set when this is a bookkeeping insn generated from
- a parent with this uid. */
+ a parent with this uid. If a parent is a bookkeeping copy, all its
+ originators are transitively included in this set. */
bitmap originators;
/* A hashtable caching the result of insn transformations through this one. */
@@ -1142,7 +1147,8 @@ get_all_loop_exits (basic_block bb)
/* Traverse all loop headers. */
for (i = 0; VEC_iterate (edge, exits, i, e); i++)
- if (in_current_region_p (e->dest))
+ if (in_current_region_p (e->dest)
+ || inner_loop_header_p (e->dest))
{
VEC(edge, heap) *next_exits = get_all_loop_exits (e->dest);
@@ -1613,11 +1619,11 @@ extern bool tidy_control_flow (basic_block, bool);
extern void free_bb_note_pool (void);
extern void sel_remove_empty_bb (basic_block, bool, bool);
-extern bool maybe_tidy_empty_bb (basic_block bb);
+extern void purge_empty_blocks (void);
extern basic_block sel_split_edge (edge);
extern basic_block sel_create_recovery_block (insn_t);
extern void sel_merge_blocks (basic_block, basic_block);
-extern void sel_redirect_edge_and_branch (edge, basic_block);
+extern bool sel_redirect_edge_and_branch (edge, basic_block);
extern void sel_redirect_edge_and_branch_force (edge, basic_block);
extern void sel_init_pipelining (void);
extern void sel_finish_pipelining (void);
diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c
index e5ebc57387b..6ec404b6270 100644
--- a/gcc/sel-sched.c
+++ b/gcc/sel-sched.c
@@ -1,5 +1,5 @@
/* Instruction scheduling pass. Selective scheduler and pipeliner.
- Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+ Copyright (C) 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
This file is part of GCC.
@@ -588,6 +588,7 @@ advance_one_cycle (fence_t fence)
FENCE_ISSUED_INSNS (fence) = 0;
FENCE_STARTS_CYCLE_P (fence) = 1;
can_issue_more = issue_rate;
+ FENCE_ISSUE_MORE (fence) = can_issue_more;
for (i = 0; VEC_iterate (rtx, FENCE_EXECUTING_INSNS (fence), i, insn); )
{
@@ -1228,19 +1229,19 @@ mark_unavailable_hard_regs (def_t def, struct reg_rename *reg_rename_p,
if (!reload_completed && !HARD_REGISTER_NUM_P (regno))
return;
- mode = GET_MODE (orig_dest);
+ if (reload_completed)
+ cl = get_reg_class (def->orig_insn);
- /* Stop when mode is not supported for renaming. Also can't proceed
- if the original register is one of the fixed_regs, global_regs or
- frame pointer. */
+ /* Stop if the original register is one of the fixed_regs, global_regs or
+ frame pointer, or we could not discover its class. */
if (fixed_regs[regno]
|| global_regs[regno]
#if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
- || (frame_pointer_needed && regno == HARD_FRAME_POINTER_REGNUM)
+ || (frame_pointer_needed && regno == HARD_FRAME_POINTER_REGNUM)
#else
- || (frame_pointer_needed && regno == FRAME_POINTER_REGNUM)
+ || (frame_pointer_needed && regno == FRAME_POINTER_REGNUM)
#endif
- )
+ || (reload_completed && cl == NO_REGS))
{
SET_HARD_REG_SET (reg_rename_p->unavailable_hard_regs);
@@ -1295,11 +1296,11 @@ mark_unavailable_hard_regs (def_t def, struct reg_rename *reg_rename_p,
/* Leave regs as 'available' only from the current
register class. */
- cl = get_reg_class (def->orig_insn);
- gcc_assert (cl != NO_REGS);
COPY_HARD_REG_SET (reg_rename_p->available_for_renaming,
reg_class_contents[cl]);
+ mode = GET_MODE (orig_dest);
+
/* Leave only registers available for this mode. */
if (!sel_hrd.regs_for_mode_ok[mode])
init_regs_for_mode (mode);
@@ -1428,6 +1429,16 @@ choose_best_reg_1 (HARD_REG_SET hard_regs_used,
0, cur_reg, hrsi)
if (! TEST_HARD_REG_BIT (hard_regs_used, cur_reg))
{
+ /* Check that all hard regs for mode are available. */
+ for (i = 1, n = hard_regno_nregs[cur_reg][mode]; i < n; i++)
+ if (TEST_HARD_REG_BIT (hard_regs_used, cur_reg + i)
+ || !TEST_HARD_REG_BIT (reg_rename_p->available_for_renaming,
+ cur_reg + i))
+ break;
+
+ if (i < n)
+ continue;
+
/* All hard registers are available. */
if (best_new_reg < 0
|| reg_rename_tick[cur_reg] < reg_rename_tick[best_new_reg])
@@ -1459,6 +1470,7 @@ choose_best_reg (HARD_REG_SET hard_regs_used, struct reg_rename *reg_rename_p,
rtx best_reg = choose_best_reg_1 (hard_regs_used, reg_rename_p,
original_insns, is_orig_reg_p_ptr);
+ /* FIXME loop over hard_regno_nregs here. */
gcc_assert (best_reg == NULL_RTX
|| TEST_HARD_REG_BIT (sel_hrd.regs_ever_used, REGNO (best_reg)));
@@ -1642,14 +1654,6 @@ collect_unavailable_regs_from_bnds (expr_t expr, blist_t bnds, regset used_regs,
static bool
try_replace_dest_reg (ilist_t orig_insns, rtx best_reg, expr_t expr)
{
- if (expr_dest_regno (expr) == REGNO (best_reg))
- {
- EXPR_TARGET_AVAILABLE (expr) = 1;
- return true;
- }
-
- gcc_assert (orig_insns);
-
/* Try whether we'll be able to generate the insn
'dest := best_reg' at the place of the original operation. */
for (; orig_insns; orig_insns = ILIST_NEXT (orig_insns))
@@ -1658,14 +1662,19 @@ try_replace_dest_reg (ilist_t orig_insns, rtx best_reg, expr_t expr)
gcc_assert (EXPR_SEPARABLE_P (INSN_EXPR (orig_insn)));
- if (!replace_src_with_reg_ok_p (orig_insn, best_reg)
- || !replace_dest_with_reg_ok_p (orig_insn, best_reg))
+ if (REGNO (best_reg) != REGNO (INSN_LHS (orig_insn))
+ && (! replace_src_with_reg_ok_p (orig_insn, best_reg)
+ || ! replace_dest_with_reg_ok_p (orig_insn, best_reg)))
return false;
}
/* Make sure that EXPR has the right destination
register. */
- replace_dest_with_reg_in_expr (expr, best_reg);
+ if (expr_dest_regno (expr) != REGNO (best_reg))
+ replace_dest_with_reg_in_expr (expr, best_reg);
+ else
+ EXPR_TARGET_AVAILABLE (expr) = 1;
+
return true;
}
@@ -2743,8 +2752,7 @@ compute_av_set_at_bb_end (insn_t insn, ilist_t p, int ws)
VEC_index (int, sinfo->probs_ok, is),
sinfo->all_prob);
- if (sinfo->all_succs_n > 1
- && sinfo->all_succs_n == sinfo->succs_ok_n)
+ if (sinfo->all_succs_n > 1)
{
/* Find EXPR'es that came from *all* successors and save them
into expr_in_all_succ_branches. This set will be used later
@@ -3304,8 +3312,8 @@ sel_target_adjust_priority (expr_t expr)
gcc_assert (EXPR_PRIORITY_ADJ (expr) >= 0);
- if (sched_verbose >= 2)
- sel_print ("sel_target_adjust_priority: insn %d, %d +%d = %d.\n",
+ if (sched_verbose >= 4)
+ sel_print ("sel_target_adjust_priority: insn %d, %d+%d = %d.\n",
INSN_UID (EXPR_INSN_RTX (expr)), EXPR_PRIORITY (expr),
EXPR_PRIORITY_ADJ (expr), new_priority);
@@ -4106,7 +4114,7 @@ invoke_reorder_hooks (fence_t fence)
ran_hook = true;
}
else
- issue_more = issue_rate;
+ issue_more = FENCE_ISSUE_MORE (fence);
/* Ensure that ready list and vec_av_set are in line with each other,
i.e. vec_av_set[i] == ready_element (&ready, i). */
@@ -4297,8 +4305,6 @@ get_expr_cost (expr_t expr, fence_t fence)
if (recog_memoized (insn) < 0)
{
if (!FENCE_STARTS_CYCLE_P (fence)
- /* FIXME: Is this condition necessary? */
- && VINSN_UNIQUE_P (EXPR_VINSN (expr))
&& INSN_ASM_P (insn))
/* This is asm insn which is tryed to be issued on the
cycle not first. Issue it on the next cycle. */
@@ -5211,12 +5217,21 @@ move_exprs_to_boundary (bnd_t bnd, expr_t expr_vliw,
EXECUTE_IF_SET_IN_BITMAP (current_copies, 0, book_uid, bi)
{
+ unsigned uid;
+ bitmap_iterator bi;
+
/* We allocate these bitmaps lazily. */
if (! INSN_ORIGINATORS_BY_UID (book_uid))
INSN_ORIGINATORS_BY_UID (book_uid) = BITMAP_ALLOC (NULL);
bitmap_copy (INSN_ORIGINATORS_BY_UID (book_uid),
current_originators);
+
+ /* Transitively add all originators' originators. */
+ EXECUTE_IF_SET_IN_BITMAP (current_originators, 0, uid, bi)
+ if (INSN_ORIGINATORS_BY_UID (uid))
+ bitmap_ior_into (INSN_ORIGINATORS_BY_UID (book_uid),
+ INSN_ORIGINATORS_BY_UID (uid));
}
return should_move;
@@ -5277,6 +5292,7 @@ advance_state_on_fence (fence_t fence, insn_t insn)
debug_state (FENCE_STATE (fence));
if (!DEBUG_INSN_P (insn))
FENCE_STARTS_CYCLE_P (fence) = 0;
+ FENCE_ISSUE_MORE (fence) = can_issue_more;
return asm_p;
}
@@ -5474,6 +5490,7 @@ fill_insns (fence_t fence, int seqno, ilist_t **scheduled_insns_tailpp)
blist_add (&bnds, insn, NULL, FENCE_DC (fence));
bnds_tailp = &BLIST_NEXT (bnds);
set_target_context (FENCE_TC (fence));
+ can_issue_more = FENCE_ISSUE_MORE (fence);
target_bb = INSN_BB (insn);
/* Do while we can add any operation to the current group. */
@@ -5805,14 +5822,19 @@ maybe_emit_renaming_copy (rtx insn,
moveop_static_params_p params)
{
bool insn_emitted = false;
- rtx cur_reg = expr_dest_reg (params->c_expr);
+ rtx cur_reg;
+
+ /* Bail out early when expression can not be renamed at all. */
+ if (!EXPR_SEPARABLE_P (params->c_expr))
+ return false;
- gcc_assert (!cur_reg || (params->dest && REG_P (params->dest)));
+ cur_reg = expr_dest_reg (params->c_expr);
+ gcc_assert (cur_reg && params->dest && REG_P (params->dest));
/* If original operation has expr and the register chosen for
that expr is not original operation's dest reg, substitute
operation's right hand side with the register chosen. */
- if (cur_reg != NULL_RTX && REGNO (params->dest) != REGNO (cur_reg))
+ if (REGNO (params->dest) != REGNO (cur_reg))
{
insn_t reg_move_insn, reg_move_insn_rtx;
@@ -6768,24 +6790,6 @@ setup_current_loop_nest (int rgn)
gcc_assert (LOOP_MARKED_FOR_PIPELINING_P (current_loop_nest));
}
-/* Purge meaningless empty blocks in the middle of a region. */
-static void
-purge_empty_blocks (void)
-{
- /* Do not attempt to delete preheader. */
- int i = sel_is_loop_preheader_p (BASIC_BLOCK (BB_TO_BLOCK (0))) ? 1 : 0;
-
- while (i < current_nr_blocks)
- {
- basic_block b = BASIC_BLOCK (BB_TO_BLOCK (i));
-
- if (maybe_tidy_empty_bb (b))
- continue;
-
- i++;
- }
-}
-
/* Compute instruction priorities for current region. */
static void
sel_compute_priorities (int rgn)
diff --git a/gcc/sese.c b/gcc/sese.c
index 50ac698ec0f..f959bdb269e 100644
--- a/gcc/sese.c
+++ b/gcc/sese.c
@@ -486,7 +486,7 @@ sese_adjust_vphi (sese region, gimple phi, edge true_e)
}
}
-/* Returns the name associated to OLD_NAME in MAP. */
+/* Returns the expression associated to OLD_NAME in MAP. */
static tree
get_rename (htab_t map, tree old_name)
@@ -503,7 +503,7 @@ get_rename (htab_t map, tree old_name)
return old_name;
}
-/* Register in MAP the rename tuple (old_name, expr). */
+/* Register in MAP the rename tuple (OLD_NAME, EXPR). */
void
set_rename (htab_t map, tree old_name, tree expr)
@@ -526,6 +526,67 @@ set_rename (htab_t map, tree old_name, tree expr)
*slot = new_rename_map_elt (old_name, expr);
}
+static void rename_variables_in_expr (htab_t, tree);
+
+/* Renames the operand OP of expression T following the tuples
+ (OLD_NAME, EXPR) in RENAME_MAP. */
+
+static void
+rename_variables_in_operand (htab_t rename_map, tree t, int op)
+{
+ tree operand = TREE_OPERAND (t, op);
+
+ if (TREE_CODE (operand) == SSA_NAME)
+ {
+ tree new_name = get_rename (rename_map, operand);
+
+ if (new_name != operand)
+ TREE_OPERAND (t, op) = new_name;
+ }
+ else
+ rename_variables_in_expr (rename_map, operand);
+}
+
+/* Renames the expression T following the tuples (OLD_NAME, EXPR) in
+ RENAME_MAP. */
+
+static void
+rename_variables_in_expr (htab_t rename_map, tree t)
+{
+ if (!t)
+ return;
+
+ switch (TREE_CODE_LENGTH (TREE_CODE (t)))
+ {
+ case 3:
+ rename_variables_in_operand (rename_map, t, 2);
+
+ case 2:
+ rename_variables_in_operand (rename_map, t, 1);
+
+ case 1:
+ rename_variables_in_operand (rename_map, t, 0);
+
+ default:
+ return;
+ }
+}
+
+/* Renames all the loop->nb_iterations expressions following the
+ tuples (OLD_NAME, EXPR) in RENAME_MAP. */
+
+void
+rename_nb_iterations (htab_t rename_map)
+{
+ loop_iterator li;
+ struct loop *loop;
+
+ FOR_EACH_LOOP (li, loop, 0)
+ {
+ rename_variables_in_expr (rename_map, loop->nb_iterations);
+ }
+}
+
/* Adjusts the phi nodes in the block BB for variables defined in
SCOP_REGION and used outside the SCOP_REGION. The code generation
moves SCOP_REGION in the else clause of an "if (1)" and generates
@@ -550,8 +611,9 @@ sese_adjust_liveout_phis (sese region, htab_t rename_map, basic_block bb,
unsigned i;
unsigned false_i = 0;
gimple phi = gsi_stmt (si);
+ tree res = gimple_phi_result (phi);
- if (!is_gimple_reg (PHI_RESULT (phi)))
+ if (!is_gimple_reg (res))
{
sese_adjust_vphi (region, phi, true_e);
continue;
@@ -585,6 +647,7 @@ sese_adjust_liveout_phis (sese region, htab_t rename_map, basic_block bb,
}
SET_PHI_ARG_DEF (phi, i, expr);
+ set_rename (rename_map, old_name, res);
}
}
}
@@ -1495,6 +1558,34 @@ move_sese_in_condition (sese region)
return if_region;
}
+/* Replaces the condition of the IF_REGION with CONDITION:
+ | if (CONDITION)
+ | true_region;
+ | else
+ | false_region;
+*/
+
+void
+set_ifsese_condition (ifsese if_region, tree condition)
+{
+ sese region = if_region->region;
+ edge entry = region->entry;
+ basic_block bb = entry->dest;
+ gimple last = last_stmt (bb);
+ gimple_stmt_iterator gsi = gsi_last_bb (bb);
+ gimple cond_stmt;
+
+ gcc_assert (gimple_code (last) == GIMPLE_COND);
+
+ gsi_remove (&gsi, true);
+ gsi = gsi_last_bb (bb);
+ condition = force_gimple_operand_gsi (&gsi, condition, true, NULL,
+ false, GSI_NEW_STMT);
+ cond_stmt = gimple_build_cond_from_tree (condition, NULL_TREE, NULL_TREE);
+ gsi = gsi_last_bb (bb);
+ gsi_insert_after (&gsi, cond_stmt, GSI_NEW_STMT);
+}
+
/* Returns the scalar evolution of T in REGION. Every variable that
is not defined in the REGION is considered a parameter. */
diff --git a/gcc/sese.h b/gcc/sese.h
index 6763db34c27..a54854a7610 100644
--- a/gcc/sese.h
+++ b/gcc/sese.h
@@ -229,6 +229,7 @@ extern ifsese create_if_region_on_edge (edge, tree);
extern ifsese move_sese_in_condition (sese);
extern edge get_true_edge_from_guard_bb (basic_block);
extern edge get_false_edge_from_guard_bb (basic_block);
+extern void set_ifsese_condition (ifsese, tree);
static inline edge
if_region_entry (ifsese if_region)
@@ -262,6 +263,7 @@ extern void debug_rename_map (htab_t);
extern hashval_t rename_map_elt_info (const void *);
extern int eq_rename_map_elts (const void *, const void *);
extern void set_rename (htab_t, tree, tree);
+extern void rename_nb_iterations (htab_t);
/* Constructs a new SCEV_INFO_STR structure for VAR and INSTANTIATED_BELOW. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ae31eae0e36..995ba7989e0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,168 @@
+2010-01-16 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/42760
+ * g++.dg/torture/pr42760.C: New test.
+
+2010-01-15 Jing Yu <jingyu@google.com>
+
+ PR rtl-optimization/42691
+ * gcc.c-torture/execute/pr42691.c: New.
+
+2010-01-15 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/42739
+ * g++.dg/torture/pr42739.C: New testcase.
+
+2010-01-15 Dodji Seketeli <dodji@redhat.com>
+
+ * g++.dg/template/error45.C: Revert as part of reverting changes
+ or PR c++/42634.
+
+2010-01-14 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ PR fortran/42684
+ * gfortran.dg/interface_31.f90: New test.
+
+2010-01-14 Michael Meissner <meissner@linux.vnet.ibm.com>
+
+ * gcc.target/powerpc/pr42747.c: New file.
+
+2010-01-14 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/42674
+ * c-c++-common/pr42674.c: New test.
+
+ PR c++/42608
+ * g++.dg/template/instantiate11.C: New test.
+
+2010-01-14 Jason Merrill <jason@redhat.com>
+
+ PR c++/42701
+ * g++.dg/overload/error3.C: New.
+
+ PR c++/42655
+ * g++.dg/overload/rvalue1.C: New.
+
+2010-01-14 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/42706
+ * gcc.dg/ipa/pr42706.c: New testcase.
+
+2010-01-14 H.J. Lu <hongjiu.lu@intel.com>
+
+ * g++.dg/graphite/pr42681.C (size_t): Use __SIZE_TYPE__.
+
+2010-01-14 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/42714
+ * g++.dg/torture/pr42714.C: New test.
+
+2010-01-14 Alexander Monakov <amonakov@ispras.ru>
+
+ PR rtl-optimization/42246
+ * gfortran.dg/pr42246-2.f: New.
+
+2010-01-14 Alexander Monakov <amonakov@ispras.ru>
+
+ PR rtl-optimization/42389
+ * gcc.dg/pr42389.c: New.
+
+2010-01-14 Alexander Monakov <amonakov@ispras.ru>
+
+ PR rtl-optimization/42388
+ * gcc.dg/pr42388.c: New.
+
+2010-01-14 Alexander Monakov <amonakov@ispras.ru>
+
+ PR rtl-optimization/42294
+ * gfortran.dg/pr42294.f: New.
+
+2010-01-14 Alexander Monakov <amonakov@ispras.ru>
+
+ PR rtl-optimization/39453
+ PR rtl-optimization/42246
+ * gcc.dg/pr39453.c: New.
+ * gcc.dg/pr42246.c: New.
+
+2010-01-14 Alexander Monakov <amonakov@ispras.ru>
+
+ PR middle-end/42245
+ * gcc.dg/pr42245.c: New.
+ * gcc.dg/pr42245-2.c: New.
+
+2010-01-14 Alexander Monakov <amonakov@ispras.ru>
+
+ PR rtl-optimization/42249
+ * gcc.dg/pr42249.c: New.
+
+2010-01-14 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/42721
+ * gcc.c-torture/execute/pr42721.c: New test.
+
+2010-01-14 Ira Rosen <irar@il.ibm.com>
+
+ PR tree-optimization/42709
+ * gcc.dg/vect/pr42709.c: New test.
+
+2010-01-14 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/41478
+ * gfortran.dg/alloc_comp_scalar_1.f90: New test.
+ * gfortran.dg/alloc_comp_transformational_1.f90: New test.
+
+2010-01-14 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/42481
+ * gfortran.dg/generic_19.f90 : New test.
+
+2010-01-13 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/42730
+ * gcc.c-torture/compile/pr42730.c: New testcase.
+
+2010-01-13 Steve Ellcey <sje@cup.hp.com>
+
+ PR target/pr42542
+ * gcc.target/ia64/pr42542-1.c: New.
+ * gcc.target/ia64/pr42542-2.c: New.
+ * gcc.target/ia64/pr42542-3.c: New.
+
+2010-01-13 Dodji Seketeli <dodji@redhat.com>
+
+ PR c++/42634
+ * g++.dg/template/error45.C: New test.
+
+2010-01-13 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/42704
+ * g++.dg/torture/pr42704.C: New test.
+
+2010-01-13 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/42703
+ * gcc.c-torture/compile/pr42703.c: New test.
+
+2010-01-13 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/42705
+ * gcc.c-torture/compile/pr42705.c: New testcase.
+
+2010-01-13 Jie Zhang <jie.zhang@analog.com>
+
+ * gcc.target/bfin/l2.c: New test.
+ * gcc.target/bfin/bfin.exp (dg-bfin-processors): New.
+
+2010-01-13 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/42716
+ * gcc.c-torture/compile/pr42716.c: New testcase.
+
+2010-01-13 Richard Guenther <rguenther@suse.de>
+
+ PR lto/42678
+ * gfortran.dg/lto/20100110-1_0.f90: New testcase.
+
2010-01-12 Joseph Myers <joseph@codesourcery.com>
PR c/42708
diff --git a/gcc/testsuite/c-c++-common/pr42674.c b/gcc/testsuite/c-c++-common/pr42674.c
new file mode 100644
index 00000000000..ae6730c50b0
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr42674.c
@@ -0,0 +1,13 @@
+/* PR middle-end/42674 */
+/* { dg-do compile } */
+/* { dg-options "-Wreturn-type" } */
+
+extern void bar (void);
+static int foo (void) __attribute__ ((__noreturn__, __used__));
+
+static int
+foo (void)
+{
+ while (1)
+ bar ();
+}
diff --git a/gcc/testsuite/g++.dg/graphite/pr42681.C b/gcc/testsuite/g++.dg/graphite/pr42681.C
new file mode 100644
index 00000000000..4c137ec0615
--- /dev/null
+++ b/gcc/testsuite/g++.dg/graphite/pr42681.C
@@ -0,0 +1,17 @@
+/* { dg-options "-O1 -fgraphite-identity -fno-loop-block -fno-loop-interchange -fno-loop-strip-mine" } */
+
+typedef __SIZE_TYPE__ size_t;
+inline void* operator new(size_t, void* __p) throw() { return __p; }
+
+struct A {
+ int i, j;
+ A() : i(0) {}
+};
+
+void Init(A *a)
+{
+ for (int i = 0; i < 20; i++) {
+ new (&a[i]) A;
+ a[i].j = 0;
+ }
+}
diff --git a/gcc/testsuite/g++.dg/overload/error3.C b/gcc/testsuite/g++.dg/overload/error3.C
new file mode 100644
index 00000000000..e0003dd8813
--- /dev/null
+++ b/gcc/testsuite/g++.dg/overload/error3.C
@@ -0,0 +1,41 @@
+// PR c++/42701
+// Test for error-recovery on code that is ill-formed by DR 147.
+
+namespace Glib {
+ class ustring {
+ public:
+ typedef unsigned size_type;
+ ustring(const char* src, size_type n);
+ ustring(const char* src);
+ };
+}
+namespace Gdk {
+ class Color {
+ public:
+ explicit Color(const Glib::ustring& value);
+ };
+}
+namespace Gtk {
+ enum StateType { STATE_NORMAL };
+ class Widget {
+ public:
+ void modify_bg(StateType state, const Gdk::Color& color);
+ };
+ class Label {
+ public:
+ void set_text(const Glib::ustring &str);
+ };
+}
+typedef enum Result { eSuccess = 0 } Result;
+class MainWindow {
+ void update_status(Result result);
+ Gtk::Widget status_frame;
+ Gtk::Label status_label;
+};
+void MainWindow::update_status(Result result) {
+ switch (result) {
+ status_frame.modify_bg(Gtk::STATE_NORMAL,Gdk::Color::Color("green")); // { dg-error "" }
+ status_frame.modify_bg(Gtk::STATE_NORMAL,Gdk::Color::Color("red")); // { dg-error "" }
+ status_label.set_text("Out of memory");
+ }
+}
diff --git a/gcc/testsuite/g++.dg/overload/rvalue1.C b/gcc/testsuite/g++.dg/overload/rvalue1.C
new file mode 100644
index 00000000000..41805949ded
--- /dev/null
+++ b/gcc/testsuite/g++.dg/overload/rvalue1.C
@@ -0,0 +1,10 @@
+// PR c++/42655
+
+void unused(const bool &) { }
+
+int main() {
+ volatile bool x = false;
+ unused(!!x); // type of "!x" is bool
+ unused(!x); // type of "!x" is bool
+}
+
diff --git a/gcc/testsuite/g++.dg/template/instantiate11.C b/gcc/testsuite/g++.dg/template/instantiate11.C
new file mode 100644
index 00000000000..3598d5890bf
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/instantiate11.C
@@ -0,0 +1,25 @@
+// PR c++/42608
+// { dg-do compile }
+
+template <class U, class V>
+struct A;
+
+template <class V>
+struct A<int, V>
+{
+ void f ();
+};
+
+template struct A<int, int>;
+
+int
+main ()
+{
+ A<int, int> a;
+ a.f ();
+ return 0;
+}
+
+// Make sure we get undefined reference error if
+// A<int, int>::f () isn't instantiated elsewhere.
+// { dg-final { scan-assembler-not "weak\[\n\t\]*_ZN1AIiiE1fEv" } }
diff --git a/gcc/testsuite/g++.dg/torture/pr42704.C b/gcc/testsuite/g++.dg/torture/pr42704.C
new file mode 100644
index 00000000000..735b1e7bdea
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr42704.C
@@ -0,0 +1,44 @@
+/* { dg-do compile } */
+
+typedef int PRInt32;
+class nsTreeRows {
+ class Subtree { };
+ enum { kMaxDepth = 32 };
+ struct Link {
+ Subtree* mParent;
+ PRInt32 mChildIndex;
+ Link& operator=(const Link& aLink) {
+ mParent = aLink.mParent;
+ mChildIndex = aLink.mChildIndex;
+ }
+ };
+ class iterator {
+ PRInt32 mTop;
+ PRInt32 mRowIndex;
+ Link mLink[kMaxDepth];
+ public:
+ iterator() : mTop(-1), mRowIndex(-1) { }
+ iterator& operator=(const iterator& aIterator);
+ };
+ Subtree* EnsureSubtreeFor(Subtree* aParent, PRInt32 aChildIndex);
+ Subtree* GetSubtreeFor(const Subtree* aParent,
+PRInt32 aChildIndex, PRInt32* aSubtreeSize = 0);
+ void InvalidateCachedRow() {
+ mLastRow = iterator();
+ }
+ iterator mLastRow;
+};
+nsTreeRows::Subtree* nsTreeRows::EnsureSubtreeFor(Subtree* aParent,
+ PRInt32 aChildIndex) {
+ Subtree* subtree = GetSubtreeFor(aParent, aChildIndex);
+ if (! subtree) {
+ InvalidateCachedRow();
+ }
+}
+nsTreeRows::iterator& nsTreeRows::iterator::operator=(const iterator&
+aIterator) {
+ mTop = aIterator.mTop;
+ for (PRInt32 i = mTop;
+ i >= 0;
+ --i) mLink[i] = aIterator.mLink[i];
+}
diff --git a/gcc/testsuite/g++.dg/torture/pr42714.C b/gcc/testsuite/g++.dg/torture/pr42714.C
new file mode 100644
index 00000000000..b1b2d856efc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr42714.C
@@ -0,0 +1,37 @@
+struct QVectorData {
+ static QVectorData shared_null;
+};
+template <typename T> class QVector {
+ union {
+ QVectorData *d;
+ };
+public:
+ inline QVector() : d(&QVectorData::shared_null) { }
+ inline QVector(const QVector<T> &v) : d(v.d) { }
+};
+class QXmlStreamAttribute { };
+class QXmlStreamAttributes : public QVector<QXmlStreamAttribute> { };
+class __attribute__ ((visibility("default"))) Smoke {
+public:
+ union StackItem;
+ typedef StackItem* Stack;
+ typedef short Index;
+};
+class SmokeBinding { };
+namespace __smokeqt {
+ class x_QXmlStreamAttributes : public QXmlStreamAttributes {
+ SmokeBinding* _binding;
+ public:
+ static void x_11(Smoke::Stack x) {
+ x_QXmlStreamAttributes* xret = new x_QXmlStreamAttributes();
+ }
+ explicit x_QXmlStreamAttributes() : QXmlStreamAttributes() { }
+ };
+ void xcall_QXmlStreamAttributes(Smoke::Index xi, void *obj,
+ Smoke::Stack args)
+ {
+ switch(xi) {
+ case 11: x_QXmlStreamAttributes::x_11(args);
+ }
+ }
+}
diff --git a/gcc/testsuite/g++.dg/torture/pr42739.C b/gcc/testsuite/g++.dg/torture/pr42739.C
new file mode 100644
index 00000000000..ccc05f8360c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr42739.C
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+struct s { ~s() { s(); } };
+
+int f()
+{
+ M:
+ s o = s();
+ f();
+ f();
+
+ L:
+ goto *(f() ? &&L : &&M);
+
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/torture/pr42760.C b/gcc/testsuite/g++.dg/torture/pr42760.C
new file mode 100644
index 00000000000..be85f7fc408
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr42760.C
@@ -0,0 +1,46 @@
+// PR middle-end/42760
+// { dg-do compile }
+
+template <typename T>
+struct A
+{
+ static T b (T it) { return it; }
+};
+
+template <typename T, typename U>
+static U
+baz (T x, T y, U z)
+{
+ for (long n = y - x; n > 0; --n)
+ {
+ *z = *x;
+ ++z;
+ }
+};
+
+template <typename T, typename U>
+U
+bar (T x, T y, U z)
+{
+ baz (A <T>::b (x), A <T>::b (y), A <U>::b (z));
+}
+
+struct C
+{
+ __complex__ float v;
+};
+
+template <class T>
+struct B
+{
+ B (T y[]) { bar (y, y + 1, x); }
+ operator T *() { return x; }
+ T x[1];
+};
+
+B <C>
+foo ()
+{
+ C y[1];
+ return B <C> (y);
+};
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr42703.c b/gcc/testsuite/gcc.c-torture/compile/pr42703.c
new file mode 100644
index 00000000000..4805b17b069
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr42703.c
@@ -0,0 +1,12 @@
+__extension__ typedef unsigned long long int uint64_t;
+typedef uint64_t ScmUInt64;
+void swapb64(ScmUInt64 *loc)
+{
+ union {
+ ScmUInt64 l;
+ unsigned char c[4];
+ } dd;
+ unsigned char t;
+ dd.l = *loc;
+ (t = dd.c[3], dd.c[3] = dd.c[4], dd.c[4] = t);
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr42705.c b/gcc/testsuite/gcc.c-torture/compile/pr42705.c
new file mode 100644
index 00000000000..3d7b22da833
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr42705.c
@@ -0,0 +1,58 @@
+typedef int GLint;
+typedef unsigned char GLubyte;
+typedef unsigned int uint32_t;
+struct radeon_bo {
+ void *ptr;
+ uint32_t flags;
+};
+struct radeon_renderbuffer {
+ struct radeon_bo *bo;
+ unsigned int cpp;
+ int has_surface;
+};
+static inline
+GLint r600_1d_tile_helper(const struct radeon_renderbuffer * rrb,
+ GLint x, GLint y, GLint is_depth, GLint is_stencil)
+{
+ GLint element_bytes = rrb->cpp;
+ GLint num_samples = 1;
+ GLint tile_width = 8;
+ GLint tile_height = 8;
+ GLint tile_thickness = 1;
+ GLint tile_bytes;
+ GLint tiles_per_row;
+ GLint slice_offset;
+ GLint tile_row_index;
+ GLint tile_column_index;
+ GLint tile_offset;
+ GLint pixel_number = 0;
+ GLint element_offset;
+ GLint offset = 0;
+ tile_bytes = tile_width * tile_height * tile_thickness
+ * element_bytes * num_samples;
+ tile_column_index = x / tile_width;
+ tile_offset = ((tile_row_index * tiles_per_row)
+ + tile_column_index) * tile_bytes;
+ if (is_depth) {
+ }
+ else {
+ GLint sample_offset;
+ switch (element_bytes) {
+ case 1: pixel_number |= ((x >> 0) & 1) << 0;
+ }
+ element_offset = sample_offset + (pixel_number * element_bytes);
+ }
+ offset = slice_offset + tile_offset + element_offset;
+ return offset;
+}
+GLubyte *r600_ptr_color(const struct radeon_renderbuffer * rrb,
+ GLint x, GLint y)
+{
+ GLubyte *ptr = rrb->bo->ptr;
+ uint32_t mask = 1 | 2;
+ GLint offset;
+ if (rrb->has_surface || !(rrb->bo->flags & mask)) {
+ offset = r600_1d_tile_helper(rrb, x, y, 0, 0);
+ }
+ return &ptr[offset];
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr42716.c b/gcc/testsuite/gcc.c-torture/compile/pr42716.c
new file mode 100644
index 00000000000..e52df0f4ae3
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr42716.c
@@ -0,0 +1,18 @@
+static short foo (long long si1, short si2)
+{
+ return si1 > 0 && si2 > 0 || si1 < 0
+ && si2 < 0 && si1 < 1 - si2 ? : si1 + si2;
+}
+
+int g_13;
+unsigned g_17;
+
+int safe (int, int);
+
+void bar (short p_51, short * p_52)
+{
+ int *const l_55 = &g_13;
+ if (safe (*p_52, g_13 != foo (*p_52 & *l_55 == g_13 && g_17 >= 1, 0)))
+ {
+ }
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr42730.c b/gcc/testsuite/gcc.c-torture/compile/pr42730.c
new file mode 100644
index 00000000000..89aaafe870a
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr42730.c
@@ -0,0 +1,14 @@
+union bzz
+{
+ unsigned *pa;
+ void *pv;
+};
+
+void foo (void)
+{
+ union bzz u;
+ void **x;
+ void *y = 0;
+ x = &u.pv;
+ *x = y;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr42691.c b/gcc/testsuite/gcc.c-torture/execute/pr42691.c
new file mode 100644
index 00000000000..7eeee99ec2f
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr42691.c
@@ -0,0 +1,41 @@
+extern void abort (void);
+
+union _D_rep
+{
+ unsigned short rep[4];
+ double val;
+};
+
+int add(double* key, double* table)
+{
+ unsigned i = 0;
+ double* deletedEntry = 0;
+ while (1) {
+ double* entry = table + i;
+
+ if (*entry == *key)
+ break;
+
+ union _D_rep _D_inf = {{ 0, 0, 0, 0x7ff0 }};
+ if (*entry != _D_inf.val)
+ abort ();
+
+ union _D_rep _D_inf2 = {{ 0, 0, 0, 0x7ff0 }};
+ if (!_D_inf2.val)
+ deletedEntry = entry;
+
+ i++;
+ }
+ if (deletedEntry)
+ *deletedEntry = 0.0;
+ return 0;
+}
+
+int main ()
+{
+ union _D_rep infinit = {{ 0, 0, 0, 0x7ff0 }};
+ double table[2] = { infinit.val, 23 };
+ double key = 23;
+ int ret = add (&key, table);
+ return ret;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr42721.c b/gcc/testsuite/gcc.c-torture/execute/pr42721.c
new file mode 100644
index 00000000000..706921b0dbe
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr42721.c
@@ -0,0 +1,21 @@
+/* PR c/42721 */
+
+extern void abort (void);
+
+static unsigned long long
+foo (unsigned long long x, unsigned long long y)
+{
+ return x / y;
+}
+
+static int a, b;
+
+int
+main (void)
+{
+ unsigned long long c = 1;
+ b ^= c && (foo (a, -1ULL) != 1L);
+ if (b != 1)
+ abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/ipa/pr42706.c b/gcc/testsuite/gcc.dg/ipa/pr42706.c
new file mode 100644
index 00000000000..9c5f43af36f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/ipa/pr42706.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-early-inlining -fipa-sra" } */
+
+struct S
+{
+ float red;
+ int green;
+ void *blue;
+};
+
+extern int gi;
+static int foo ();
+
+int
+bar (void)
+{
+ foo ();
+ return 0;
+}
+
+static int
+foo (struct S s)
+{
+ gi = s.green;
+ return 0;
+}
+
diff --git a/gcc/testsuite/gcc.dg/pr39453.c b/gcc/testsuite/gcc.dg/pr39453.c
new file mode 100644
index 00000000000..66ecc3fa020
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr39453.c
@@ -0,0 +1,18 @@
+/* { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -fselective-scheduling2 -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops" } */
+
+int foo(int k, int n)
+{
+ int i;
+ for (i = 0; i < n; i += 8) {
+ int j;
+ for (j = 0; j < n; j += 8) {
+ while (k < n) {
+ k += 8;
+ }
+ }
+ }
+ return k;
+}
+
+
diff --git a/gcc/testsuite/gcc.dg/pr42245-2.c b/gcc/testsuite/gcc.dg/pr42245-2.c
new file mode 100644
index 00000000000..48f9e0eb853
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr42245-2.c
@@ -0,0 +1,20 @@
+/* { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -fselective-scheduling -fsel-sched-pipelining" } */
+
+int
+strictly_smaller_name (char *s, char *t)
+{
+ int ss, tt;
+ while ((*s != '\0') || (*t != '\0'))
+ {
+ if (*s == '\0')
+ ss = '*';
+ else
+ ss = *s++;
+ if (*t != '\0')
+ tt = *t;
+ if (ss == tt)
+ return 0;
+ }
+}
+
diff --git a/gcc/testsuite/gcc.dg/pr42245.c b/gcc/testsuite/gcc.dg/pr42245.c
new file mode 100644
index 00000000000..98dd1d067e7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr42245.c
@@ -0,0 +1,30 @@
+/* { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -fselective-scheduling -fsel-sched-pipelining" } */
+
+extern int N_words;
+typedef struct DIS_node_struct DIS_node;
+typedef struct CON_list_struct CON_list;
+
+struct DIS_node_struct
+{
+ CON_list *cl;
+};
+
+void
+build_DIS_CON_tree (void)
+{
+ int w;
+ DIS_node *dnroot, *dn;
+ CON_list *child, *xchild;
+ for (w = 0; w < N_words; w++)
+ {
+ if (dnroot == ((void *) 0))
+ {
+ dnroot = dn;
+ for (child = dn->cl; child != ((void *) 0); child = xchild)
+ {
+ }
+ }
+ }
+}
+
diff --git a/gcc/testsuite/gcc.dg/pr42246.c b/gcc/testsuite/gcc.dg/pr42246.c
new file mode 100644
index 00000000000..ee17a211210
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr42246.c
@@ -0,0 +1,36 @@
+/* { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -fselective-scheduling -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops" } */
+
+typedef enum
+{
+ empty = 0, pawn = 1, knight = 2, king = 3, bishop = 5, rook = 6, queen = 7
+}
+PIECE;
+extern int p_values[15];
+extern int *last[65];
+int
+Quiesce (int alpha, int beta, int wtm, int ply)
+{
+ register int initial_alpha, value, delta;
+ register int *goodmv, *movep, moves = 0, *sortv, temp;
+ for (movep = last[ply - 1]; movep < last[ply]; movep++)
+ if (p_values[(((*movep) >> 15) & 7) + 7] +
+ p_values[(((*movep) >> 18) & 7) + 7] >= delta)
+ {
+ register int done;
+ register int *end = last[ply - 1] + moves - 1;
+ do
+ {
+ done = 1;
+ movep = last[ply - 1];
+ for (; movep < end; movep++, sortv++)
+ if (*sortv < *(sortv + 1))
+ {
+ *(movep + 1) = temp;
+ done = 0;
+ }
+ }
+ while (!done);
+ }
+}
+
diff --git a/gcc/testsuite/gcc.dg/pr42249.c b/gcc/testsuite/gcc.dg/pr42249.c
new file mode 100644
index 00000000000..21708749d5a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr42249.c
@@ -0,0 +1,37 @@
+/* { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -fselective-scheduling -fsel-sched-pipelining" } */
+
+typedef struct TypHeader
+{
+ unsigned long size;
+ struct TypHeader **ptr;
+} *TypHandle;
+
+extern TypHandle NewBag (unsigned int type, unsigned long size);
+typedef unsigned long TypPoint32;
+
+TypHandle
+QuoPP (TypHandle hdL, TypHandle hdR)
+{
+ TypHandle hdC;
+ unsigned long degC;
+ TypPoint32 *ptC;
+ unsigned long degL;
+ TypPoint32 *ptL;
+ unsigned long degR;
+ TypPoint32 *ptR;
+ unsigned long p;
+
+ degL = ((hdL)->size) / sizeof (TypPoint32);
+ degR = ((hdR)->size) / sizeof (TypPoint32);
+ degC = degL < degR ? degR : degL;
+ hdC = NewBag (9, (unsigned long) (degC * sizeof (TypPoint32)));
+ ptC = (TypPoint32 *) ((TypHandle *) ((hdC)->ptr));
+
+ for (p = 0; p < degC; p++)
+ ptC[(((p) < (degR)) ? (ptR)[(p)] : (p))] =
+ ((((((p) < (degL)) ? (ptL)[(p)] : (p))) <
+ (degR)) ? (ptR)[((((p) < (degL)) ? (ptL)[(p)] : (p)))]
+ : ((((p) < (degL)) ? (ptL)[(p)] : (p))));
+}
+
diff --git a/gcc/testsuite/gcc.dg/pr42388.c b/gcc/testsuite/gcc.dg/pr42388.c
new file mode 100644
index 00000000000..ad97eb4d98a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr42388.c
@@ -0,0 +1,67 @@
+/* { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -fselective-scheduling -fmodulo-sched" } */
+
+enum rtx_code
+{
+ INSN, ADDR_VEC, ADDR_DIFF_VEC, CALL_INSN, CODE_LABEL, BARRIER, NOTE
+};
+typedef union rtunion_def
+{
+ int rtint;
+ char *rtstr;
+ struct rtx_def *rtx;
+ struct rtvec_def *rtvec;
+}
+rtunion;
+typedef struct rtx_def
+{
+ unsigned short code;
+ rtunion fld[1];
+}
+ *rtx;
+typedef struct rtvec_def
+{
+ unsigned num_elem;
+ rtunion elem[1];
+}
+ *rtvec;
+extern rtx emit_barrier (void);
+extern rtx emit_note (char *);
+
+static void
+copy_loop_body (rtx *map)
+{
+ int i;
+ rtx insn, copy;
+ rtx pat = copy->fld[3].rtx;
+
+ switch (insn->code)
+ {
+ case INSN:
+ if (insn->fld[7].rtx)
+ {
+ }
+ else if (pat->code == ADDR_VEC || pat->code == ADDR_DIFF_VEC)
+ {
+ int diff_vec_p = pat->code == ADDR_DIFF_VEC;
+ int len = pat->fld[diff_vec_p].rtvec->num_elem;
+ for (i = 0; i < len; i++)
+ pat->fld[diff_vec_p].rtvec->elem[i].rtx->fld[5].rtint++;
+ }
+ case CALL_INSN:
+ for (i = 0; i < 64; i++)
+ map[i] = 0;
+ case CODE_LABEL:
+ case BARRIER:
+ copy = emit_barrier ();
+ case NOTE:
+ copy = emit_note ("x");
+ }
+}
+void
+unroll_loop (int insn_count, rtx *map)
+{
+ if (insn_count > 50)
+ copy_loop_body (map);
+}
+
diff --git a/gcc/testsuite/gcc.dg/pr42389.c b/gcc/testsuite/gcc.dg/pr42389.c
new file mode 100644
index 00000000000..c398012f2b4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr42389.c
@@ -0,0 +1,87 @@
+/* { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -fselective-scheduling -fsel-sched-pipelining -fsched-pressure" } */
+
+struct s_linked_f_pointer
+{
+ struct s_linked_f_pointer *next;
+ float *fptr;
+};
+struct s_trace
+{
+ int index;
+};
+struct s_rr_cost
+{
+ float base_cost;
+ float acc_cost;
+};
+extern int num_nets;
+extern struct s_trace **trace_head;
+extern struct s_rr_cost *rr_cost;
+struct s_rr_route
+{
+ float cost;
+};
+static int heap_tail;
+extern struct s_linked_f_pointer *rr_modified_head;
+extern struct s_rr_route *rr_route;
+
+void
+empty_heap (void)
+{
+ heap_tail = 1;
+}
+
+void
+reset_path_costs (void)
+{
+ struct s_linked_f_pointer *mod_ptr;
+ if (rr_modified_head != ((void *) 0))
+ {
+ mod_ptr = rr_modified_head;
+ while (mod_ptr->next != ((void *) 0))
+ {
+ *(mod_ptr->fptr) = 1.e30;
+ mod_ptr = mod_ptr->next;
+ }
+ rr_modified_head = ((void *) 0);
+ }
+}
+
+static void
+route_net (int inet)
+{
+ int i;
+ for (i = 1; i < inet; i++)
+ reset_path_costs ();
+ empty_heap ();
+ reset_path_costs ();
+}
+
+void
+pathfinder_update_one_cost (int inet, float pres_fac, float acc_fac)
+{
+ struct s_trace *tptr;
+ int inode = 0;
+
+ tptr = trace_head[inet];
+ inode = tptr->index;
+ rr_route[inode].cost = rr_cost[inode].base_cost + rr_cost[inode].acc_cost;
+}
+
+int
+try_route (int n, float x, float y)
+{
+ int inet, itry;
+ float pres_fac;
+ for (itry = 1; itry <= n; itry++)
+ {
+ for (inet = 0; inet < num_nets; inet++)
+ {
+ route_net (inet);
+ pathfinder_update_one_cost (inet, pres_fac, x);
+ }
+ pres_fac *= y;
+ }
+}
+
diff --git a/gcc/testsuite/gcc.dg/vect/pr42709.c b/gcc/testsuite/gcc.dg/vect/pr42709.c
new file mode 100644
index 00000000000..8ccbfa65e81
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr42709.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_int } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 128
+
+int *res[N];
+
+int
+main1 (int *a, int *b, int *c, int *d, int dummy)
+{
+ int i;
+
+ for (i = 0; i < N/2; i+=4)
+ {
+ res[i] = a + 16;
+ res[i+1] = b + 16;
+ res[i+2] = c + 16;
+ res[i+3] = d + 16;
+ if (dummy == 32)
+ abort ();
+ }
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
diff --git a/gcc/testsuite/gcc.target/bfin/bfin.exp b/gcc/testsuite/gcc.target/bfin/bfin.exp
index 854713e2f48..85a50a5ba4a 100644
--- a/gcc/testsuite/gcc.target/bfin/bfin.exp
+++ b/gcc/testsuite/gcc.target/bfin/bfin.exp
@@ -1,4 +1,4 @@
-# Copyright (C) 2007 Free Software Foundation, Inc.
+# Copyright (C) 2007, 2010 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -53,6 +53,30 @@ proc dg-bfin-options {args} {
}
}
+# dg-bfin-processors can be used to specify the processors which can
+# run the test case.
+proc dg-bfin-processors {args} {
+ upvar dg-extra-tool-flags extra_tool_flags
+ upvar dg-do-what do_what
+
+ set multilib_cpu ""
+ set cpu ""
+
+ foreach flag [target_info multilib_flags] {
+ regexp "^-mcpu=([^-]*)" $flag dummy multilib_cpu
+ }
+
+ set cpus [lindex $args 1]
+
+ foreach cpu $cpus {
+ if {$multilib_cpu == $cpu} {
+ return
+ }
+ }
+
+ set do_what [list [lindex $do_what 0] "N" "P"]
+}
+
# Initialize `dg'.
dg-init
diff --git a/gcc/testsuite/gcc.target/bfin/l2.c b/gcc/testsuite/gcc.target/bfin/l2.c
new file mode 100644
index 00000000000..56f64cc82b4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/bfin/l2.c
@@ -0,0 +1,38 @@
+/* { dg-do run { target bfin-*-linux-uclibc } } */
+/* { dg-bfin-processors bf544 bf547 bf548 bf549 bf561} */
+
+#if defined(__ADSPBF544__)
+#define L2_START 0xFEB00000
+#define L2_LENGTH 0x10000
+#else
+#define L2_START 0xFEB00000
+#define L2_LENGTH 0x20000
+#endif
+
+int n __attribute__ ((l2));
+
+int foo (int i) __attribute__ ((l2));
+
+int foo (int a)
+{
+ return a + 1;
+}
+
+int main ()
+{
+ int r;
+ unsigned long *p;
+
+ p = (unsigned long *) foo;
+ if (*p < L2_START || *p >= L2_START + L2_LENGTH)
+ return 1;
+
+ p = (unsigned long *) &n;
+ if ((unsigned long) p < L2_START || (unsigned long) p >= L2_START + L2_LENGTH)
+ return 2;
+
+ if (foo (0) != 1)
+ return 3;
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/ia64/pr42542-1.c b/gcc/testsuite/gcc.target/ia64/pr42542-1.c
new file mode 100644
index 00000000000..9ce66f494a9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/ia64/pr42542-1.c
@@ -0,0 +1,68 @@
+/* { dg-do run } */
+/* { dg-options "-O1 -ftree-vectorize" } */
+
+unsigned int v1[] __attribute__ ((aligned(16))) =
+{
+ 0x80000000, 1, 0xa0000000, 2,
+ 3, 0xd0000000, 0xf0000000, 0xe0000000
+};
+unsigned int v2[] __attribute__ ((aligned(16))) =
+{
+ 4, 0xb0000000, 5, 0xc0000000,
+ 0xd0000000, 6, 7, 8
+};
+
+unsigned int max[] =
+{
+ 0x80000000, 0xb0000000, 0xa0000000, 0xc0000000,
+ 0xd0000000, 0xd0000000, 0xf0000000, 0xe0000000
+};
+
+unsigned int min[] =
+{
+ 4, 1, 5, 2,
+ 3, 6, 7, 8
+};
+
+unsigned int res[8] __attribute__ ((aligned(16)));
+
+extern void abort (void);
+
+void
+find_max (void)
+{
+ int i;
+
+ for (i = 0; i < 8; i++)
+ res[i] = v1[i] < v2[i] ? v2[i] : v1[i];
+}
+
+void
+find_min (void)
+{
+ int i;
+
+ for (i = 0; i < 8; i++)
+ res[i] = v1[i] > v2[i] ? v2[i] : v1[i];
+}
+
+int main (void)
+{
+ int i;
+ int err = 0;
+
+ find_max ();
+ for (i = 0; i < 8; i++)
+ if (res[i] != max[i])
+ err++;
+
+ find_min ();
+ for (i = 0; i < 8; i++)
+ if (res[i] != min[i])
+ err++;
+
+ if (err)
+ abort ();
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/ia64/pr42542-2.c b/gcc/testsuite/gcc.target/ia64/pr42542-2.c
new file mode 100644
index 00000000000..d41eef38386
--- /dev/null
+++ b/gcc/testsuite/gcc.target/ia64/pr42542-2.c
@@ -0,0 +1,68 @@
+/* { dg-do run } */
+/* { dg-options "-O1 -ftree-vectorize" } */
+
+unsigned short v1[] __attribute__ ((aligned(16))) =
+{
+ 0x8000, 0x9000, 1, 10, 0xa000, 0xb000, 2, 20,
+ 3, 30, 0xd000, 0xe000, 0xf000, 0xe000, 25, 30
+};
+unsigned short v2[] __attribute__ ((aligned(16))) =
+{
+ 4, 40, 0xb000, 0x8000, 5, 50, 0xc000, 0xf000,
+ 0xd000, 0xa000, 6, 65, 7, 75, 0xe000, 0xc000
+};
+
+unsigned short max[] =
+{
+ 0x8000, 0x9000, 0xb000, 0x8000, 0xa000, 0xb000, 0xc000, 0xf000,
+ 0xd000, 0xa000, 0xd000, 0xe000, 0xf000, 0xe000, 0xe000, 0xc000
+};
+
+unsigned short min[] =
+{
+ 4, 40, 1, 10, 5, 50, 2, 20,
+ 3, 30, 6, 65, 7, 75, 25, 30
+};
+
+unsigned short res[16] __attribute__ ((aligned(16)));
+
+extern void abort (void);
+
+void
+find_max (void)
+{
+ int i;
+
+ for (i = 0; i < 16; i++)
+ res[i] = v1[i] < v2[i] ? v2[i] : v1[i];
+}
+
+void
+find_min (void)
+{
+ int i;
+
+ for (i = 0; i < 16; i++)
+ res[i] = v1[i] > v2[i] ? v2[i] : v1[i];
+}
+
+int main (void)
+{
+ int i;
+ int err = 0;
+
+ find_max ();
+ for (i = 0; i < 16; i++)
+ if (res[i] != max[i])
+ err++;
+
+ find_min ();
+ for (i = 0; i < 16; i++)
+ if (res[i] != min[i])
+ err++;
+
+ if (err)
+ abort ();
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/ia64/pr42542-3.c b/gcc/testsuite/gcc.target/ia64/pr42542-3.c
new file mode 100644
index 00000000000..29e090883b7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/ia64/pr42542-3.c
@@ -0,0 +1,76 @@
+/* { dg-do run } */
+/* { dg-options "-O1 -ftree-vectorize" } */
+
+unsigned char v1[] __attribute__ ((aligned(16))) =
+{
+ 0x80, 0xd0, 0x90, 0xa0, 1, 15, 10, 15,
+ 0xa0, 0xc0, 0xb0, 0xf0, 2, 25, 20, 35,
+ 3, 34, 30, 36, 0xd0, 0x80, 0xe0, 0xb0,
+ 0xf0, 0xe0, 0xe0, 0x80, 25, 34, 30, 40
+};
+unsigned char v2[] __attribute__ ((aligned(16))) =
+{
+ 4, 44, 40, 48, 0xb0, 0x80, 0x80, 0x90,
+ 5, 55, 50, 51, 0xc0, 0xb0, 0xf0, 0xd0,
+ 0xd0, 0x80, 0xa0, 0xf0, 6, 61, 65, 68,
+ 7, 76, 75, 81, 0xe0, 0xf0, 0xc0, 0x90
+};
+
+unsigned char max[] =
+{
+ 0x80, 0xd0, 0x90, 0xa0, 0xb0, 0x80, 0x80, 0x90,
+ 0xa0, 0xc0, 0xb0, 0xf0, 0xc0, 0xb0, 0xf0, 0xd0,
+ 0xd0, 0x80, 0xa0, 0xf0, 0xd0, 0x80, 0xe0, 0xb0,
+ 0xf0, 0xe0, 0xe0, 0x80, 0xe0, 0xf0, 0xc0, 0x90
+};
+
+unsigned char min[] =
+{
+ 4, 44, 40, 48, 1, 15, 10, 15,
+ 5, 55, 50, 51, 2, 25, 20, 35,
+ 3, 34, 30, 36, 6, 61, 65, 68,
+ 7, 76, 75, 81, 25, 34, 30, 40
+};
+
+unsigned char res[32] __attribute__ ((aligned(16)));
+
+extern void abort (void);
+
+void
+find_max (void)
+{
+ int i;
+
+ for (i = 0; i < 32; i++)
+ res[i] = v1[i] < v2[i] ? v2[i] : v1[i];
+}
+
+void
+find_min (void)
+{
+ int i;
+
+ for (i = 0; i < 32; i++)
+ res[i] = v1[i] > v2[i] ? v2[i] : v1[i];
+}
+
+int main (void)
+{
+ int i;
+ int err = 0;
+
+ find_max ();
+ for (i = 0; i < 32; i++)
+ if (res[i] != max[i])
+ err++;
+
+ find_min ();
+ for (i = 0; i < 32; i++)
+ if (res[i] != min[i])
+ err++;
+
+ if (err)
+ abort ();
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/powerpc/pr42747.c b/gcc/testsuite/gcc.target/powerpc/pr42747.c
new file mode 100644
index 00000000000..9e7310e1767
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr42747.c
@@ -0,0 +1,8 @@
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+/* { dg-require-effective-target powerpc_vsx_ok } */
+/* { dg-options "-O2 -mcpu=power7 -ffast-math" } */
+
+double foo (double x) { return __builtin_sqrt (x); }
+
+/* { dg-final { scan-assembler "xssqrtdp" } } */
diff --git a/gcc/testsuite/gfortran.dg/alloc_comp_scalar_1.f90 b/gcc/testsuite/gfortran.dg/alloc_comp_scalar_1.f90
new file mode 100644
index 00000000000..82cf71fc4fe
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/alloc_comp_scalar_1.f90
@@ -0,0 +1,17 @@
+! { dg-do run }
+! Test the fix for comment #8 of PR41478, in which copying
+! allocatable scalar components caused a segfault.
+!
+! Contributed by Tobias Burnus <burnus@gcc.gnu.org>
+!
+program main
+ type :: container_t
+ integer, allocatable :: entry
+ end type container_t
+ type(container_t), dimension(1) :: a1, a2
+ allocate (a1(1)%entry, a2(1)%entry)
+ a2(1)%entry = 1
+ a1(1:1) = pack (a2(1:1), mask = [.true.])
+ deallocate (a2(1)%entry)
+ if (a1(1)%entry .ne. 1) call abort
+end program main
diff --git a/gcc/testsuite/gfortran.dg/alloc_comp_transformational_1.f90 b/gcc/testsuite/gfortran.dg/alloc_comp_transformational_1.f90
new file mode 100644
index 00000000000..13ee8a88bde
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/alloc_comp_transformational_1.f90
@@ -0,0 +1,80 @@
+! { dg-do run }
+! Tests the fix for PR41478, in which double frees would occur because
+! transformational intrinsics did not copy the allocatable components
+! so that they were (sometimes) freed twice on exit. In addition,
+! The original allocatable components of a1 were not freed, so that
+! memory leakage occurred.
+!
+! Contributed by Juergen Reuter <reuter@physik.uni-freiburg.de>
+!
+ type :: container_t
+ integer, dimension(:), allocatable :: entry
+ integer index
+ end type container_t
+ call foo
+ call bar
+contains
+!
+! This is the reported problem.
+!
+ subroutine foo
+ type(container_t), dimension(4) :: a1, a2, a3
+ integer :: i
+ do i = 1, 4
+ allocate (a1(i)%entry (2), a2(i)%entry (2), a3(i)%entry (2))
+ a1(i)%entry = [1,2]
+ a2(i)%entry = [3,4]
+ a3(i)%entry = [4,5]
+ a1(i)%index = i
+ a2(i)%index = i
+ a3(i)%index = i
+ end do
+ a1(1:2) = pack (a2, [.true., .false., .true., .false.])
+ do i = 1, 4
+ if (.not.allocated (a1(i)%entry)) call abort
+ if (i .gt. 2) then
+ if (any (a1(i)%entry .ne. [1,2])) call abort
+ else
+ if (any (a1(i)%entry .ne. [3,4])) call abort
+ end if
+ end do
+!
+! Now check unpack
+!
+ a1 = unpack (a1, [.true., .true., .false., .false.], a3)
+ if (any (a1%index .ne. [1,3,3,4])) call abort
+ do i = 1, 4
+ if (.not.allocated (a1(i)%entry)) call abort
+ if (i .gt. 2) then
+ if (any (a1(i)%entry .ne. [4,5])) call abort
+ else
+ if (any (a1(i)%entry .ne. [3,4])) call abort
+ end if
+ end do
+ end subroutine
+!
+! Other all transformational intrinsics display it. Having done
+! PACK and UNPACK, just use TRANSPOSE as a demonstrator.
+!
+ subroutine bar
+ type(container_t), dimension(2,2) :: a1, a2
+ integer :: i, j
+ do i = 1, 2
+ do j = 1, 2
+ allocate (a1(i, j)%entry (2), a2(i, j)%entry (2))
+ a1(i, j)%entry = [i,j]
+ a2(i, j)%entry = [i,j]
+ a1(i,j)%index = j + (i - 1)*2
+ a2(i,j)%index = j + (i - 1)*2
+ end do
+ end do
+ a1 = transpose (a2)
+ do i = 1, 2
+ do j = 1, 2
+ if (a1(i,j)%index .ne. i + (j - 1)*2) call abort
+ if (any (a1(i,j)%entry .ne. [j,i])) call abort
+ end do
+ end do
+ end subroutine
+end
+
diff --git a/gcc/testsuite/gfortran.dg/generic_19.f90 b/gcc/testsuite/gfortran.dg/generic_19.f90
new file mode 100644
index 00000000000..f023c5e6356
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/generic_19.f90
@@ -0,0 +1,37 @@
+! { dg-do compile }
+! Test the fix for PR42481, in which 'sub' was not recognised as
+! a generic interface.
+!
+! Contributed by William Mitchell < william.mitchell@nist.gov>
+!
+module mod1
+contains
+ subroutine sub(x, chr)
+ real x
+ character(8) chr
+ if (trim (chr) .ne. "real") call abort
+ if (int (x) .ne. 1) call abort
+ end subroutine sub
+end module mod1
+
+module mod2
+ use mod1
+ interface sub
+ module procedure sub, sub_int
+ end interface sub
+contains
+ subroutine sub_int(i, chr)
+ character(8) chr
+ integer i
+ if (trim (chr) .ne. "integer") call abort
+ if (i .ne. 1) call abort
+ end subroutine sub_int
+end module mod2
+
+program prog
+ use mod1
+ use mod2
+ call sub(1, "integer ")
+ call sub(1.0, "real ")
+end program prog
+! { dg-final { cleanup-modules "mod1 mod2" } }
diff --git a/gcc/testsuite/gfortran.dg/graphite/pr42732.f b/gcc/testsuite/gfortran.dg/graphite/pr42732.f
new file mode 100644
index 00000000000..95c115076a9
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/graphite/pr42732.f
@@ -0,0 +1,23 @@
+! { dg-options "-O2 -fgraphite-identity" }
+
+ parameter(in = 128+5
+ & , jn = 128+5
+ & , kn = 128+5)
+ real*8 d (in,jn,kn)
+ real*8 dcopy(in,jn,kn)
+ call pdv (is, dcopy)
+ do k=ks,ke
+ do j=je+1,je+2
+ do i=is-2,ie+2
+ dcopy(i,j,k) = d(i,j,k)
+ enddo
+ enddo
+ enddo
+ do k=ks,ke
+ do j=js,je
+ do i=is-2,is-1
+ dcopy(i,j,k) = d(i,j,k)
+ enddo
+ enddo
+ enddo
+ end
diff --git a/gcc/testsuite/gfortran.dg/interface_31.f90 b/gcc/testsuite/gfortran.dg/interface_31.f90
new file mode 100644
index 00000000000..3b0e8f8283b
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/interface_31.f90
@@ -0,0 +1,41 @@
+! { dg-do compile }
+! PR42684 (42680) Ice with Interface.
+MODULE mod1
+ IMPLICIT NONE
+ TYPE ta
+ INTEGER i
+ END TYPE ta
+ INTERFACE OPERATOR(+)
+ MODULE PROCEDURE add_a
+ END INTERFACE OPERATOR(+)
+CONTAINS
+ FUNCTION add_a(lhs, rhs) RESULT(r)
+ TYPE(ta), INTENT(IN) :: lhs
+ TYPE(ta), INTENT(IN) :: rhs
+ TYPE(ta) :: r
+ !****
+ r%i = lhs%i + rhs%i
+ END FUNCTION add_a
+END MODULE mod1
+
+MODULE mod2
+ IMPLICIT NONE
+ TYPE tb
+ INTEGER j
+ END TYPE tb
+ INTERFACE OPERATOR(+)
+ MODULE PROCEDURE add_b
+ END INTERFACE OPERATOR(+)
+CONTAINS
+ SUBROUTINE other_proc()
+ USE mod1 ! Causes ICE
+ END SUBROUTINE other_proc
+ FUNCTION add_b(lhs, rhs) RESULT(r)
+ TYPE(tb), INTENT(IN) :: lhs
+ TYPE(tb), INTENT(IN) :: rhs
+ TYPE(tb) :: r
+ !****
+ r%j = lhs%j + rhs%j
+ END FUNCTION add_b
+END MODULE mod2
+! { dg-final { cleanup-modules "mod1 mod2" } }
diff --git a/gcc/testsuite/gfortran.dg/lto/20100110-1_0.f90 b/gcc/testsuite/gfortran.dg/lto/20100110-1_0.f90
new file mode 100644
index 00000000000..d3caa61da28
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/lto/20100110-1_0.f90
@@ -0,0 +1,19 @@
+! { dg-lto-do link }
+! { dg-lto-options {{ -O1 -flto }} }
+! { dg-suppress-ld-options "-O1" }
+
+ SUBROUTINE ylm4(ylm)
+ COMPLEX, INTENT (OUT):: ylm(1)
+ INTEGER l,m
+ COMPLEX ylms
+ REAL, ALLOCATABLE, SAVE :: ynorm(:)
+ ylms = 0
+ DO m = 1, 1
+ DO l = m, 1
+ ylm(m) = conjg(ylms)*ynorm(m)
+ ENDDO
+ ENDDO
+ END SUBROUTINE ylm4
+
+ PROGRAM test
+ END
diff --git a/gcc/testsuite/gfortran.dg/pr42246-2.f b/gcc/testsuite/gfortran.dg/pr42246-2.f
new file mode 100644
index 00000000000..885e3a4abb0
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr42246-2.f
@@ -0,0 +1,21 @@
+C PR rtl-optimization/42246
+C { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } }
+C { dg-options "-O2 -fselective-scheduling -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops" }
+
+ subroutine distance(x,clo)
+ implicit real*8 (a-h,o-z)
+ dimension x(2,6),x1(2,6),clo(6)
+ do 60 i=1,2
+ do 20 j=1,6
+ x(i,j)=clo(j)
+ 20 continue
+ do 40 iq=1,6
+ x1(i,iq)=0.0d0
+ 40 continue
+ do 50 j=1,6
+ x(i,j)=x1(i,j)
+ 50 continue
+ 60 continue
+ return
+ end
+
diff --git a/gcc/testsuite/gfortran.dg/pr42294.f b/gcc/testsuite/gfortran.dg/pr42294.f
new file mode 100644
index 00000000000..9464379083d
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr42294.f
@@ -0,0 +1,41 @@
+C PR rtl-optimization/42294
+C { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } }
+C { dg-options "-O2 -fselective-scheduling2 -fsel-sched-pipelining -funroll-all-loops" }
+
+ SUBROUTINE ORIEN(IW,NATOT,NTOTORB,NATORB,P,T)
+ IMPLICIT DOUBLE PRECISION(A-H,O-Z)
+ DIMENSION NATORB(NATOT),P(NTOTORB*(NTOTORB+1)/2)
+ DIMENSION T(NTOTORB,NTOTORB)
+ DO 9000 IATOM=1,NATOT
+ ILAST = NTOTORB
+ IF (IATOM.NE.NATOT) ILAST=NATORB(IATOM+1)-1
+ DO 8000 IAOI=NATORB(IATOM),ILAST
+ DO 7000 IAOJ = IAOI+1,ILAST
+ R2 = 0.0D+00
+ R3 = 0.0D+00
+ DO 6000 INOTA=1,NATOT
+ DO 5000 IK=NATORB(INOTA),NTOTORB
+ IMAI=MAX(IK,IAOI)
+ IMII=MIN(IK,IAOI)
+ IMAJ=MAX(IK,IAOJ)
+ IMIJ=MIN(IK,IAOJ)
+ IKI=(IMAI*(IMAI-1))/2 + IMII
+ IKJ=(IMAJ*(IMAJ-1))/2 + IMIJ
+ PIKI=P(IKI)
+ PIKJ=P(IKJ)
+ R2 = R2 + (PIKI**4)-6*(PIKI*PIKI*PIKJ*PIKJ)+(PIKJ)
+ 5000 CONTINUE
+ 6000 CONTINUE
+ R2 = (R2/4.0D+00)
+ Q = SQRT(R2*R2 + R3*R3)
+ IF (Q.LT.1.0D-08) GO TO 7000
+ A = COS(THETA)
+ B = -SIN(THETA)
+ CALL ROT1INT(NTOTORB,IAOI,IAOJ,A,B,P)
+ 7000 CONTINUE
+ 8000 CONTINUE
+ 9000 CONTINUE
+ RETURN
+ END
+
+
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 4ba9dd7325b..0a3d544eece 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -4268,6 +4268,15 @@ gimple_verify_flow_info (void)
err = 1;
}
+ if (prev_stmt && EH_LANDING_PAD_NR (label) != 0)
+ {
+ error ("EH landing pad label ");
+ print_generic_expr (stderr, label, 0);
+ fprintf (stderr, " is not first in a sequence of labels in bb %d",
+ bb->index);
+ err = 1;
+ }
+
if (label_to_block (label) != bb)
{
error ("label ");
diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c
index 9fb489a743d..5904407a35b 100644
--- a/gcc/tree-cfgcleanup.c
+++ b/gcc/tree-cfgcleanup.c
@@ -338,7 +338,6 @@ remove_forwarder_block (basic_block bb)
gimple label;
edge_iterator ei;
gimple_stmt_iterator gsi, gsi_to;
- bool seen_abnormal_edge = false;
/* We check for infinite loops already in tree_forwarder_block_p.
However it may happen that the infinite loop is created
@@ -365,14 +364,10 @@ remove_forwarder_block (basic_block bb)
So if there is an abnormal edge to BB, proceed only if there is
no abnormal edge to DEST and there are no phi nodes in DEST. */
- if (has_abnormal_incoming_edge_p (bb))
- {
- seen_abnormal_edge = true;
-
- if (has_abnormal_incoming_edge_p (dest)
- || !gimple_seq_empty_p (phi_nodes (dest)))
- return false;
- }
+ if (has_abnormal_incoming_edge_p (bb)
+ && (has_abnormal_incoming_edge_p (dest)
+ || !gimple_seq_empty_p (phi_nodes (dest))))
+ return false;
/* If there are phi nodes in DEST, and some of the blocks that are
predecessors of BB are also predecessors of DEST, check that the
@@ -419,16 +414,40 @@ remove_forwarder_block (basic_block bb)
}
}
- if (seen_abnormal_edge)
+ /* Move nonlocal labels and computed goto targets as well as user
+ defined labels and labels with an EH landing pad number to the
+ new block, so that the redirection of the abnormal edges works,
+ jump targets end up in a sane place and debug information for
+ labels is retained. */
+ gsi_to = gsi_start_bb (dest);
+ for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); )
+ {
+ tree decl;
+ label = gsi_stmt (gsi);
+ if (is_gimple_debug (label))
+ break;
+ decl = gimple_label_label (label);
+ if (EH_LANDING_PAD_NR (decl) != 0
+ || DECL_NONLOCAL (decl)
+ || FORCED_LABEL (decl)
+ || !DECL_ARTIFICIAL (decl))
+ {
+ gsi_remove (&gsi, false);
+ gsi_insert_before (&gsi_to, label, GSI_SAME_STMT);
+ }
+ else
+ gsi_next (&gsi);
+ }
+
+ /* Move debug statements if the destination has just a single
+ predecessor. */
+ if (single_pred_p (dest))
{
- /* Move the labels to the new block, so that the redirection of
- the abnormal edges works. */
- gsi_to = gsi_start_bb (dest);
- for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); )
+ gsi_to = gsi_after_labels (dest);
+ for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); )
{
- label = gsi_stmt (gsi);
- gcc_assert (gimple_code (label) == GIMPLE_LABEL
- || is_gimple_debug (label));
+ if (!is_gimple_debug (gsi_stmt (gsi)))
+ break;
gsi_remove (&gsi, false);
gsi_insert_before (&gsi_to, label, GSI_SAME_STMT);
}
diff --git a/gcc/tree-complex.c b/gcc/tree-complex.c
index 53bf1185495..ea0a651bfea 100644
--- a/gcc/tree-complex.c
+++ b/gcc/tree-complex.c
@@ -1622,7 +1622,7 @@ struct gimple_opt_pass pass_lower_complex =
0, /* static_pass_number */
TV_NONE, /* tv_id */
PROP_ssa, /* properties_required */
- 0, /* properties_provided */
+ PROP_gimple_lcx, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
TODO_dump_func
@@ -1633,32 +1633,12 @@ struct gimple_opt_pass pass_lower_complex =
};
-/* Entry point for complex operation lowering without optimization. */
-
-static unsigned int
-tree_lower_complex_O0 (void)
-{
- int old_last_basic_block = last_basic_block;
- gimple_stmt_iterator gsi;
- basic_block bb;
-
- FOR_EACH_BB (bb)
- {
- if (bb->index >= old_last_basic_block)
- continue;
-
- for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
- expand_complex_operations_1 (&gsi);
- }
- return 0;
-}
-
static bool
gate_no_optimization (void)
{
/* With errors, normal optimization passes are not run. If we don't
lower complex operations at all, rtl expansion will abort. */
- return optimize == 0 || sorrycount || errorcount;
+ return !(cfun->curr_properties & PROP_gimple_lcx);
}
struct gimple_opt_pass pass_lower_complex_O0 =
@@ -1667,16 +1647,18 @@ struct gimple_opt_pass pass_lower_complex_O0 =
GIMPLE_PASS,
"cplxlower0", /* name */
gate_no_optimization, /* gate */
- tree_lower_complex_O0, /* execute */
+ tree_lower_complex, /* execute */
NULL, /* sub */
NULL, /* next */
0, /* static_pass_number */
TV_NONE, /* tv_id */
PROP_cfg, /* properties_required */
- 0, /* properties_provided */
+ PROP_gimple_lcx, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
- TODO_dump_func | TODO_ggc_collect
- | TODO_verify_stmts, /* todo_flags_finish */
+ TODO_dump_func
+ | TODO_ggc_collect
+ | TODO_update_ssa
+ | TODO_verify_stmts /* todo_flags_finish */
}
};
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 883a431c7ff..d7e515a4d1b 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -2160,6 +2160,12 @@ copy_debug_stmt (gimple stmt, copy_body_data *id)
gcc_assert (TREE_CODE (*n) == VAR_DECL);
t = *n;
}
+ else if (TREE_CODE (t) == VAR_DECL
+ && !TREE_STATIC (t)
+ && gimple_in_ssa_p (cfun)
+ && !pointer_map_contains (id->decl_map, t)
+ && !var_ann (t))
+ /* T is a non-localized variable. */;
else
walk_tree (&t, remap_gimple_op_r, &wi, NULL);
diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h
index 40cfb0f6891..383a164004c 100644
--- a/gcc/tree-pass.h
+++ b/gcc/tree-pass.h
@@ -226,6 +226,7 @@ struct dump_file_info
#define PROP_rtl (1 << 7)
#define PROP_gimple_lomp (1 << 8) /* lowered OpenMP directives */
#define PROP_cfglayout (1 << 9) /* cfglayout mode on RTL */
+#define PROP_gimple_lcx (1 << 10) /* lowered complex */
#define PROP_trees \
(PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh | PROP_gimple_lomp)
diff --git a/gcc/tree-scalar-evolution.c b/gcc/tree-scalar-evolution.c
index 3ebc54e8556..4d8f85e5047 100644
--- a/gcc/tree-scalar-evolution.c
+++ b/gcc/tree-scalar-evolution.c
@@ -3033,7 +3033,20 @@ scev_initialize (void)
}
}
-/* Cleans up the information cached by the scalar evolutions analysis. */
+/* Cleans up the information cached by the scalar evolutions analysis
+ in the hash table. */
+
+void
+scev_reset_htab (void)
+{
+ if (!scalar_evolution_info)
+ return;
+
+ htab_empty (scalar_evolution_info);
+}
+
+/* Cleans up the information cached by the scalar evolutions analysis
+ in the hash table and in the loop->nb_iterations. */
void
scev_reset (void)
@@ -3041,10 +3054,11 @@ scev_reset (void)
loop_iterator li;
struct loop *loop;
- if (!scalar_evolution_info || !current_loops)
+ scev_reset_htab ();
+
+ if (!current_loops)
return;
- htab_empty (scalar_evolution_info);
FOR_EACH_LOOP (li, loop, 0)
{
loop->nb_iterations = NULL_TREE;
diff --git a/gcc/tree-scalar-evolution.h b/gcc/tree-scalar-evolution.h
index 5caadc57031..e09e19ae5f5 100644
--- a/gcc/tree-scalar-evolution.h
+++ b/gcc/tree-scalar-evolution.h
@@ -27,6 +27,7 @@ extern gimple get_loop_exit_condition (const struct loop *);
extern void scev_initialize (void);
extern void scev_reset (void);
+extern void scev_reset_htab (void);
extern void scev_finalize (void);
extern tree analyze_scalar_evolution (struct loop *, tree);
extern tree instantiate_scev (basic_block, struct loop *, tree);
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index ebb40c4aa1a..dd62cc53798 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -258,6 +258,13 @@ static int func_param_count;
__builtin_apply_args. */
static bool encountered_apply_args;
+/* Set by scan_function when it finds a recursive call. */
+static bool encountered_recursive_call;
+
+/* Set by scan_function when it finds a recursive call with less actual
+ arguments than formal parameters.. */
+static bool encountered_unchangable_recursive_call;
+
/* This is a table in which for each basic block and parameter there is a
distance (offset + size) in that parameter which is dereferenced and
accessed in that BB. */
@@ -545,6 +552,8 @@ sra_initialize (void)
base_access_vec = pointer_map_create ();
memset (&sra_stats, 0, sizeof (sra_stats));
encountered_apply_args = false;
+ encountered_recursive_call = false;
+ encountered_unchangable_recursive_call = false;
}
/* Hook fed to pointer_map_traverse, deallocate stored vectors. */
@@ -944,6 +953,14 @@ asm_visit_addr (gimple stmt ATTRIBUTE_UNUSED, tree op,
return false;
}
+/* Return true iff callsite CALL has at least as many actual arguments as there
+ are formal parameters of the function currently processed by IPA-SRA. */
+
+static inline bool
+callsite_has_enough_arguments_p (gimple call)
+{
+ return gimple_call_num_args (call) >= (unsigned) func_param_count;
+}
/* Scan function and look for interesting statements. Return true if any has
been found or processed, as indicated by callbacks. SCAN_EXPR is a callback
@@ -1014,15 +1031,24 @@ scan_function (bool (*scan_expr) (tree *, gimple_stmt_iterator *, bool, void *),
any |= scan_expr (argp, &gsi, false, data);
}
- if (analysis_stage)
+ if (analysis_stage && sra_mode == SRA_MODE_EARLY_IPA)
{
tree dest = gimple_call_fndecl (stmt);
int flags = gimple_call_flags (stmt);
- if (dest
- && DECL_BUILT_IN_CLASS (dest) == BUILT_IN_NORMAL
- && DECL_FUNCTION_CODE (dest) == BUILT_IN_APPLY_ARGS)
- encountered_apply_args = true;
+ if (dest)
+ {
+ if (DECL_BUILT_IN_CLASS (dest) == BUILT_IN_NORMAL
+ && DECL_FUNCTION_CODE (dest) == BUILT_IN_APPLY_ARGS)
+ encountered_apply_args = true;
+ if (cgraph_get_node (dest)
+ == cgraph_get_node (current_function_decl))
+ {
+ encountered_recursive_call = true;
+ if (!callsite_has_enough_arguments_p (stmt))
+ encountered_unchangable_recursive_call = true;
+ }
+ }
if (final_bbs
&& (flags & (ECF_CONST | ECF_PURE)) == 0)
@@ -1659,7 +1685,13 @@ analyze_access_subtree (struct access *root, bool allow_replacements,
if (allow_replacements && scalar && !root->first_child
&& (root->grp_hint
- || (direct_read && root->grp_write)))
+ || (direct_read && root->grp_write))
+ /* We must not ICE later on when trying to build an access to the
+ original data within the aggregate even when it is impossible to do in
+ a defined way like in the PR 42703 testcase. Therefore we check
+ pre-emptively here that we will be able to do that. */
+ && build_ref_for_offset (NULL, TREE_TYPE (root->base), root->offset,
+ root->type, false))
{
if (dump_file && (dump_flags & TDF_DETAILS))
{
@@ -2527,7 +2559,9 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi,
{
if (access_has_children_p (racc))
{
- if (!racc->grp_unscalarized_data)
+ if (!racc->grp_unscalarized_data
+ /* Do not remove SSA name definitions (PR 42704). */
+ && TREE_CODE (lhs) != SSA_NAME)
{
generate_subtree_copies (racc->first_child, lhs,
racc->offset, 0, 0, gsi,
@@ -3704,8 +3738,20 @@ sra_ipa_modify_assign (gimple *stmt_ptr, gimple_stmt_iterator *gsi, void *data)
tree new_rhs = NULL_TREE;
if (!useless_type_conversion_p (TREE_TYPE (*lhs_p), TREE_TYPE (*rhs_p)))
- new_rhs = fold_build1_loc (gimple_location (stmt), VIEW_CONVERT_EXPR,
- TREE_TYPE (*lhs_p), *rhs_p);
+ {
+ if (TREE_CODE (*rhs_p) == CONSTRUCTOR)
+ {
+ /* V_C_Es of constructors can cause trouble (PR 42714). */
+ if (is_gimple_reg_type (TREE_TYPE (*lhs_p)))
+ *rhs_p = fold_convert (TREE_TYPE (*lhs_p), integer_zero_node);
+ else
+ *rhs_p = build_constructor (TREE_TYPE (*lhs_p), 0);
+ }
+ else
+ new_rhs = fold_build1_loc (gimple_location (stmt),
+ VIEW_CONVERT_EXPR, TREE_TYPE (*lhs_p),
+ *rhs_p);
+ }
else if (REFERENCE_CLASS_P (*rhs_p)
&& is_gimple_reg_type (TREE_TYPE (*lhs_p))
&& !is_gimple_reg (*lhs_p))
@@ -3760,6 +3806,21 @@ sra_ipa_reset_debug_stmts (ipa_parm_adjustment_vec adjustments)
}
}
+/* Return true iff all callers have at least as many actual arguments as there
+ are formal parameters in the current function. */
+
+static bool
+all_callers_have_enough_arguments_p (struct cgraph_node *node)
+{
+ struct cgraph_edge *cs;
+ for (cs = node->callers; cs; cs = cs->next_caller)
+ if (!callsite_has_enough_arguments_p (cs->call_stmt))
+ return false;
+
+ return true;
+}
+
+
/* Convert all callers of NODE to pass parameters as given in ADJUSTMENTS. */
static void
@@ -3795,6 +3856,10 @@ convert_callers (struct cgraph_node *node, ipa_parm_adjustment_vec adjustments)
BITMAP_FREE (recomputed_callers);
current_function_decl = old_cur_fndecl;
+
+ if (!encountered_recursive_call)
+ return;
+
FOR_EACH_BB (this_block)
{
gimple_stmt_iterator gsi;
@@ -3907,6 +3972,14 @@ ipa_early_sra (void)
goto simple_out;
}
+ if (!all_callers_have_enough_arguments_p (node))
+ {
+ if (dump_file)
+ fprintf (dump_file, "There are callers with insufficient number of "
+ "arguments.\n");
+ goto simple_out;
+ }
+
bb_dereferences = XCNEWVEC (HOST_WIDE_INT,
func_param_count
* last_basic_block_for_function (cfun));
@@ -3921,6 +3994,14 @@ ipa_early_sra (void)
goto out;
}
+ if (encountered_unchangable_recursive_call)
+ {
+ if (dump_file)
+ fprintf (dump_file, "Function calls itself with insufficient "
+ "number of arguments.\n");
+ goto out;
+ }
+
adjustments = analyze_all_param_acesses ();
if (!adjustments)
goto out;
diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c
index f3f113c902f..b40dba36d08 100644
--- a/gcc/tree-ssa-ccp.c
+++ b/gcc/tree-ssa-ccp.c
@@ -2120,6 +2120,10 @@ maybe_fold_stmt_indirect (tree expr, tree base, tree offset)
&& is_gimple_min_invariant (DECL_INITIAL (base)))
return DECL_INITIAL (base);
+ /* If there is no offset involved simply return the folded base. */
+ if (integer_zerop (offset))
+ return base;
+
/* Try folding *(&B+O) to B.X. */
t = maybe_fold_offset_to_reference (loc, base_addr, offset,
TREE_TYPE (expr));
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
index 1cc56595a9d..528db650570 100644
--- a/gcc/tree-ssa-loop-im.c
+++ b/gcc/tree-ssa-loop-im.c
@@ -1776,8 +1776,8 @@ gen_lsm_tmp_name (tree ref)
name = get_name (TREE_OPERAND (ref, 1));
if (!name)
name = "F";
- lsm_tmp_name_add ("_");
lsm_tmp_name_add (name);
+ break;
case ARRAY_REF:
gen_lsm_tmp_name (TREE_OPERAND (ref, 0));
diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c
index f428008a18e..5f7c6b721d8 100644
--- a/gcc/tree-ssa-reassoc.c
+++ b/gcc/tree-ssa-reassoc.c
@@ -845,7 +845,7 @@ build_and_add_sum (tree tmpvar, tree op1, tree op2, enum tree_code opcode)
if ((!op1def || gimple_nop_p (op1def))
&& (!op2def || gimple_nop_p (op2def)))
{
- gsi = gsi_start_bb (single_succ (ENTRY_BLOCK_PTR));
+ gsi = gsi_after_labels (single_succ (ENTRY_BLOCK_PTR));
gsi_insert_before (&gsi, sum, GSI_NEW_STMT);
}
else if ((!op1def || gimple_nop_p (op1def))
@@ -854,7 +854,7 @@ build_and_add_sum (tree tmpvar, tree op1, tree op2, enum tree_code opcode)
{
if (gimple_code (op2def) == GIMPLE_PHI)
{
- gsi = gsi_start_bb (gimple_bb (op2def));
+ gsi = gsi_after_labels (gimple_bb (op2def));
gsi_insert_before (&gsi, sum, GSI_NEW_STMT);
}
else
@@ -879,7 +879,7 @@ build_and_add_sum (tree tmpvar, tree op1, tree op2, enum tree_code opcode)
{
if (gimple_code (op1def) == GIMPLE_PHI)
{
- gsi = gsi_start_bb (gimple_bb (op1def));
+ gsi = gsi_after_labels (gimple_bb (op1def));
gsi_insert_before (&gsi, sum, GSI_NEW_STMT);
}
else
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index a3be6786d94..bbf2bd31820 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -1421,7 +1421,6 @@ vect_get_constant_vectors (slp_tree slp_node, VEC(tree,heap) **vec_oprnds,
VEC (gimple, heap) *stmts = SLP_TREE_SCALAR_STMTS (slp_node);
gimple stmt = VEC_index (gimple, stmts, 0);
stmt_vec_info stmt_vinfo = vinfo_for_stmt (stmt);
- tree vectype = STMT_VINFO_VECTYPE (stmt_vinfo);
int nunits;
tree vec_cst;
tree t = NULL_TREE;
@@ -1446,16 +1445,12 @@ vect_get_constant_vectors (slp_tree slp_node, VEC(tree,heap) **vec_oprnds,
}
if (CONSTANT_CLASS_P (op))
- {
- vector_type = vectype;
- constant_p = true;
- }
+ constant_p = true;
else
- {
- vector_type = get_vectype_for_scalar_type (TREE_TYPE (op));
- gcc_assert (vector_type);
- constant_p = false;
- }
+ constant_p = false;
+
+ vector_type = get_vectype_for_scalar_type (TREE_TYPE (op));
+ gcc_assert (vector_type);
nunits = TYPE_VECTOR_SUBPARTS (vector_type);
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
index db7778b8e74..e5f95d97fcf 100644
--- a/gcc/var-tracking.c
+++ b/gcc/var-tracking.c
@@ -1,5 +1,5 @@
/* Variable tracking routines for the GNU compiler.
- Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009
+ Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
This file is part of GCC.
@@ -1401,14 +1401,15 @@ var_reg_delete_and_set (dataflow_set *set, rtx loc, bool modify,
var_reg_set (set, loc, initialized, set_src);
}
-/* Delete current content of register LOC in dataflow set SET. If
- CLOBBER is true, also delete any other live copies of the same
- variable part. */
+/* Delete the association of register LOC in dataflow set SET with any
+ variables that aren't onepart. If CLOBBER is true, also delete any
+ other live copies of the same variable part, and delete the
+ association with onepart dvs too. */
static void
var_reg_delete (dataflow_set *set, rtx loc, bool clobber)
{
- attrs *reg = &set->regs[REGNO (loc)];
+ attrs *nextp = &set->regs[REGNO (loc)];
attrs node, next;
if (clobber)
@@ -1421,13 +1422,18 @@ var_reg_delete (dataflow_set *set, rtx loc, bool clobber)
clobber_variable_part (set, NULL, dv_from_decl (decl), offset, NULL);
}
- for (node = *reg; node; node = next)
+ for (node = *nextp; node; node = next)
{
next = node->next;
- delete_variable_part (set, node->loc, node->dv, node->offset);
- pool_free (attrs_pool, node);
+ if (clobber || !dv_onepart_p (node->dv))
+ {
+ delete_variable_part (set, node->loc, node->dv, node->offset);
+ pool_free (attrs_pool, node);
+ *nextp = next;
+ }
+ else
+ nextp = &node->next;
}
- *reg = NULL;
}
/* Delete content of register with number REGNO in dataflow set SET. */
@@ -2252,12 +2258,18 @@ dv_changed_p (decl_or_value dv)
: DECL_CHANGED (dv_as_decl (dv)));
}
-/* Return a location list node whose loc is rtx_equal to LOC, in the
+/* Vector of VALUEs that should have VALUE_RECURSED_INTO bit cleared
+ at the end of find_loc_in_1pdv. Not a static variable in find_loc_in_1pdv
+ to avoid constant allocation/freeing of it. */
+static VEC(rtx, heap) *values_to_unmark;
+
+/* Helper function for find_loc_in_1pdv.
+ Return a location list node whose loc is rtx_equal to LOC, in the
location list of a one-part variable or value VAR, or in that of
any values recursively mentioned in the location lists. */
static location_chain
-find_loc_in_1pdv (rtx loc, variable var, htab_t vars)
+find_loc_in_1pdv_1 (rtx loc, variable var, htab_t vars)
{
location_chain node;
@@ -2285,18 +2297,33 @@ find_loc_in_1pdv (rtx loc, variable var, htab_t vars)
{
location_chain where;
VALUE_RECURSED_INTO (node->loc) = true;
- if ((where = find_loc_in_1pdv (loc, var, vars)))
- {
- VALUE_RECURSED_INTO (node->loc) = false;
- return where;
- }
- VALUE_RECURSED_INTO (node->loc) = false;
+ VEC_safe_push (rtx, heap, values_to_unmark, node->loc);
+ if ((where = find_loc_in_1pdv_1 (loc, var, vars)))
+ return where;
}
}
return NULL;
}
+/* Return a location list node whose loc is rtx_equal to LOC, in the
+ location list of a one-part variable or value VAR, or in that of
+ any values recursively mentioned in the location lists. */
+
+static location_chain
+find_loc_in_1pdv (rtx loc, variable var, htab_t vars)
+{
+ location_chain ret;
+ unsigned int i;
+ rtx value;
+
+ ret = find_loc_in_1pdv_1 (loc, var, vars);
+ for (i = 0; VEC_iterate (rtx, values_to_unmark, i, value); i++)
+ VALUE_RECURSED_INTO (value) = false;
+ VEC_truncate (rtx, values_to_unmark, 0);
+ return ret;
+}
+
/* Hash table iteration argument passed to variable_merge. */
struct dfset_merge
{
@@ -5648,6 +5675,7 @@ vt_find_locations (void)
FOR_EACH_BB (bb)
gcc_assert (VTI (bb)->flooded);
+ VEC_free (rtx, heap, values_to_unmark);
free (bb_order);
fibheap_delete (worklist);
fibheap_delete (pending);
diff --git a/gcc/varasm.c b/gcc/varasm.c
index fab62198053..7ed59055745 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -2337,13 +2337,15 @@ assemble_external (tree decl ATTRIBUTE_UNUSED)
/* We want to output annotation for weak and external symbols at
very last to check if they are references or not. */
- if (SUPPORTS_WEAK && DECL_WEAK (decl)
+ if (SUPPORTS_WEAK
+ && DECL_WEAK (decl)
/* TREE_STATIC is a weird and abused creature which is not
generally the right test for whether an entity has been
locally emitted, inlined or otherwise not-really-extern, but
for declarations that can be weak, it happens to be
match. */
&& !TREE_STATIC (decl)
+ && lookup_attribute ("weak", DECL_ATTRIBUTES (decl))
&& value_member (decl, weak_decls) == NULL_TREE)
weak_decls = tree_cons (NULL, decl, weak_decls);
@@ -5227,6 +5229,9 @@ declare_weak (tree decl)
warning (0, "weak declaration of %q+D not supported", decl);
mark_weak (decl);
+ if (!lookup_attribute ("weak", DECL_ATTRIBUTES (decl)))
+ DECL_ATTRIBUTES (decl)
+ = tree_cons (get_identifier ("weak"), NULL, DECL_ATTRIBUTES (decl));
}
static void
diff --git a/include/ChangeLog b/include/ChangeLog
index 106d8b959c3..5aeaf305f90 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,8 @@
+2010-01-13 Joel Brobecker <brobecker@adacore.com>
+
+ Add new DW_AT_use_GNAT_descriptive_type CU attribute.
+ * dwarf2.h (dwarf_attribute): Add DW_AT_use_GNAT_descriptive_type.
+
2010-01-11 Tristan Gingold <gingold@adacore.com>
* demangle.h (ada_demangle): Add prototype.
diff --git a/include/dwarf2.h b/include/dwarf2.h
index a001ef32541..303af70be1c 100644
--- a/include/dwarf2.h
+++ b/include/dwarf2.h
@@ -428,6 +428,7 @@ enum dwarf_attribute
/* GNAT extensions. */
/* GNAT descriptive type.
See http://gcc.gnu.org/wiki/DW_AT_GNAT_descriptive_type . */
+ DW_AT_use_GNAT_descriptive_type = 0x2301,
DW_AT_GNAT_descriptive_type = 0x2302,
/* UPC extension. */
DW_AT_upc_threads_scaled = 0x3210,
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index fbd9dd43309..2c9a8a83d97 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,9 @@
+2010-01-15 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ PR libfortran/42742
+ * io/format.c (parse_format): Set limit on size of format strings that
+ will be cached.
+
2010-01-05 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* configure: Regenerate.
diff --git a/libgfortran/io/format.c b/libgfortran/io/format.c
index cafea8732e4..13516d2f8a6 100644
--- a/libgfortran/io/format.c
+++ b/libgfortran/io/format.c
@@ -1212,13 +1212,18 @@ revert (st_parameter_dt *dtp)
/* parse_format()-- Parse a format string. */
+#define FORMAT_CACHE_STRING_LIMIT 256
+
void
parse_format (st_parameter_dt *dtp)
{
format_data *fmt;
bool format_cache_ok;
- format_cache_ok = !is_internal_unit (dtp);
+ /* Don't cache for internal units and set an arbitrary limit on the size of
+ format strings we will cache. (Avoids memory issues.) */
+ format_cache_ok = !is_internal_unit (dtp)
+ && (dtp->format_len < FORMAT_CACHE_STRING_LIMIT );
/* Lookup format string to see if it has already been parsed. */
if (format_cache_ok)
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 3f7d3095801..ddd9acd3762 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,27 @@
+2010-01-15 Phil Muldoon <pmuldoon@redhat.com>
+
+ * python/libstdcxx/v6/printers.py (StdStringPrinter.__init__):
+ Remove encoding argument.
+ (StdStringPrinter.to_string): Do not compute or pass encoding.
+ Use lazy_string over string function.
+
+2010-01-14 Paolo Carlini <paolo.carlini@oracle.com>
+
+ * include/c_std/cstring (memchr): Forward to the builtin.
+ * include/c_std/cstring: Remove redundant casts; use names consistent
+ with the letter of the Standard.
+ * include/c_global/cstring: Likewise.
+
+2010-01-13 Benjamin Kosnik <bkoz@redhat.com>
+
+ * include/profile/iterator_tracker.h: Add copyright.
+
+2010-01-13 Paolo Carlini <paolo.carlini@oracle.com>
+
+ * testsuite/Makefile.am (check-debug): Add.
+ * testsuite/Makefile.in: Regenerate.
+ * config.h.in: Likewise.
+
2010-01-12 Paolo Carlini <paolo.carlini@oracle.com>
* testsuite/17_intro/using_namespace_std_tr1_neg.cc: Do not run
diff --git a/libstdc++-v3/config.h.in b/libstdc++-v3/config.h.in
index c39f423771e..55fa49e29d7 100644
--- a/libstdc++-v3/config.h.in
+++ b/libstdc++-v3/config.h.in
@@ -66,9 +66,6 @@
/* Define to 1 if you have the <endian.h> header file. */
#undef HAVE_ENDIAN_H
-/* Define to 1 if you have the <execinfo.h> header file. */
-#undef HAVE_EXECINFO_H
-
/* Define if ENODATA exists. */
#undef HAVE_ENODATA
@@ -102,6 +99,9 @@
/* Define if ETXTBSY exists. */
#undef HAVE_ETXTBSY
+/* Define to 1 if you have the <execinfo.h> header file. */
+#undef HAVE_EXECINFO_H
+
/* Define to 1 if you have the `expf' function. */
#undef HAVE_EXPF
diff --git a/libstdc++-v3/include/c_global/cstring b/libstdc++-v3/include/c_global/cstring
index acd6166b15f..dba96c98127 100644
--- a/libstdc++-v3/include/c_global/cstring
+++ b/libstdc++-v3/include/c_global/cstring
@@ -1,7 +1,7 @@
// -*- C++ -*- forwarding header.
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
-// 2006, 2007, 2008, 2009
+// 2006, 2007, 2008, 2009, 2010
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -98,24 +98,24 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
#ifndef __CORRECT_ISO_CPP_STRING_H_PROTO
inline void*
- memchr(void* __p, int __c, size_t __n)
- { return memchr(const_cast<const void*>(__p), __c, __n); }
+ memchr(void* __s, int __c, size_t __n)
+ { return __builtin_memchr(__s, __c, __n); }
inline char*
- strchr(char* __s1, int __n)
- { return __builtin_strchr(const_cast<const char*>(__s1), __n); }
+ strchr(char* __s, int __n)
+ { return __builtin_strchr(__s, __n); }
inline char*
strpbrk(char* __s1, const char* __s2)
- { return __builtin_strpbrk(const_cast<const char*>(__s1), __s2); }
+ { return __builtin_strpbrk(__s1, __s2); }
inline char*
- strrchr(char* __s1, int __n)
- { return __builtin_strrchr(const_cast<const char*>(__s1), __n); }
+ strrchr(char* __s, int __n)
+ { return __builtin_strrchr(__s, __n); }
inline char*
strstr(char* __s1, const char* __s2)
- { return __builtin_strstr(const_cast<const char*>(__s1), __s2); }
+ { return __builtin_strstr(__s1, __s2); }
#endif
_GLIBCXX_END_NAMESPACE
diff --git a/libstdc++-v3/include/c_std/cstring b/libstdc++-v3/include/c_std/cstring
index 63afe8c6a08..3535a249b3b 100644
--- a/libstdc++-v3/include/c_std/cstring
+++ b/libstdc++-v3/include/c_std/cstring
@@ -1,6 +1,7 @@
// -*- C++ -*- forwarding header.
-// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2009
+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+// 2006, 2007, 2008, 2009, 2010
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -97,24 +98,24 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
#ifndef __CORRECT_ISO_CPP_STRING_H_PROTO
inline void*
- memchr(void* __p, int __c, size_t __n)
- { return memchr(const_cast<const void*>(__p), __c, __n); }
+ memchr(void* __s, int __c, size_t __n)
+ { return __builtin_memchr(__s, __c, __n); }
inline char*
- strchr(char* __s1, int __n)
- { return __builtin_strchr(const_cast<const char*>(__s1), __n); }
+ strchr(char* __s, int __n)
+ { return __builtin_strchr(__s, __n); }
inline char*
strpbrk(char* __s1, const char* __s2)
- { return __builtin_strpbrk(const_cast<const char*>(__s1), __s2); }
+ { return __builtin_strpbrk(__s1, __s2); }
inline char*
- strrchr(char* __s1, int __n)
- { return __builtin_strrchr(const_cast<const char*>(__s1), __n); }
+ strrchr(char* __s, int __n)
+ { return __builtin_strrchr(__s, __n); }
inline char*
strstr(char* __s1, const char* __s2)
- { return __builtin_strstr(const_cast<const char*>(__s1), __s2); }
+ { return __builtin_strstr(__s1, __s2); }
#endif
_GLIBCXX_END_NAMESPACE
diff --git a/libstdc++-v3/include/profile/iterator_tracker.h b/libstdc++-v3/include/profile/iterator_tracker.h
index 8e077481f34..6160d10cd22 100644
--- a/libstdc++-v3/include/profile/iterator_tracker.h
+++ b/libstdc++-v3/include/profile/iterator_tracker.h
@@ -1,3 +1,31 @@
+// Profiling iterator implementation -*- C++ -*-
+
+// Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file profile/literator_tracker.h
+ * This file is a GNU profile extension to the Standard C++ Library.
+ */
+
#ifndef _GLIBCXX_PROFILE_ITERATOR_TRACKER
#define _GLIBCXX_PROFILE_ITERATOR_TRACKER 1
diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py
index 872e2d30a97..baa0824856b 100644
--- a/libstdc++-v3/python/libstdcxx/v6/printers.py
+++ b/libstdc++-v3/python/libstdcxx/v6/printers.py
@@ -1,6 +1,6 @@
# Pretty-printers for libstc++.
-# Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+# Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -529,18 +529,10 @@ class StdDequeIteratorPrinter:
class StdStringPrinter:
"Print a std::basic_string of some kind"
- def __init__(self, encoding, val):
- self.encoding = encoding
+ def __init__(self, val):
self.val = val
def to_string(self):
- # Look up the target encoding as late as possible.
- encoding = self.encoding
- if encoding == 0:
- encoding = gdb.parameter('target-charset')
- elif encoding == 1:
- encoding = gdb.parameter('target-wide-charset')
-
# Make sure &string works, too.
type = self.val.type
if type.code == gdb.TYPE_CODE_REF:
@@ -554,7 +546,7 @@ class StdStringPrinter:
reptype = gdb.lookup_type (str (realtype) + '::_Rep').pointer ()
header = ptr.cast(reptype) - 1
len = header.dereference ()['_M_length']
- return self.val['_M_dataplus']['_M_p'].string (encoding, length = len)
+ return self.val['_M_dataplus']['_M_p'].lazy_string (length = len)
def display_hint (self):
return 'string'
@@ -687,10 +679,7 @@ def build_libstdcxx_dictionary ():
# libstdc++ objects requiring pretty-printing.
# In order from:
# http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01847.html
- pretty_printers_dict[re.compile('^std::basic_string<char(,.*)?>$')] = lambda val: StdStringPrinter(0, val)
- pretty_printers_dict[re.compile('^std::basic_string<wchar_t(,.*)?>$')] = lambda val: StdStringPrinter(1, val)
- pretty_printers_dict[re.compile('^std::basic_string<char16_t(,.*)?>$')] = lambda val: StdStringPrinter('UTF-16', val)
- pretty_printers_dict[re.compile('^std::basic_string<char32_t(,.*)?>$')] = lambda val: StdStringPrinter('UTF-32', val)
+ pretty_printers_dict[re.compile('^std::basic_string<.*>$')] = lambda val: StdStringPrinter(val)
pretty_printers_dict[re.compile('^std::bitset<.*>$')] = lambda val: StdBitsetPrinter("std::bitset", val)
pretty_printers_dict[re.compile('^std::deque<.*>$')] = lambda val: StdDequePrinter("std::deque", val)
pretty_printers_dict[re.compile('^std::list<.*>$')] = lambda val: StdListPrinter("std::list", val)
diff --git a/libstdc++-v3/testsuite/Makefile.am b/libstdc++-v3/testsuite/Makefile.am
index a2f4fa42986..d20aba7c41f 100644
--- a/libstdc++-v3/testsuite/Makefile.am
+++ b/libstdc++-v3/testsuite/Makefile.am
@@ -1,6 +1,6 @@
## Makefile for the testsuite subdirectory of the GNU C++ Standard library.
##
-## Copyright (C) 2001, 2002, 2003, 2005, 2007, 2009
+## Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
## Free Software Foundation, Inc.
##
## This file is part of the libstdc++ version 3 distribution.
@@ -186,6 +186,8 @@ check-performance: testsuite_files_performance ${performance_script}
-@(chmod + ${check_performance_script}; \
${check_performance_script} ${glibcxx_srcdir} ${glibcxx_builddir})
+# Runs the testsuite in debug mode.
+debug_flags = "unix/-D_GLIBCXX_DEBUG"
# Runs the testsuite in parallel mode.
libgomp_dir=${glibcxx_builddir}/../libgomp
@@ -199,6 +201,15 @@ parallel_flags="unix/-D_GLIBCXX_PARALLEL/-fopenmp"
# Runs the testsuite in profile mode.
profile_flags = "unix/-D_GLIBCXX_PROFILE"
+check-debug: site.exp
+ outputdir=debug; export outputdir; \
+ if test ! -d $${outputdir}; then \
+ mkdir $${outputdir}; \
+ fi; \
+ srcdir=`$(am__cd) $(srcdir) && pwd`; export srcdir; \
+ EXPECT=$(EXPECT); export EXPECT; \
+ $(MAKE) RUNTESTFLAGS="$(RUNTESTFLAGS) conformance.exp --outdir $${outputdir} --objdir $${outputdir} --target_board=$(debug_flags)" check-DEJAGNU;
+
check-parallel: site.exp
-@(if test ! -d $${libgomp_dir}; then \
echo "Testing parallel mode failed as libgomp not present."; \
@@ -236,4 +247,4 @@ CLEANFILES = *.txt *.tst *.exe core* filebuf_* tmp* ostream_* *.log *.sum \
# To remove directories.
clean-local:
- rm -rf parallel profile
+ rm -rf debug parallel profile
diff --git a/libstdc++-v3/testsuite/Makefile.in b/libstdc++-v3/testsuite/Makefile.in
index b66c27ba462..e6f437e8566 100644
--- a/libstdc++-v3/testsuite/Makefile.in
+++ b/libstdc++-v3/testsuite/Makefile.in
@@ -289,6 +289,9 @@ compile_script = ${glibcxx_srcdir}/scripts/check_compile
# XXX Need to add dependency on libtestc++.a
check_performance_script = ${glibcxx_srcdir}/scripts/check_performance
+# Runs the testsuite in debug mode.
+debug_flags = "unix/-D_GLIBCXX_DEBUG"
+
# Runs the testsuite in parallel mode.
libgomp_dir = ${glibcxx_builddir}/../libgomp
libgomp_flags = -B${glibcxx_builddir}/../libgomp \
@@ -626,6 +629,15 @@ check-performance: testsuite_files_performance ${performance_script}
-@(chmod + ${check_performance_script}; \
${check_performance_script} ${glibcxx_srcdir} ${glibcxx_builddir})
+check-debug: site.exp
+ outputdir=debug; export outputdir; \
+ if test ! -d $${outputdir}; then \
+ mkdir $${outputdir}; \
+ fi; \
+ srcdir=`$(am__cd) $(srcdir) && pwd`; export srcdir; \
+ EXPECT=$(EXPECT); export EXPECT; \
+ $(MAKE) RUNTESTFLAGS="$(RUNTESTFLAGS) conformance.exp --outdir $${outputdir} --objdir $${outputdir} --target_board=$(debug_flags)" check-DEJAGNU;
+
check-parallel: site.exp
-@(if test ! -d $${libgomp_dir}; then \
echo "Testing parallel mode failed as libgomp not present."; \
@@ -658,7 +670,7 @@ check-profile: site.exp
# To remove directories.
clean-local:
- rm -rf parallel profile
+ rm -rf debug parallel profile
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.