François Dumont [Sun, 6 Oct 2019 15:10:40 +0000 (15:10 +0000)]
Add C++11 __iterator_category_t template alias.
* include/bits/stl_iterator_base_types.h (__iterator_category_t): Define
for C++11.
(_RequireInputIte): Likewise and use __enable_if_t.
* include/std/numeric
(__is_random_access_iter): Use __iterator_category_t.
Paul Thomas [Sat, 5 Oct 2019 08:17:55 +0000 (08:17 +0000)]
re PR fortran/91926 (assumed rank optional)
2019-10-05 Paul Thomas <pault@gcc.gnu.org>
PR fortran/91926
* trans-expr.c (gfc_conv_gfc_desc_to_cfi_desc): Correct the
assignment of the attribute field to account correctly for an
assumed shape dummy. Assign separately to the gfc and cfi
descriptors since the atribute can be different. Add btanch to
correctly handle missing optional dummies.
2019-10-05 Paul Thomas <pault@gcc.gnu.org>
PR fortran/91926
* gfortran.dg/ISO_Fortran_binding_13.f90 : New test.
* gfortran.dg/ISO_Fortran_binding_13.c : Additional source.
* gfortran.dg/ISO_Fortran_binding_14.f90 : New test.
2019-10-05 Paul Thomas <pault@gcc.gnu.org>
PR fortran/91926
* runtime/ISO_Fortran_binding.c (cfi_desc_to_gfc_desc): Do not
modify the bounds and offset for CFI_other.
Iain Sandoe [Sat, 5 Oct 2019 08:05:44 +0000 (08:05 +0000)]
[Darwin] Amend section for constants with reloactions.
Darwin's linker doesn't like text section relocations (they require special
enabling). At least, the Fortran FE seems to generate cases where the
initialiser for a pointer constant can need a relocation. We can handle
this by special-casing SECCAT_RODATA when the relocation is present by
placing the constant in the .const_data section.
gcc/ChangeLog:
2019-10-05 Iain Sandoe <iain@sandoe.co.uk>
PR target/59888
* config/darwin.c (darwin_rodata_section): Add relocation flag,
choose const_data section for constants with relocations.
(machopic_select_section): Pass relocation flag to
darwin_rodata_section ().
Jakub Jelinek [Sat, 5 Oct 2019 07:38:21 +0000 (09:38 +0200)]
PR c++/91369 - Implement P0784R7: constexpr new
PR c++/91369 - Implement P0784R7: constexpr new
c-family/
* c-cppbuiltin.c (c_cpp_builtins): Predefine
__cpp_constexpr_dynamic_alloc=201907 for -std=c++2a.
cp/
* cp-tree.h (enum cp_tree_index): Add CPTI_HEAP_UNINIT_IDENTIFIER,
CPTI_HEAP_IDENTIFIER and CPTI_HEAP_DELETED_IDENTIFIER.
(heap_uninit_identifier, heap_identifier, heap_deleted_identifier):
Define.
(type_has_constexpr_destructor, build_new_constexpr_heap_type,
cxx_constant_dtor): Declare.
* class.c (type_maybe_constexpr_default_constructor): Make static.
(type_maybe_constexpr_destructor, type_has_constexpr_destructor): New
functions.
(finalize_literal_type_property): For c++2a, don't clear
CLASSTYPE_LITERAL_P for types without trivial destructors unless they
have non-constexpr destructors.
(explain_non_literal_class): For c++2a, complain about non-constexpr
destructors rather than about non-trivial destructors.
* constexpr.c: Include stor-layout.h.
(struct constexpr_global_ctx): New type.
(struct constexpr_ctx): Add global field, remove values and
constexpr_ops_count.
(cxx_replaceable_global_alloc_fn): New inline function.
(cxx_eval_call_expression): For c++2a allow calls to replaceable
global allocation functions, for new return address of a heap uninit
var, for delete record its deletion. Change ctx->values->{get,put} to
ctx->global->values.{get,put}.
(non_const_var_error): Add auto_diagnostic_group sentinel. Emit
special diagnostics for heap variables.
(cxx_eval_store_expression): Change ctx->values->{get,put} to
ctx->global->values.{get,put}.
(cxx_eval_loop_expr): Initialize jump_target if NULL. Change
new_ctx.values->remove to ctx->global->values.remove.
(cxx_eval_constant_expression): Change *ctx->constexpr_ops_count
to ctx->global->constexpr_ops_count. Change ctx->values->{get,put} to
ctx->global->values.{get,put}.
<case NOP_EXPR>: Formatting fix. On cast of replaceable global
allocation function to some pointer type, adjust the type of
the heap variable and change name from heap_uninit_identifier
to heap_identifier.
(find_heap_var_refs): New function.
(cxx_eval_outermost_constant_expr): Add constexpr_dtor argument,
handle evaluation of constexpr dtors and add tracking of heap
variables. Use tf_no_cleanup for get_target_expr_with_sfinae.
(cxx_constant_value): Adjust cxx_eval_outermost_constant_expr caller.
(cxx_constant_dtor): New function.
(maybe_constant_value, fold_non_dependent_expr_template,
maybe_constant_init_1): Adjust cxx_eval_outermost_constant_expr
callers.
(potential_constant_expression_1): Ignore clobbers. Allow
COND_EXPR_IS_VEC_DELETE for c++2a.
* decl.c (initialize_predefined_identifiers): Add heap identifiers.
(decl_maybe_constant_destruction): New function.
(cp_finish_decl): Don't clear TREE_READONLY for constexpr variables
with non-trivial, but constexpr destructors.
(register_dtor_fn): For constexpr variables with constexpr non-trivial
destructors call cxx_maybe_build_cleanup instead of adding destructor
calls at runtime.
(expand_static_init): For constexpr variables with constexpr
non-trivial destructors call cxx_maybe_build_cleanup.
(grokdeclarator): Allow constexpr destructors for c++2a. Formatting
fix.
(cxx_maybe_build_cleanup): For constexpr variables with constexpr
non-trivial destructors call cxx_constant_dtor instead of adding
destructor calls at runtime.
* init.c: Include stor-layout.h.
(build_new_constexpr_heap_type, maybe_wrap_new_for_constexpr): New
functions.
(build_new_1): For c++2a and new[], add cast around the alloc call
to help constexpr evaluation figure out the type of the heap storage.
(build_vec_delete_1): Set DECL_INITIAL of tbase and emit a DECL_EXPR
for it instead of initializing an uninitialized variable.
* method.c: Include intl.h.
(SFK_CTOR_P, SFK_DTOR_P, SFK_ASSIGN_P, SFK_COPY_P, SFK_MOVE_P): Move
definitions earlier.
(process_subob_fn): Add sfk argument, adjust non-constexpr call
diagnostics based on it.
(walk_field_subobs): Formatting fixes. Adjust process_subob_fn caller.
(synthesized_method_base_walk): Likewise.
(synthesized_method_walk): Set *constexpr_p to true for dtors in c++2a.
Fix up DR number in comment.
(implicitly_declare_fn): Formatting fix.
* typeck2.c (store_init_value): Don't call cp_fully_fold_init on
initializers of automatic non-constexpr variables in constexpr
functions.
testsuite/
* g++.dg/cpp0x/constexpr-delete2.C: Adjust expected diagnostics for
c++2a.
* g++.dg/cpp0x/locations1.C: Only expect constexpr ~S() diagnostics
in c++17_down, adjust expected wording.
* g++.dg/cpp1y/constexpr-new.C: Only expect diagnostics in c++17_down.
* g++.dg/cpp2a/constexpr-dtor1.C: New test.
* g++.dg/cpp2a/constexpr-dtor2.C: New test.
* g++.dg/cpp2a/constexpr-dtor3.C: New test.
* g++.dg/cpp2a/constexpr-new1.C: New test.
* g++.dg/cpp2a/constexpr-new2.C: New test.
* g++.dg/cpp2a/constexpr-new3.C: New test.
* g++.dg/cpp2a/constexpr-new4.C: New test.
* g++.dg/cpp2a/feat-cxx2a.C: Add __cpp_constinit and
__cpp_constexpr_dynamic_alloc tests. Tweak __cpp_* tests for c++2a
features to use style like older features, including #ifdef test.
* g++.dg/ext/is_literal_type3.C: New test.
Jakub Jelinek [Sat, 5 Oct 2019 07:36:09 +0000 (09:36 +0200)]
re PR tree-optimization/91734 (gcc skip an if statement with "-O1 -ffast-math")
PR tree-optimization/91734
* generic-match-head.c: Include fold-const-call.h.
* match.pd (sqrt(x) cmp c): Check the boundary value and
in case inexact computation of c*c affects comparison of the boundary,
turn LT_EXPR into LE_EXPR, GE_EXPR into GT_EXPR, LE_EXPR into LT_EXPR
or GT_EXPR into GE_EXPR. Punt for sqrt comparisons against NaN and
for -frounding-math. For c2, try the next smaller or larger floating
point constant depending on comparison code and if it has the same
sqrt as c2, use it instead of c2.
Joseph Myers [Fri, 4 Oct 2019 21:56:14 +0000 (22:56 +0100)]
Add strftime format checking support for C2x %OB and %Ob (bug 82752).
C2x adds strftime %OB and %Ob formats, for alternative forms of month
names (for mainly Slavic languages where a month name on its own is
declined differently from a month name together with a date within
that month). This patch adds corresponding format checking support.
(glibc support for these formats was added in glibc 2.27.)
Bootstrapped with no regressions on x86_64-pc-linux-gnu.
PR c/82752
gcc/c-family:
* c-format.c (C_STD_VER): Handle C2x.
(C_STD_NAME): Likewise.
(strftime_flag_specs): Add 'O' modifier with 'p' flag.
(time_char_table): Use separate entry for 'B' and 'b', with 'O'
modifier allowed and 'p' flag.
* c-format.h (enum format_std_version): Add STD_C2X.
(struct format_char_info): Mention 'p' in comment on flags2.
gcc/testsuite:
* gcc.dg/format/c2x-strftime-1.c: New test.
Martin Sebor [Fri, 4 Oct 2019 21:29:41 +0000 (21:29 +0000)]
PR middle-end/91977 - missing -Wstringop-overflow on memcpy into a pointer plus offset
gcc/ChangeLog:
PR middle-end/91977
* tree-ssa-strlen.c (count_nonzero_bytes): Handle assignments with
MEM_REF right operand. Avoid failing for MEM_REF assignments from
uninitialized objects.
gcc/testsuite/ChangeLog:
PR middle-end/91977
* gcc.dg/Wstringop-overflow-18.c: New test.
Nathan Sidwell [Fri, 4 Oct 2019 19:08:09 +0000 (19:08 +0000)]
[preprocessor/91991] column location overflow
https://gcc.gnu.org/ml/gcc-patches/2019-10/msg00371.html
PR preprocessor/91991
* line-map.c (linemap_line_start): Clear max_column_hint if we run
out of locations.
compiler: include selected constant types during export processing
The machinery that collects types referenced by expressions that are
part of inlinable function bodies was missing the types of local named
constants in certain cases. This patch updates the
Collect_export_references::expression() hook to look for references to
local named constants and include their types in the exported set.
* expr.c (convert_mode_scalar): Remove shadowing local var.
(emit_block_move): Rename local vars.
(block_move_libcall_safe_for_call_parm): Remove shadowing local var.
(emit_push_insn): Rename local vars.
(expand_assignment): Fix wrong mode in assign_stack_temp. Remove
shadowing local vars.
(store_constructor): Remove shadowing local vars. Rename local var.
(store_field, expand_cond_expr_using_cmove,
expand_expr_real_2): Remove shadowing local vars.
(expand_expr_real_1,
do_store_flag): Remove shadowing local vars. Rename local vars.
Joseph Myers [Fri, 4 Oct 2019 16:08:06 +0000 (17:08 +0100)]
Mark C2x built-in functions as such.
Various built-in functions that GCC has as extensions are now standard
functions in C2x. This patch adds DEF_C2X_BUILTIN and uses it to mark
them as such. Some of the so-marked functions were previously
DEF_EXT_LIB_BUILTIN, while some DFP ones were DEF_GCC_BUILTIN
(i.e. __builtin_* only); both sets become DEF_C2X_BUILTIN. This in
turn requires flag_isoc2x to be defined in various front ends using
builtins.def.
As the semantics of the built-in functions should already be tested,
the tests added only verify that they are declared in C2x mode but not
in C11 mode. The test of DFP built-in functions being declared for
C2x goes in gcc.dg/dfp/, as while such built-in functions currently
don't depend on whether DFP is supported, that looks like a bug to me
(see bug 91985), so it seems best for the tests not to depend on
exactly how that bug might be fixed.
Bootstrapped with no regressions on x86_64-pc-linux-gnu.
Jonathan Wakely [Fri, 4 Oct 2019 15:08:23 +0000 (16:08 +0100)]
Build filesystem library with large file support
Enable AC_SYS_LARGEFILE to set the macros needed for large file APIs to
be used by default. We do not want to define those macros in the
public headers that users include. The values of the macros are copied
to a separate file that is only included by the filesystem sources
during the build, and then the macros in <bits/c++config.h> are renamed
so that they don't have any effect in user code including our headers.
Also use larger type for result of filesystem::file_size to avoid
truncation of large values on 32-bit systems (PR 91947).
PR libstdc++/81091
PR libstdc++/91947
* configure.ac: Use AC_SYS_LARGEFILE to enable 64-bit file APIs.
* config.h.in: Regenerate:
* configure: Regenerate:
* include/Makefile.am (${host_builddir}/largefile-config.h): New
target to generate config header for filesystem library.
(${host_builddir}/c++config.h): Rename macros for large file support.
* include/Makefile.in: Regenerate.
* src/c++17/fs_dir.cc: Include new config header.
* src/c++17/fs_ops.cc: Likewise.
(filesystem::file_size): Use uintmax_t for size.
* src/filesystem/dir.cc: Include new config header.
* src/filesystem/ops.cc: Likewise.
(experimental::filesystem::file_size): Use uintmax_t for size.
Jonathan Wakely [Fri, 4 Oct 2019 12:17:01 +0000 (13:17 +0100)]
Adjust tr1::_Hashtable to work with std::allocator in C++20
In C++20 std::allocator will no longer define construct and destroy
member functions, so using them needs to go via allocator_traits.
* include/tr1/hashtable.h (tr1::_Hashtable::_M_allocate_node): Use
__gnu_cxx::__alloc_traits for allocator construct function.
(tr1::_Hashtable::_M_deallocate_node): Likewise for destroy function.
Jakub Jelinek [Fri, 4 Oct 2019 06:54:05 +0000 (08:54 +0200)]
re PR c++/91974 (function not sequenced before function argument)
PR c++/91974
* cp-gimplify.c (cp_gimplify_expr) <case CALL_EXPR>: For
-fstrong-eval-order ensure CALL_EXPR_FN side-effects are evaluated
before any arguments. Additionally, ensure CALL_EXPR_FN that isn't
invariant nor OBJ_TYPE_REF nor SSA_NAME is forced into a temporary.
* doc/invoke.texi (-Wshadow=global, -Wshadow=local,
-Wshadow=compatible-local): Fix description.
Add an example where -Wshadow=compatible-local does not
warn.
Iain Sandoe [Thu, 3 Oct 2019 20:19:18 +0000 (20:19 +0000)]
[Darwin] Pick up SDKROOT as the sysroot fallback.
For compatibility with xcrun and the behaviour of the clang driver, make use
of the setting of the SDKROOT environment variable when it is available.
This applies to both finding headers and libraries (i.e. it is also passed to
ld64).
Priority:
1. User's command-line specified --sysroot= or -isysroot.
2. The SDKROOT variable when set, and validated.
3. Any sysroot provided by --with-sysroot= configuration parameter.
SDKROOT is checked thus:
1. Presence.
2. That it starts with "/" (i.e. 'absolute').
3. That it is not "/" only (since that's the default).
4. That it is readable by the process executing the driver.
This is pretty much the same rule set as used by the clang driver.
NOTE: (3) might turn out to be overly restrictive in the case that we
have configured with --with-sysroot= and then we want to run on a system
with an installation of the headers/libraries in /. We can revisit this
if that turns out to be an important use-case.
So one can do:
xcrun --sdk macosx /path/to/gcc ....
and that provides the SDK path as the sysroot to GCC as expected.
CAVEAT: An unfortunate effect of the fact that "gcc" (and "g++") are
executables in the Xcode installation, which are found ahead of any such
named in the $PATH:
PR target/87243
* config/darwin-driver.c (maybe_get_sysroot_from_sdkroot): New.
(darwin_driver_init): Use the sysroot provided by SDKROOT when that
is available and the user has not set one on the command line.
Julian Brown [Thu, 3 Oct 2019 17:48:36 +0000 (17:48 +0000)]
Libgomp magic offset value self-documentation
2019-10-02 Julian Brown <julian@codesourcery.com>
Cesar Philippidis <cesar@codesourcery.com>
libgomp/
* libgomp.h (OFFSET_INLINED, OFFSET_POINTER, OFFSET_STRUCT): Define.
* target.c (FIELD_TGT_EMPTY): Define.
(gomp_map_val): Use OFFSET_* macros instead of magic constants. Write
as switch instead of list of ifs.
(gomp_map_vars_internal): Use OFFSET_* and FIELD_TGT_EMPTY macros.
Co-Authored-By: Cesar Philippidis <cesar@codesourcery.com>
From-SVN: r276519
* primary.c (match_real_constant): Remove shadowing local vars.
Rename local vars. Fix undefined behavior in loop termination.
(gfc_convert_to_structure_constructor): Rename local var.
Use the SIGNED_16BIT_OFFSET_EXTRA_P macro for 16-bit signed tests.
2019-10-02 Michael Meissner <meissner@linux.ibm.com>
* config/rs6000/rs6000.c (mem_operand_gpr): Use
SIGNED_16BIT_OFFSET_EXTRA_P.
(mem_operand_ds_form): Use SIGNED_16BIT_OFFSET_EXTRA_P.
(rs6000_mode_dependent_address): Use SIGNED_16BIT_OFFSET_EXTRA_P.
Joseph Myers [Wed, 2 Oct 2019 23:50:58 +0000 (00:50 +0100)]
Define WIDTH macros for C2x.
As part of the integration of TS 18661-1 into C2x, many features
became unconditional features not depending on any feature test macro
being defined. This patch updates the conditionals on the *_WIDTH
macros in limits.h and stdint.h accordingly so that they are defined
for C2x. The macro CR_DECIMAL_DIG in float.h does still require
__STDC_WANT_IEC_60559_BFP_EXT__ to be defined, and a test for this is
added.
Bootstrapped with no regressions on x86_64-pc-linux-gnu.
gcc:
* ginclude/stdint-gcc.h [__STDC_WANT_IEC_60559_BFP_EXT__]: Change
condition on WIDTH macros to [__STDC_WANT_IEC_60559_BFP_EXT__ ||
(__STDC_VERSION__ && __STDC_VERSION__ > 201710L)].
* glimits.h: Likewise.
gcc/testsuite:
* gcc.dg/cr-decimal-dig-2.c: New test.
* gcc.dg/limits-width-2.c: New test. Based on limits-width-1.c.
* gcc.dg/stdint-width-2.c: New test. Based on stdint-width-1.c.
Paolo Carlini [Wed, 2 Oct 2019 23:23:51 +0000 (23:23 +0000)]
init.c (build_new): Use cp_expr_loc_or_input_loc in two places.
/cp
2019-10-03 Paolo Carlini <paolo.carlini@oracle.com>
* init.c (build_new): Use cp_expr_loc_or_input_loc in two places.
* name-lookup.c (do_pushdecl): Use DECL_SOURCE_LOCATION.
(push_class_level_binding_1): Likewise.
(set_decl_namespace): Likewise.
/testsuite
2019-10-03 Paolo Carlini <paolo.carlini@oracle.com>
Jakub Jelinek [Wed, 2 Oct 2019 22:33:39 +0000 (00:33 +0200)]
re PR rtl-optimization/91976 (RTL check: expected code 'const_int', have 'reg' in emit_block_move_hints, at expr.c:1627)
PR rtl-optimization/91976
* expr.c (emit_block_move_hints): Don't call can_move_by_pieces if
size is not CONST_INT_P, set pieces_ok to false in that case. Simplify
CONST_INT_P (size) && pieces_ok to pieces_ok. Formatting fix.
Jakub Jelinek [Wed, 2 Oct 2019 22:32:56 +0000 (00:32 +0200)]
constexpr.c (cxx_eval_constant_expression): If not skipping upon entry to body...
* constexpr.c (cxx_eval_constant_expression) <case CLEANUP_STMT>: If
not skipping upon entry to body, run cleanup with the same *jump_target
as it started to run the cleanup even if the body returns, breaks or
continues.
(potential_constant_expression_1): Allow CLEANUP_STMT.
Fix ALL_REGS thinko in initialisation of function_used_regs
My change to the -fipa-ra bookkeeping used ALL_REGS as the supposedly
safe default assumption, but ALL_REGS isn't literally all registers,
just a close approximation.
This caused a bootstrap failure on arm-linux-gnu, where the condition
code register isn't in ALL_REGS and so was being masked out of some
call-clobbered sets.
2019-10-02 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* cgraph.c (cgraph_node::rtl_info): Use SET_HARD_REG_SET
instead of reg_class_contents[ALL_REGS].
runtime: mark go-context.S as no-executable-stack and split-stack supported
The .note.GNU-stack section tells the linker that this object does not
require an executable stack.
The .note.GNU-split-stack section tells the linker that functions in
this object can be called directly by split-stack functions, without
require a large stack.
The .note.GNU-no-split-stack section tells the linker that functions
in this object do not have a split-stack prologue.
Jason Merrill [Wed, 2 Oct 2019 20:01:42 +0000 (16:01 -0400)]
Improve C++ fold caching efficiency.
While looking at concepts caching I noticed that we were clearing the caches
unnecessarily for non-constant initialization, which shouldn't affect
folding.
* typeck2.c (store_init_value): Only clear_cv_and_fold_caches if the
value is constant.
Steven G. Kargl [Wed, 2 Oct 2019 17:04:57 +0000 (17:04 +0000)]
re PR fortran/91942 (ICE in match_vtag, at fortran/io.c:1485)
2019-10-02 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/91942
* io.c (match_vtag): Check for non-NULL result->symtree.
(match_out_tag): Check for invalid constant due to inquiry parameter.
(match_filepos): Instead of a syntax error, go to cleanup to get better
error messages.
Steven G. Kargl [Wed, 2 Oct 2019 17:01:30 +0000 (17:01 +0000)]
re PR fortran/91943 (ICE in gfc_conv_constant_to_tree, at fortran/trans-const.c:370)
2019-10-02 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/91943
* match.c (gfc_match_call): BOZ cannot be an actual argument in
a subroutine reference.
* resolve.c (resolve_function): BOZ cannot be an actual argument in
a function reference.
Jonathan Wakely [Wed, 2 Oct 2019 15:52:41 +0000 (16:52 +0100)]
Remove greedy wildcards from libstdc++ linker script
The only symbols matched by std::e[a-q]* and std::e[s-z]* that are
supposed to be in the GLIBCXX_3.4 version are std::exception::* and
std::endl and std::ends. The latter two already have explicit patterns
matching them, so we just need to match std::exception::*.
This change ensures that any new symbols with a return type of
std::enable_if<...> are not added to the GLIBCXX_3.4 version.
* config/abi/pre/gnu.ver: Tighten up greedy wildcards.
Eric Botcazou [Wed, 2 Oct 2019 13:35:40 +0000 (13:35 +0000)]
tree-eh.h (unsplit_eh_edges): Declare.
* tree-eh.h (unsplit_eh_edges): Declare.
* tree-eh.c (maybe_remove_unreachable_handlers): Detect more cases.
(unsplit_eh_edges): New function wrapping unsplit_all_eh.
* gimple-ssa-store-merging.c: Include cfganal.h cfgcleanup.h except.h.
(struct store_immediate_info): Add lp_nr field.
(store_immediate_info::store_immediate_info): Add NR2 parameter and
initialize lp_nr with it.
(struct merged_store_group): Add lp_nr and only_constants fields.
(merged_store_group::merged_store_group): Initialize them.
(merged_store_group::can_be_merged_into): Deal with them.
(pass_store_merging): Rename terminate_and_release_chain into
terminate_and_process_chain.
(pass_store_merging::terminate_and_process_all_chains): Adjust to above
renaming and remove useless assertions.
(pass_store_merging::terminate_all_aliasing_chains): Small tweak.
(stmts_may_clobber_ref_p): Be prepared for different basic blocks.
(imm_store_chain_info::coalesce_immediate_stores): Use only_constants
instead of always recomputing it and compare lp_nr.
(imm_store_chain_info::output_merged_store): If the group is in an
active EH region, register new stores if they can throw. Moreover,
if the insertion has created new basic blocks, adjust the PHI nodes
of the post landing pad.
(imm_store_chain_info::output_merged_stores): If the original stores
are in an active EH region, deregister them.
(lhs_valid_for_store_merging_p): Prettify.
(adjust_bit_pos): New function extracted from...
(mem_valid_for_store_merging): ...here. Use it for the base address
and also for the offset if it is the addition of a constant.
(lp_nr_for_store): New function.
(pass_store_merging::process_store): Change return type to bool.
Call lp_nr_for_store to initialize the store info. Propagate the
return status of various called functions to the return value.
(store_valid_for_store_merging_p): New predicate.
(enum basic_block_status): New enumeration.
(get_status_for_store_merging): New function.
(pass_store_merging::execute): If the function can throw and catch
non-call exceptions, unsplit the EH edges on entry and clean up the
CFG on exit if something changed. Call get_status_for_store_merging
for every basic block and keep the chains open across basic blocks
when possible. Terminate and process open chains at the end, if any.
Jeff pointed out that gcc.target/mips/call-clobbered-4.c started
failing after the function-abi series. This is because IRA used
to treat partly call-clobbered registers as hard conflicts and
so wouldn't consider them for -fcaller-saves. Now that we treat
call clobbers the same way regardless of where they come from,
we can use $f21 as a caller-save register. This in turn means
that -Os is no longer a special case in call-clobbered-3.c.
(The new code is the same size as the old code.)
2019-10-02 Richard Sandiford <richard.sandiford@arm.com>
gcc/testsuite/
* gcc.target/mips/call-clobbered-3.c: Remove skip for -Os.
* gcc.target/mips/call-clobbered-4.c: Delete.