platform/upstream/gcc.git
2 years agoopenmp: Add omp_all_memory support (C/C++ only so far)
Jakub Jelinek [Thu, 12 May 2022 06:31:20 +0000 (08:31 +0200)]
openmp: Add omp_all_memory support (C/C++ only so far)

The ugly part is that OpenMP 5.1 made omp_all_memory a reserved identifier
which isn't allowed to be used anywhere but in the depend clause, this is
against how everything else has been handled in OpenMP so far (where
some identifiers could have special meaning in some OpenMP clauses or
pragmas but not elsewhere).
The patch handles it by making it a conditional keyword (for -fopenmp
only) and emitting a better diagnostics when it is used in a primary
expression.  Having a nicer diagnostics when e.g. trying to do
int omp_all_memory;
or
int *omp_all_memory[10];
etc. would mean changing too many spots and hooking into name lookups
to reject declaring any such symbols would be too ugly and I'm afraid
there are way too many spots where one can introduce a name
(variables, functions, namespaces, struct, enum, enumerators, template
arguments, ...).

Otherwise, the handling is quite simple, normal depend clauses lower
into addresses of variables being handed over to the library, for
omp_all_memory I'm using NULL pointers.  omp_all_memory can only be
used with inout or out depend kinds and means that a task is dependent
on all previously created sibling tasks that have any dependency (of
any depend kind) and that any later created sibling tasks will be
dependent on it if they have any dependency.

2022-05-12  Jakub Jelinek  <jakub@redhat.com>

gcc/
* gimplify.cc (gimplify_omp_depend): Don't build_fold_addr_expr
if null_pointer_node.
(gimplify_scan_omp_clauses): Likewise.
* tree-pretty-print.cc (dump_omp_clause): Print null_pointer_node
as omp_all_memory.
gcc/c-family/
* c-common.h (enum rid): Add RID_OMP_ALL_MEMORY.
* c-omp.cc (c_finish_omp_depobj): Don't build_fold_addr_expr
if null_pointer_node.
gcc/c/
* c-parser.cc (c_parse_init): Register omp_all_memory as keyword
if flag_openmp.
(c_parser_postfix_expression): Diagnose uses of omp_all_memory
in postfix expressions.
(c_parser_omp_variable_list): Handle omp_all_memory in depend
clause.
* c-typeck.cc (c_finish_omp_clauses): Handle omp_all_memory
keyword in depend clause as null_pointer_node, diagnose invalid
uses.
gcc/cp/
* lex.cc (init_reswords): Register omp_all_memory as keyword
if flag_openmp.
* parser.cc (cp_parser_primary_expression): Diagnose uses of
omp_all_memory in postfix expressions.
(cp_parser_omp_var_list_no_open): Handle omp_all_memory in depend
clause.
* semantics.cc (finish_omp_clauses): Handle omp_all_memory
keyword in depend clause as null_pointer_node, diagnose invalid
uses.
* pt.cc (tsubst_omp_clause_decl): Pass through omp_all_memory.
gcc/testsuite/
* c-c++-common/gomp/all-memory-1.c: New test.
* c-c++-common/gomp/all-memory-2.c: New test.
* c-c++-common/gomp/all-memory-3.c: New test.
* g++.dg/gomp/all-memory-1.C: New test.
* g++.dg/gomp/all-memory-2.C: New test.
libgomp/
* libgomp.h (struct gomp_task): Add depend_all_memory member.
* task.c (gomp_init_task): Initialize depend_all_memory.
(gomp_task_handle_depend): Handle omp_all_memory.
(gomp_task_run_post_handle_depend_hash): Clear
parent->depend_all_memory if equal to current task.
(gomp_task_maybe_wait_for_dependencies): Handle omp_all_memory.
* testsuite/libgomp.c-c++-common/depend-1.c: New test.
* testsuite/libgomp.c-c++-common/depend-2.c: New test.
* testsuite/libgomp.c-c++-common/depend-3.c: New test.

2 years agotestsuite: Update Wconversion testcase check type.
jiawei [Thu, 5 May 2022 10:33:20 +0000 (18:33 +0800)]
testsuite: Update Wconversion testcase check type.

Some compiler target like arm-linux\riscv\power\s390x\xtensa-gcc handle
char as unsigned char, then there are no warnings occur and got FAIL cases.
Just change the type char into explicit signed char to keep the feature
consistency.

gcc/testsuite/ChangeLog:

* c-c++-common/Wconversion-1.c: Update type.

2 years agoDaily bump.
GCC Administrator [Thu, 12 May 2022 00:16:36 +0000 (00:16 +0000)]
Daily bump.

2 years agoanalyzer: fix memory leaks
David Malcolm [Wed, 11 May 2022 21:24:42 +0000 (17:24 -0400)]
analyzer: fix memory leaks

These leaks all relate to logging within -fdump-analyzer[-stderr]
or are one-time leaks; seen with valgrind.

gcc/analyzer/ChangeLog:
* checker-path.cc (state_change_event::get_desc): Call maybe_free
on label_text temporaries.
* diagnostic-manager.cc
(diagnostic_manager::prune_for_sm_diagnostic): Likewise.
* engine.cc (exploded_graph::~exploded_graph): Fix leak of
m_per_point_data and m_per_call_string_data values.  Simplify
cleanup of m_per_function_stats and m_per_point_data values.
(feasibility_state::maybe_update_for_edge): Fix leak of result of
superedge::get_description.
* region-model-manager.cc
(region_model_manager::~region_model_manager): Move cleanup of
m_setjmp_values to match the ordering of the fields within
region_model_manager.  Fix leak of values within
m_repeated_values_map, m_bits_within_values_map,
m_asm_output_values_map, and m_const_fn_result_values_map.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2 years agotree: introduce range adaptor for TREE_VEC
Patrick Palka [Wed, 11 May 2022 20:14:59 +0000 (16:14 -0400)]
tree: introduce range adaptor for TREE_VEC

This patch implements a simple tree wrapper, named tree_vec_range, which
lets us idiomatically loop over all the elements of a TREE_VEC using a
C++11 range-based for loop:

  // v is a TREE_VEC
  for (tree e : tree_vec_range (v))
    ...

This is similar to the existing tree-based range adaptors ovl_range and
lkp_range added to the C++ FE in r12-340-g3307b9a07a3c51.

This patch also converts some existing loops over TREE_VEC within the
C++ FE to use tree_vec_range / range-for.

gcc/cp/ChangeLog:

* constraint.cc (tsubst_parameter_mapping): Convert loop over
TREE_VEC into a range-based for loop using tree_vec_range.
* pt.cc (iterative_hash_template_arg): Likewise.
(template_parms_level_to_args): Likewise.
(deducible_template_args): Likewise.
(check_undeduced_parms): Likewise.
(dependent_type_p_r): Likewise.
(value_dependent_expression_p) <case NONTYPE_ARGUMENT_PACK>:
Likewise.
(dependent_template_arg_p): Likewise.
* tree.cc (cp_walk_subtrees) <case NONTYPE_ARGUMENT_PACK>:
Likewise.

gcc/ChangeLog:

* tree.h (TREE_VEC_BEGIN): Define.
(TREE_VEC_END): Correct 'length' member access.
(class tree_vec_range): Define.

2 years agoc++: lambda template in requires [PR105541]
Jason Merrill [Wed, 11 May 2022 18:53:26 +0000 (14:53 -0400)]
c++: lambda template in requires [PR105541]

Since the patch for PR103408, the template parameters for the lambda in this
test have level 1 instead of 2, and we were treating null template args as 1
level of arguments, so tsubst_template_parms decided it had nothing to do.
Fixed by distinguishing between <> and no args at all, which is what we have
in our "substitution" in a requires-expression.

PR c++/105541

gcc/cp/ChangeLog:

* cp-tree.h (TMPL_ARGS_DEPTH): 0 for null args.
* parser.cc (cp_parser_enclosed_template_argument_list):
Use 0-length TREE_VEC for <>.

gcc/testsuite/ChangeLog:

* g++.dg/cpp2a/lambda-requires1.C: New test.

2 years agoc++: fix arm-eabi bootstrap [PR105567]
Jason Merrill [Wed, 11 May 2022 13:44:57 +0000 (09:44 -0400)]
c++: fix arm-eabi bootstrap [PR105567]

Since my r13-112, in the template we were changing 'return' to 'return this'
on cdtor_returns_this targets, and then getting confused by that when
instantiating.  So only make that change at instantiation time.

PR bootstrap/105567

gcc/cp/ChangeLog:

* typeck.cc (check_return_expr): Don't mess with ctor return value
while parsing a template.

gcc/testsuite/ChangeLog:

* g++.dg/template/ctor10.C: New test.

2 years agoFortran: fix error recovery on invalid array section
Harald Anlauf [Tue, 10 May 2022 21:41:57 +0000 (23:41 +0200)]
Fortran: fix error recovery on invalid array section

gcc/fortran/ChangeLog:

PR fortran/105230
* expr.cc (find_array_section): Correct logic to avoid NULL
pointer dereference on invalid array section.

gcc/testsuite/ChangeLog:

PR fortran/105230
* gfortran.dg/pr105230.f90: New test.

Co-authored-by: Steven G. Kargl <kargl@gcc.gnu.org>
2 years agors6000: Remove <Fv>
Segher Boessenkool [Tue, 10 May 2022 20:45:13 +0000 (20:45 +0000)]
rs6000: Remove <Fv>

The <Fv> mode iterator always expands to "wa".

2022-05-11  Segher Boessenkool  <segher@kernel.crashing.org>

* config/rs6000/rs6000.md: Use wa instead of <Fv>.

2 years agors6000: Remove <Ff>
Segher Boessenkool [Tue, 10 May 2022 20:35:56 +0000 (20:35 +0000)]
rs6000: Remove <Ff>

The <Ff> mode iterator can just use "d" always.

2022-05-11  Segher Boessenkool  <segher@kernel.crashing.org>

* config/rs6000/rs6000.md: Use d instead of <Ff>.

2 years agors6000: Delete RS6000_CONSTRAINT_f
Segher Boessenkool [Tue, 10 May 2022 18:47:31 +0000 (18:47 +0000)]
rs6000: Delete RS6000_CONSTRAINT_f

Constraint "f" is always exactly the same as constraint "d", so we do
not need RS6000_CONSTRAINT_f.

2022-05-11  Segher Boessenkool  <segher@kernel.crashing.org>

* config/rs6000/constraints.md (register_constraint "f"): Use
RS6000_CONSTRAINT_d.
* config/rs6000/rs6000.cc (rs6000_debug_reg_global): Do not handle
RS6000_CONSTRAINT_f.
(rs6000_init_hard_regno_mode_ok): Ditto.  Reorder and simplify a bit.
* config/rs6000/rs6000.h (r6000_reg_class_enum): Delete
RS6000_CONSTRAINT_d.

2 years agoUse variadic template functions for the gimple_build forwarders
Richard Biener [Wed, 11 May 2022 12:53:37 +0000 (14:53 +0200)]
Use variadic template functions for the gimple_build forwarders

The following consolidates the forwarders to gimple_build with
UNKNOWN_LOCATION by using two variadic template functions.  This
makes the code visually less disturbing and is in preparation
of adding more forwarders with different stmt insertion schemes.

2022-05-11  Richard Biener  <rguenther@suse.de>

* gimple-fold.h (gimple_build): Use variadic template
functions for the gimple_build API forwarders without
location_t argument.

2 years agomiddle-end/70090: Register __bdos for sanitizers if necessary
Siddhesh Poyarekar [Wed, 11 May 2022 13:43:09 +0000 (19:13 +0530)]
middle-end/70090: Register __bdos for sanitizers if necessary

The asan initializer registers __builtin_object_size for languages that
don't have it, e.g. Fortran.  Register __builtin_dynamic_object_size too
(we need both because __builtin_dynamic_object_size computation may
involve generating __builtin_object_size as a fallback) so that
gfortran.dg/ubsan/bind-c-intent-out-2.f90 does not crash anymore.

gcc/ChangeLog:

PR middle-end/70090
* asan.cc (initialize_sanitizer_builtins): Register
__builtin_dynamic_object_size if necessary.

Signed-off-by: Siddhesh Poyarekar <siddhesh@gotplt.org>
2 years ago[c++] Add module attachment
Nathan Sidwell [Mon, 9 May 2022 11:47:14 +0000 (04:47 -0700)]
[c++] Add module attachment

This adds module attachment as a distinct flag to 'in module purview'.
A declaration may have neither or both (as before), but can also have
just the 'in [named-module] purview', which was previously not
representable.

This new state allows some cleanup of redeclarations (particularly the
builtins), which was a little warty.  Some other internal APIs get
similarly clarified.

gcc/cp/
* cp-tree.h (DECL_MODULE_ATTACH_P): New.
(struct lang_decl_base): Add module_attach_p flag.
* decl.cc (duplicate_decls): Rework module redeclaration
checking.
* module.cc (trees_out::lang_decl_bools): Write attach flag.
(trees_in::lang_decl_bools): ... and read it back.
(trees_out::decl_value): Rework module attachment handling.
(trees_in::decl_value): Rename local var to reflect meaning.
(trees_in::key_mergeable): Likewise.
(get_originating_module): Use DECL_MODULE_ATTACH_P.  No need
to special-case mangling.
(module_may_redeclare): Reimplement.
(set_originating_module): Deal with attachment.
* name-lookup.cc (maybe_record_mergeable_decl): Deal with
attachment.
(mergeable_namespace_slots): Likewise.
(do_nonmember_using_decl): Likewise.
* name-lookup.h (mergeable_namespace_slots): Adjust parm
meaning.
* ptree.cc (cxx_print_decl): Adjust purview & attach printing.

2 years agortl-optimization/105559 - avoid quadratic behavior in delete_insn_and_edges
Richard Biener [Wed, 11 May 2022 11:34:37 +0000 (13:34 +0200)]
rtl-optimization/105559 - avoid quadratic behavior in delete_insn_and_edges

When the insn to delete is a debug insn there's no point in figuring
out whether it might be the last real insn and thus we have to purge
dead edges.

2022-05-11  Richard Biener  <rguenther@suse.de>

PR rtl-optimization/105559
* cfgrtl.cc (delete_insn_and_edges): Only perform search to BB_END
for non-debug insns.

2 years agoImplement some of fold_binary_op_with_conditional_arg in match.pd
Richard Biener [Wed, 11 May 2022 09:53:53 +0000 (11:53 +0200)]
Implement some of fold_binary_op_with_conditional_arg in match.pd

The following allows (c != 0 ? 0 : 100) != 0 to be simplified as
c != 0 as fold_binary_op_with_conditional_arg would have done
via forwprop and GENERIC folding.  Likewise it allows to combine
(a != 0) != 0 directly via match.pd instead of only via
forwprop and again fold_binary_op_with_conditional_arg.

The patterns do not fully implement all cases of
fold_binary_op_with_conditional_arg, some aspects like
"any of the operands simplify" cannot currently be expressed.

2022-05-11  Richard Biener  <rguenther@suse.de>

* generic-match-head.cc: Include tree-eh.h.
* match.pd ((cond ...) cmp X): New simplification inspired
by fold_binary_op_with_conditional_arg.
(eq/ne (cmp ...) true/false): Likewise.

* gcc.dg/tree-ssa/pr61839_1.c: Adjust.
* gcc.dg/tree-ssa/vrp24.c: Likewise.

2 years agolibgomp: Remove unused '--with-hsa-runtime', '--with-hsa-runtime-include', '--with...
Thomas Schwinge [Wed, 6 Apr 2022 10:26:13 +0000 (12:26 +0200)]
libgomp: Remove unused '--with-hsa-runtime', '--with-hsa-runtime-include', '--with-hsa-runtime-lib'

With recent commit 2e309a4eff80e55b53d32d26926a2a94eabfea21 "libgomp testsuite:
Don't amend 'LD_LIBRARY_PATH' for system-provided HSA Runtime library",
and commit d6adba307508c75f1ccb2121eb1a43c9ab1d4056 "libgomp GCN plugin:
 Clean up unused references to system-provided HSA Runtime library", the last
uses of '--with-hsa-runtime' etc. are gone.

gcc/
* doc/install.texi: Don't document '--with-hsa-runtime',
'--with-hsa-runtime-include', '--with-hsa-runtime-lib'.
libgomp/
* plugin/configfrag.ac: Remove '--with-hsa-runtime',
'--with-hsa-runtime-include', '--with-hsa-runtime-lib' processing.
* Makefile.in: Regenerate.
* configure: Likewise.
* testsuite/Makefile.in: Likewise.

2 years agolibgomp GCN plugin: Clean up always-empty 'PLUGIN_GCN_CPPFLAGS', 'PLUGIN_GCN_LDFLAGS'
Thomas Schwinge [Wed, 6 Apr 2022 10:15:28 +0000 (12:15 +0200)]
libgomp GCN plugin: Clean up always-empty 'PLUGIN_GCN_CPPFLAGS', 'PLUGIN_GCN_LDFLAGS'

After recent commit d6adba307508c75f1ccb2121eb1a43c9ab1d4056
"libgomp GCN plugin: Clean up unused references to system-provided HSA Runtime
library", these aren't set anymore.

libgomp/
* plugin/Makefrag.am (libgomp_plugin_gcn_la_CPPFLAGS): Don't
consider 'PLUGIN_GCN_CPPFLAGS'.
(libgomp_plugin_gcn_la_LDFLAGS): Don't consider
'PLUGIN_GCN_LDFLAGS'.
* plugin/configfrag.ac (PLUGIN_GCN_CPPFLAGS, PLUGIN_GCN_LDFLAGS):
Remove.
* Makefile.in: Regenerate.
* configure: Likewise.
* testsuite/Makefile.in: Likewise.

2 years agolibgomp GCN plugin: Clean up unused references to system-provided HSA Runtime library
Thomas Schwinge [Wed, 6 Apr 2022 09:31:45 +0000 (11:31 +0200)]
libgomp GCN plugin: Clean up unused references to system-provided HSA Runtime library

This is only active if GCC is 'configure'd with '--with-hsa-runtime=[...]' or
'--with-hsa-runtime-include=[...]', '--with-hsa-runtime-lib=[...]' -- which
nobody really is doing, as far as I can tell.

Originally changed for the libgomp HSA plugin in
commit b8d89b03db5f212919e4571671ebb4f5f8b1e19d (r242749)
"Remove build dependence on HSA run-time", and later propagated into the GCN
plugin, these are no longer built against system-provided HSA Runtime library.
Instead, unconditionally built against the GCC-shipped 'include/hsa*.h' header
files, and at run time does 'dlopen("libhsa-runtime64.so.1")'.  It thus doesn't
make sense to consider references to system-provided HSA Runtime library during
libgomp GCN plugin build.

libgomp/
* plugin/configfrag.ac (HSA_RUNTIME_CPPFLAGS)
(HSA_RUNTIME_LDFLAGS): Remove.
* configure: Regenerate.

2 years agolibgomp testsuite: Don't amend 'LD_LIBRARY_PATH' for system-provided HSA Runtime...
Thomas Schwinge [Wed, 6 Apr 2022 08:39:56 +0000 (10:39 +0200)]
libgomp testsuite: Don't amend 'LD_LIBRARY_PATH' for system-provided HSA Runtime library

This is only active if GCC is 'configure'd with '--with-hsa-runtime=[...]' or
'--with-hsa-runtime-lib=[...]' -- which nobody really is doing, as far as I can
tell.

'libgomp/testsuite/lib/libgomp.exp:libgomp_init' states:

    # For build-tree testing, also consider the library paths used for builing.
    # For installed testing, we assume all that to be provided in the sysroot.
    if { $blddir != "" } {
        [...]
        global hsa_runtime_lib
        if { $hsa_runtime_lib != "" } {
            append always_ld_library_path ":$hsa_runtime_lib"
        }
    }

However, the libgomp GCN plugin is unconditionally built against the
GCC-shipped 'include/hsa*.h' header files, and at run time does
'dlopen("libhsa-runtime64.so.1")', so there is no system-provided HSA Runtime
library "used for builing".  It thus doesn't make sense to amend
'LD_LIBRARY_PATH' for system-provided HSA Runtime library.

libgomp/
* testsuite/lib/libgomp.exp (libgomp_init): Don't
'append always_ld_library_path ":$hsa_runtime_lib"'.
* testsuite/libgomp-test-support.exp.in (hsa_runtime_lib): Don't set.

2 years agodocs: document --with-zstd
Martin Liska [Wed, 11 May 2022 11:21:26 +0000 (13:21 +0200)]
docs: document --with-zstd

PR other/105527

gcc/ChangeLog:

* doc/install.texi: Document the configure option --with-zstd.

2 years agoi386: simplify cpu_feature handling
Martin Liska [Wed, 15 Dec 2021 09:54:23 +0000 (10:54 +0100)]
i386: simplify cpu_feature handling

The patch removes unneeded loops for cpu_features2 and CONVERT_EXPR
that can be simplified with NOP_EXPR.

gcc/ChangeLog:

* common/config/i386/cpuinfo.h (has_cpu_feature): Directly
compute index in cpu_features2.
(set_cpu_feature): Likewise.
* config/i386/i386-builtins.cc (fold_builtin_cpu): Also remove
loop for cpu_features2 and use NOP_EXPRs.

2 years ago[Ada] Proof of 'Image support for unsigned integers
Yannick Moy [Tue, 1 Feb 2022 11:33:54 +0000 (12:33 +0100)]
[Ada] Proof of 'Image support for unsigned integers

Prove System.Image_U, making the connection with the space available in
the string as computed with System.Width_U and the functions that
support the other direction of 'Value in System.Value_U.

The units that support 'Image cannot be marked Pure anymore, as they now
depend on non-pure units.

gcc/ada/

* libgnat/s-imaged.ads: Remove Pure.
* libgnat/s-imagef.ads: Remove Pure.
* libgnat/s-imager.ads: Remove Pure.
* libgnat/s-imageu.adb: Add ghost code.
* libgnat/s-imageu.ads: Add contracts.
* libgnat/s-imde128.ads: Remove Pure.
* libgnat/s-imde32.ads: Remove Pure.
* libgnat/s-imde64.ads: Remove Pure.
* libgnat/s-imfi128.ads: Remove Pure.
* libgnat/s-imfi32.ads: Remove Pure.
* libgnat/s-imfi64.ads: Remove Pure.
* libgnat/s-imgflt.ads: Remove Pure.
* libgnat/s-imglfl.ads: Remove Pure.
* libgnat/s-imgllf.ads: Remove Pure.
* libgnat/s-imglllu.ads: Instantiate with ghost subprograms.
* libgnat/s-imgllu.ads: Instantiate with ghost subprograms.
* libgnat/s-imgrea.ads: Remove Pure.
* libgnat/s-imguns.ads: Instantiate with ghost subprograms.
* libgnat/s-imguti.ads: Remove Pure.
* libgnat/s-valueu.adb (Prove_Iter_Scan_Based_Number_Ghost,
Prove_Scan_Only_Decimal_Ghost): New lemmas.
* libgnat/s-valueu.ads (Uns_Option): Do not make type ghost to
be able to use it as formal in instantiations.
(Only_Decimal_Ghost): New ghost query.
(Prove_Iter_Scan_Based_Number_Ghost,
Prove_Scan_Only_Decimal_Ghost): New lemmas.
* libgnat/s-widlllu.ads: Adapt to changes in Width_U.
* libgnat/s-widllu.ads: Adapt to changes in Width_U.
* libgnat/s-widthu.adb: Change generic function in generic
package in order to complete the postcondition. Tighten the
upper bound on the result by 1.
* libgnat/s-widthu.ads: Same.
* libgnat/s-widuns.ads: Adapt to changes in Width_U.
* gcc-interface/Make-lang.in: Add dependencies on a-nubinu,
a-numeri.ads and a-widuns.ads.

2 years ago[Ada] Sort Detect_Blocking alphabetically among names and pragmas
Piotr Trojanek [Fri, 4 Feb 2022 12:34:52 +0000 (13:34 +0100)]
[Ada] Sort Detect_Blocking alphabetically among names and pragmas

In GNAT User's Guide section about configuration pragmas the
Detect_Blocking has been recently moved to an alphabetic order.  This
patch moves the its Name_Id and Pragma_Is in the source code to match
this order.

gcc/ada/

* snames.ads-tmpl (Detect_Blocking): Move after
Default_Storage_Pool.

2 years ago[Ada] Fix Compile_Time_(Error|Warning) as non-configuration pragmas
Piotr Trojanek [Thu, 3 Feb 2022 23:22:41 +0000 (00:22 +0100)]
[Ada] Fix Compile_Time_(Error|Warning) as non-configuration pragmas

Uses of Compile_Time_Error and Compile_Time_Warning as configuration
pragmas were detected with a custom check in semantic analysis. Now they
are detected with an existing general check in parser.

gcc/ada/

* sem_prag.adb (Analyze_Pragma): Remove custom check for
Compile_Time_Error and Compile_Time_Warning pragmas.
* snames.ads-tmpl (Compile_Time_Error, Compile_Time_Warning):
Move beyond Last_Configuration_Pragma_Name.

2 years ago[Ada] Correctly reject record aggregate using brackets
Marc Poulhiès [Mon, 31 Jan 2022 14:54:41 +0000 (15:54 +0100)]
[Ada] Correctly reject record aggregate using brackets

Ada 2022 bracket syntax is only allowed for arrays and containers, not
records. This change correctly rejects record aggregates using brackets
along with few cases of brackets being used instead of parentheses.

gcc/ada/

* libgnat/a-direct.adb (Start_Search_Internal): Use parentheses
for record aggregate.
* libgnat/a-stbubo.adb (Get_UTF_8): Likewise.
* libgnat/a-stbuun.adb (Get_UTF_8): Likewise.
* libgnat/a-stzbou.ads (Null_Bounded_Wide_Wide_String):
Likewise.
* libgnat/a-swmwco.ads (Lower_Case_Mapping, Basic_Mapping):
Likewise.
* libgnat/a-szmzco.ads (Lower_Case_Mapping, Basic_Mapping):
Likewise.
* libgnat/s-statxd.adb (Fields): Likewise.
* libgnat/s-stausa.adb (Initialize): Likewise.
* sem_aggr.adb (Resolve_Record_Aggregate): Reject aggregates
using brackets.

2 years ago[Ada] Fix unbalanced paren in documentation marker for GNAT Studio
Piotr Trojanek [Fri, 4 Feb 2022 08:47:27 +0000 (09:47 +0100)]
[Ada] Fix unbalanced paren in documentation marker for GNAT Studio

Unbalanced parens can be found when editing in emacs using the
"check-parens" command. Offending occurrences must be examined manually,
because few of them are intentional.

Minor cleanup of typos in documentation.

gcc/ada/

* doc/gnat_rm/implementation_defined_pragmas.rst,
doc/gnat_rm/implementation_of_specific_ada_features.rst,
doc/gnat_rm/representation_clauses_and_pragmas.rst,
doc/gnat_rm/the_gnat_library.rst,
doc/gnat_rm/the_implementation_of_standard_i_o.rst,
doc/gnat_ugn/building_executable_programs_with_gnat.rst,
doc/gnat_ugn/gnat_and_program_execution.rst,
doc/gnat_ugn/platform_specific_information.rst: Fix unbalanced
parentheses and brackets.
* sem_prag.adb (pragma Obsolescent): Likewise.
* gnat_rm.texi, gnat_ugn.texi: Regenerate.

2 years ago[Ada] New No_Local_Tagged_Types restriction
Marc Poulhiès [Tue, 1 Feb 2022 11:20:51 +0000 (12:20 +0100)]
[Ada] New No_Local_Tagged_Types restriction

Add new configuration restriction No_Local_Tagged_Types. This new
restriction ensures at compile time that all tagged types are only
declared at the library level.

gcc/ada/

* libgnat/s-rident.ads (Restriction_Id): Add
No_Local_Tagged_Types, update comment for adding new GNAT
specific restriction.
* restrict.ads (Implementation_Restriction): Add
No_Local_Tagged_Types.
* sem_ch3.adb (Analyze_Full_Type_Declaration): Add check for
tagged type at library level.
* doc/gnat_rm/standard_and_implementation_defined_restrictions.rst:
Add No_Local_Tagged_Types description.
* gnat_rm.texi: Regenerate.

2 years ago[Ada] Fix spurious ambiguity for if_expression containing operator
Eric Botcazou [Wed, 2 Feb 2022 20:04:18 +0000 (21:04 +0100)]
[Ada] Fix spurious ambiguity for if_expression containing operator

It comes from a discrepancy in the analysis of binary operators, between
the predefined ones for which we register an interpretation with the base
type and the user-defined ones for which we register an interpretation
with the subtype directly.

This is harmless in almost all cases because the two interpretations do not
differ by this type property only, but is problematic when the operation is
the dependent expression of a conditional expression, because it causes two
interpretations of the conditional expression to be registered, which this
time differ by this type property only, thus making them impossible to be
disambiguated later.

gcc/ada/

* sem_ch4.adb (Analyze_User_Defined_Binary_Op): Use the base type
in the interpretation of the operator.

2 years ago[Ada] Fix style of body header boxes
Piotr Trojanek [Thu, 3 Feb 2022 20:28:44 +0000 (21:28 +0100)]
[Ada] Fix style of body header boxes

gcc/ada/

* sem_case.adb (Free_Value_Sets): Fix style in body header box.
* sem_ch12.adb (Build_Subprogram_Wrappers): Likewise.
* sem_util.adb (Statically_Denotes_Entity): Likewise.

2 years ago[Ada] Do not create useless itype in Constrain_Access
Etienne Servais [Wed, 2 Feb 2022 14:18:29 +0000 (15:18 +0100)]
[Ada] Do not create useless itype in Constrain_Access

In the case of a constrained access definition for a record component we
are calling create_itype twice the former not being updated.  This leads
to a malformed node that crashes -gnatG when predicates are activated.
Instead of creating a default Itype for Desig_Subtype, create it with
the correct scope in each case.

gcc/ada/

* sem_ch3.adb (Constrain_Access): Call Desig_Subtype in each if
branch to avoid calling it twice.

2 years ago[Ada] Detect infinite loops with operators in exit conditions
Piotr Trojanek [Wed, 2 Feb 2022 16:19:59 +0000 (17:19 +0100)]
[Ada] Detect infinite loops with operators in exit conditions

To warn about infinite loops we detect variables referenced in loop exit
conditions. We handle references within boolean operators, i.e.
comparison and negation, which are likely to appear at the top level of
the condition (e.g. "X > 0"). However, we can easily handle all
operators, because they are likely to appear inside the condition (e.g.
"abs (X) > 0.0").

Cleanup related to a new restriction No_Uninitialized_Local_Scalars.

gcc/ada/

* sem_warn.adb (Find_Var): Detect all operators; replace
"condition" to "expression" in comments, because when this
routine is called recursively it no longer examines the
condition.
(Is_Suspicious_Function_Name): Reduce scope of a local variable
to avoid shadowing with a parameter of a nested
Substring_Present function.

2 years ago[Ada] Adapt proof of System.Arith_Double after update of Z3
Yannick Moy [Wed, 2 Feb 2022 11:52:36 +0000 (12:52 +0100)]
[Ada] Adapt proof of System.Arith_Double after update of Z3

Update to version 4.8.14 of prover Z3 requires minor adjustments of the
ghost code to add necessary intermediate assertions that drive the
automatic proof.

gcc/ada/

* libgnat/s-aridou.adb (Double_Divide, Scaled_Divide): Add
intermediate assertions.

2 years ago[Ada] Update categorization of implementation restrictions
Piotr Trojanek [Tue, 1 Feb 2022 14:21:01 +0000 (15:21 +0100)]
[Ada] Update categorization of implementation restrictions

Some of the restrictions were initially implemented as specific to GNAT,
but now they are part of Ada; likewise, some of recently added
restrictions were considered to be part of Ada, but are not yet in the
standard. This patch updates their categorization based on Ada 202x
Draft 32.

Only a No_Implementation_Restrictions restriction, which is specific to
GNAT, is affected.

Cleanup related to a new restriction No_Uninitialized_Local_Scalars.

gcc/ada/

* libgnat/s-rident.ads (Implementation_Restriction): Remove
No_Dynamic_Attachment, No_Implementation_Attributes,
No_Implementation_Pragmas, No_Local_Protected_Objects,
No_Protected_Type_Allocators, No_Relative_Delay,
No_Requeue_Statements, No_Select_Statements,
No_Task_Termination, Pure_Barriers and Simple_Barriers; add
No_Dynamic_Sized_Objects,
No_Implicit_Protected_Object_Allocations,
No_Implicit_Task_Allocations, No_Task_At_Interrupt_Priority and
Static_Dispatch_Tables; sort alphabetically.
* restrict.ads (Restriction_Id): Change Pure_Barriers and
No_Task_Termination from GNAT to Ada restrictions.

2 years ago[Ada] Fix "S p e c" and "B o d y" file headers
Piotr Trojanek [Tue, 1 Feb 2022 10:40:23 +0000 (11:40 +0100)]
[Ada] Fix "S p e c" and "B o d y" file headers

Fix Spec/Body headers in .adb/.ads files, respectively; all violations
detected with grep and manually filtered because of .tmpl files.

gcc/ada/

* exp_atag.adb, lib-util.ads, libgnat/g-decstr.adb,
libgnat/g-exptty.adb, libgnat/g-socpol.adb,
libgnat/s-strhas.adb: Fix headers.

2 years ago[Ada] Add SUSE 32bit dependency
Joao Azevedo [Mon, 31 Jan 2022 12:02:42 +0000 (12:02 +0000)]
[Ada] Add SUSE 32bit dependency

On SUSE 15, glibc-locale-base-32bit is needed to run 32bit versions
of Libadalang tools.

gcc/ada/

* doc/gnat_ugn/platform_specific_information.rst: Add
glibc-locale-base-32bit as a dependency in SUSE distributions.
* gnat_ugn.texi: Regenerate.

2 years ago[Ada] Fix formatting glitches in GNAT User's Guide
Piotr Trojanek [Sun, 30 Jan 2022 17:41:16 +0000 (18:41 +0100)]
[Ada] Fix formatting glitches in GNAT User's Guide

Only enhancement of formatting.

gcc/ada/

* doc/gnat_ugn/gnat_and_program_execution.rst,
doc/gnat_ugn/gnat_utility_programs.rst,
doc/gnat_ugn/inline_assembler.rst: Fix typos and formatting
glitches.
* gnat_ugn.texi: Regenerate.

2 years ago[Ada] Use pygments for Ada code examples of elaboration control
Piotr Trojanek [Sun, 30 Jan 2022 17:39:39 +0000 (18:39 +0100)]
[Ada] Use pygments for Ada code examples of elaboration control

Only enhancement of formatting.

gcc/ada/

* doc/gnat_ugn/elaboration_order_handling_in_gnat.rst: Change
blocks from plain code to Ada.

2 years ago[Ada] Excess finalization on assignment with target name symbol
Gary Dismukes [Fri, 28 Jan 2022 01:17:03 +0000 (20:17 -0500)]
[Ada] Excess finalization on assignment with target name symbol

In cases where the Ada 2022 feature of target name symbols (@) is used
and the evaluation of the name is side-effect free, the compiler creates
a temporary object to hold the value of the target object for use as
the value of "@" symbols in the right-hand side expression. In the case
where the target's type is controlled, or has controlled subcomponents,
this can result in extra finalization calls (for the temporary object).
The correction is to bypass the use of a temp and fall back on the more
general approach of creating and calling a procedure with an in-out
parameter for performing the assignment.

gcc/ada/

* exp_ch5.adb (Expand_Assign_With_Target_Names): Bypass the temp
object approach in the case where the type of the LHS is
controlled or has controlled subcomponents (Needs_Finalization
is True), and use the procedure approach instead.

2 years ago[Ada] fix crash on Secondary_Stack_Size with discriminant
Bob Duff [Fri, 28 Jan 2022 19:40:27 +0000 (14:40 -0500)]
[Ada] fix crash on Secondary_Stack_Size with discriminant

This patch fixes a crash caused by specifying the Secondary_Stack_Size
aspect of a task type as the value of a discriminant of the task type,
and then declaring a record component whose type is the task type,
constrained to a discriminant of the record.

gcc/ada/

* sem_ch3.adb (Get_Discr_Value): Copy the result. Otherwise, the
"tree" can be malformed (a DAG, not a tree) because
Get_Discr_Value could be returning some subtree already attached
to the tree.

2 years ago[Ada] Reset Reachable field when mutating label into loop entity
Piotr Trojanek [Fri, 28 Jan 2022 17:12:18 +0000 (18:12 +0100)]
[Ada] Reset Reachable field when mutating label into loop entity

An entity flag Reachable now only applies to E_Label entities and needs
to be explicitly reset when mutating labels into loop entities. Only
needed to prevent cascaded errors when compiling a malicious ACATS test
with -gnatq (try semantics, even if parse errors).

Cleanup related to detection of uninitialized scalars with GOTO
statements.

gcc/ada/

* sem_ch5.adb (Analyze_Statements): Only clear Reachable flag on
proper label entities.

2 years ago[Ada] Fix layout of tables in PDF version of GNAT RM
Piotr Trojanek [Fri, 28 Jan 2022 15:02:43 +0000 (16:02 +0100)]
[Ada] Fix layout of tables in PDF version of GNAT RM

Tables with small left columns and large right columns had colliding
text in the PDF version of GNAT RM.

Spotted while adding description of pragma Ada_2022.

gcc/ada/

* doc/gnat_rm/implementation_defined_characteristics.rst: Add
tabularcolums directive, as explained in documentation of Sphinx
and tabular LaTeX package.

2 years ago[Ada] Fix layout in description of aspects and pragmas
Piotr Trojanek [Fri, 28 Jan 2022 14:27:47 +0000 (15:27 +0100)]
[Ada] Fix layout in description of aspects and pragmas

Remove extra whitespace in examples of pragmas and aspects.

Spotted while adding description of pragma Ada_2022.

gcc/ada/

* doc/gnat_rm/implementation_defined_aspects.rst,
doc/gnat_rm/implementation_defined_pragmas.rst: Remove extra
whitespace.
* gnat_rm.texi: Regenerate.

2 years ago[Ada] Fix markup in description of implementation-defined characteristics
Piotr Trojanek [Fri, 28 Jan 2022 14:02:11 +0000 (15:02 +0100)]
[Ada] Fix markup in description of implementation-defined characteristics

Fix formatting of description lists, i.e. continuation lines are now
indented like their preceding lines.

Spotted while adding description of pragma Ada_2022.

gcc/ada/

* doc/gnat_rm/implementation_defined_characteristics.rst: Remove
extra indent in continuation lines; indent both descriptions of
Max_Picture_Length.
* gnat_rm.texi: Regenerate.

2 years ago[Ada] Fix markup in description of pragma Eliminate
Piotr Trojanek [Fri, 28 Jan 2022 13:16:09 +0000 (14:16 +0100)]
[Ada] Fix markup in description of pragma Eliminate

Fix formatting of a nested bullet lists. Spotted while adding
description of pragma Ada_2022.

gcc/ada/

* doc/gnat_rm/implementation_defined_pragmas.rst (Pragma
Eliminate): Fix markup.
* gnat_rm.texi: Regenerate.

2 years ago[Ada] Suppress warning in g-sthcso for non-unix platforms
Johannes Kliemann [Fri, 28 Jan 2022 14:54:21 +0000 (14:54 +0000)]
[Ada] Suppress warning in g-sthcso for non-unix platforms

gcc/ada/

* libgnat/g-sthcso.adb: Suppress warning about unneeded use type
clause.

2 years ago[Ada] Add guard for making only legal labels unreachable
Piotr Trojanek [Fri, 28 Jan 2022 09:24:04 +0000 (10:24 +0100)]
[Ada] Add guard for making only legal labels unreachable

An entity flag Reachable now only applies to E_Label entities. We had an
appropriate guard for setting this flag, but not for clearing.

Cleanup related to detection of uninitialized scalars with GOTO
statements.

gcc/ada/

* sem_ch5.adb (Analyze_Statements): Only clear Reachable flag on
proper label entities.

2 years ago[Ada] Document pragma Ada_2022
Piotr Trojanek [Thu, 27 Jan 2022 21:03:58 +0000 (22:03 +0100)]
[Ada] Document pragma Ada_2022

Pragma Ada_2022 is similar to existing pragma Ada_2012 and similarly
deserves to be documented.

gcc/ada/

* doc/gnat_rm/implementation_defined_pragmas.rst (Pragma
Ada_2022): Copy description from pragma Ada 2012 and adapt.
* doc/gnat_ugn/the_gnat_compilation_model.rst (Configuration
Pragmas): List pragma Ada 2022.
* gnat_rm.texi, gnat_ugn.texi: Regenerate.

2 years ago[Ada] Properly reject unsupported address specifications
Steve Baird [Tue, 25 Jan 2022 00:46:58 +0000 (16:46 -0800)]
[Ada] Properly reject unsupported address specifications

In the case of an object declaration with an indefinite nominal subtype
(roughly speaking, that's an object that takes its bounds,
discriminants, and/or tag from its explicit initial value), GNAT does
not support address specifications unless the size of the object is
known at compile time.  In some cases, such unsupported address
specifications were not properly rejected. This could lead to either an
internal error during compilation or (in the class-wide case) to a
warning accompanied by raising Program_Error at run time.

gcc/ada/

* sem_ch13.adb (Analyze_Attribute_Definition_Clause): Replace
the existing check for an address specification for an object of
a class-wide type with a more general check which rejects either
the class-wide case or the case where the FE would (if the
address specification were accepted) build a malformed
tree (specifically, an object renaming declaration with a
specified address). In the case where the check fails, reject
the construct at compile time instead of generating an
unconditional raise of Program_Error.
* doc/gnat_rm/representation_clauses_and_pragmas.rst: Update
documentation to reflect these changes.
* gnat_rm.texi: Regenerate.

2 years ago[Ada] Move Reachable flag to E_Label entities
Piotr Trojanek [Thu, 27 Jan 2022 11:59:58 +0000 (12:59 +0100)]
[Ada] Move Reachable flag to E_Label entities

An entity flag Reachable is described as "defined in labels". It is only
read and written for entities of kind E_Label (the code has necessary
guards for that). There no need for this flag to be specified for all
entities in the generated AST.

Cleanup related to detection of uninitialized scalars with GOTO
statements.

gcc/ada/

* gen_il-gen-gen_entities.adb (Reachable): Move from
Root_Entity_Type to E_Label.

2 years ago[Ada] Set_Is_Known_Valid only if Safe_To_Capture_Value
Alexandre Oliva [Wed, 29 Dec 2021 07:10:45 +0000 (04:10 -0300)]
[Ada] Set_Is_Known_Valid only if Safe_To_Capture_Value

Library-level variables with initializers could have Is_Known_Valid
set when analyzing their definition, and the flag would only be
cleared when analyzing a statement that assigned to them. Procedures
and functions analyzed before the flag got cleared could skip validity
checking for the corresponding variable. This patch fixes this
problem: we no longer set Is_Known_Valid when analyzing initializers
of library-level variables,and use the same Safe_To_Capture_Value
predicate that prevents assignments from recording known-valid states.

This causes any variable with an initialization value, that would have
had its initializer value used as its known constant value if the use
is analyzed before any assignment to the variable, to no longer be
regarded as holding a constant value. Some might turn out to have a
constant value, after all, but we don't know that yet: we can only
tell after analyzing every subprogram that could possibly assign to
it. At the points where Safe_To_Capture_Value calls are introduced,
Never_Set_In_Source does not yet hold its final value.

gcc/ada/

* exp_ch3.adb (Expand_N_Object_Declaration): Guard
Set_Is_Known_Valid with Safe_To_Capture_Value.

2 years ago[Ada] Avoid crash for -gnatR -gnatc
Bob Duff [Thu, 27 Jan 2022 16:13:41 +0000 (11:13 -0500)]
[Ada] Avoid crash for -gnatR -gnatc

If the -gnatR -gnatc are both given, then the compiler crashes.  This
patch fixes that, and avoids printing the uncomputed sizes and
alignments that were causing the crash. (Previous versions of the
compiler printed incorrect values in such cases.)

gcc/ada/

* repinfo.adb (List_Object_Info): Do not try to print values
that have not been computed (and so are No_Uint).
(Rep_Not_Constant): Reverse sense and change name to
Compile_Time_Known_Rep. This makes the code at call sites a
little more readable. Simplify code to a single return
statement.

2 years agobootstrap/105551 - restore nvptx build
Richard Biener [Wed, 11 May 2022 08:47:34 +0000 (10:47 +0200)]
bootstrap/105551 - restore nvptx build

The following makes sure to disable var-tracking if only
dwarf2-line debuginfo is present.

2022-05-11  Richard Biener  <rguenther@suse.de>

PR bootstrap/105551
* opts.cc (finish_options): Also disable var-tracking if
!DWARF2_DEBUGGING_INFO.

2 years agoOptimize movzwl + vmovd/vmovq to vmovw.
liuhongt [Tue, 29 Mar 2022 01:21:21 +0000 (09:21 +0800)]
Optimize movzwl + vmovd/vmovq to vmovw.

Similarly optimize movl + vmovq to vmovd.

gcc/ChangeLog:

PR target/104915
* config/i386/sse.md (*vec_set<mode>_0_zero_extendhi): New
pre_reload define_insn_and_split.
(*vec_setv2di_0_zero_extendhi_1): Ditto.
(*vec_set<mode>_0_zero_extendsi): Ditto.
(*vec_setv2di_0_zero_extendsi_1): Ditto.
(ssewvecmode): New mode attr.
(ssewvecmodelower): Ditto.
(ssepackmodelower): Ditto.

gcc/testsuite/ChangeLog:

* gcc.target/i386/pr104915-vmovd.c: New test.
* gcc.target/i386/pr104915-vmovw.c: New test.

2 years agors6000: Fix constraint v with rs6000_constraints[RS6000_CONSTRAINT_v]
Kewen Lin [Wed, 11 May 2022 06:18:30 +0000 (01:18 -0500)]
rs6000: Fix constraint v with rs6000_constraints[RS6000_CONSTRAINT_v]

Currently we hardcode ALTIVEC_REGS for register constraint v and
RS6000_CONSTRAINT_v looks confusing, this is to fix it with
rs6000_constraints[RS6000_CONSTRAINT_v] to align with some other
existing register constraints with RS6000_CONSTRAINT_*.

gcc/ChangeLog:

* config/rs6000/constraints.md (register constraint v): Use
rs6000_constraints[RS6000_CONSTRAINT_v] instead of ALTIVEC_REGS.

2 years agoopts: do not allow Separate+Joined ending with =
Martin Liska [Tue, 26 Apr 2022 09:41:09 +0000 (11:41 +0200)]
opts: do not allow Separate+Joined ending with =

Do not allow strange option format:
-msmall-data-limit= 11.

For -output-pch we need to use Separate syntax as lang spec
rules automatically append a space.

PR target/105355

gcc/ChangeLog:

* config/riscv/riscv.opt: Remove Separate from
-msmall-data-limit=.
* optc-gen.awk: Report error for the described situation.
* gcc.cc: Use Separate syntax.
* opts.cc (gen_command_line_string): Change option name.

gcc/c-family/ChangeLog:

* c-opts.cc (c_common_handle_option): Change option name.
* c.opt: Remove Joined and use Separate option.

gcc/cp/ChangeLog:

* lang-specs.h: Use Separate syntax.

gcc/objc/ChangeLog:

* lang-specs.h: Use Separate syntax.

gcc/objcp/ChangeLog:

* lang-specs.h: Use Separate syntax.

2 years agoMAINTAINERS: Remove myself from DCO section
Kewen Lin [Wed, 11 May 2022 03:18:24 +0000 (22:18 -0500)]
MAINTAINERS: Remove myself from DCO section

ChangeLog:

* MAINTAINERS: Remove myself from DCO section.

2 years agoThis patch skips constant folding for fmin/max when either argument is sNaN. Accordin...
Haochen Gui [Mon, 9 May 2022 09:34:23 +0000 (17:34 +0800)]
This patch skips constant folding for fmin/max when either argument is sNaN. According to C standard, fmin(sNaN, sNaN)= qNaN, fmin(sNaN, NaN) = qNaN.

gcc/
PR target/105414
* match.pd (minmax): Skip constant folding for fmin/fmax when both
arguments are sNaN or one is sNaN and another is NaN.

gcc/testsuite/
PR target/105414
* gcc.dg/pr105414.c: New.

2 years agoDaily bump.
GCC Administrator [Wed, 11 May 2022 00:16:40 +0000 (00:16 +0000)]
Daily bump.

2 years agoUpdate gcc hr.po
Joseph Myers [Tue, 10 May 2022 20:22:22 +0000 (20:22 +0000)]
Update gcc hr.po

* hr.po: Update.

2 years agoFortran: check TEAM arguments to coarray intrinsics
Harald Anlauf [Mon, 9 May 2022 20:14:21 +0000 (22:14 +0200)]
Fortran: check TEAM arguments to coarray intrinsics

TEAM arguments to coarray intrinsics must be scalar expressions of type
TEAM_TYPE of intrinsic module ISO_FORTRAN_ENV.

gcc/fortran/ChangeLog:

PR fortran/105526
* resolve.cc (check_team): New.
(gfc_resolve_code): Add checks for arguments to coarray intrinsics
FORM TEAM, CHANGE TEAM, and SYNC TEAM.

gcc/testsuite/ChangeLog:

PR fortran/105526
* gfortran.dg/coarray_50.f90: New test.

2 years agox86: Add .note.GNU-stack section only for Linux
H.J. Lu [Fri, 6 May 2022 17:55:53 +0000 (10:55 -0700)]
x86: Add .note.GNU-stack section only for Linux

Add .note.GNU-stack section only for Linux since it may not be supported
on non-Linux OSes.  __ELF__ isn't checked since these tests can only run
on Linux/x86 ELF systems.

PR target/105472
* gcc.target/i386/iamcu/asm-support.S: Add .note.GNU-stack section
only for Linux.
* gcc.target/x86_64/abi/asm-support.S: Likewise.
* gcc.target/x86_64/abi/avx/asm-support.S: Likewise.
* gcc.target/x86_64/abi/avx512f/asm-support.S: Likewise.
* gcc.target/x86_64/abi/avx512fp16/asm-support.S: Likewise.
* gcc.target/x86_64/abi/avx512fp16/m256h/asm-support.S: Likewise.
* gcc.target/x86_64/abi/avx512fp16/m512h/asm-support.S: Likewise.
* gcc.target/x86_64/abi/ms-sysv/do-test.S: Likewise.

2 years agoisel: Fix up gimple_expand_vec_set_expr [PR105528]
Jakub Jelinek [Tue, 10 May 2022 16:34:08 +0000 (18:34 +0200)]
isel: Fix up gimple_expand_vec_set_expr [PR105528]

The following testcase ICEs (and only without -g), because we don't replace
one VEC_COND_EXPR with .VCOND* call.
We don't do that because gimple_expand_vec_set_expr adds some stmts before
*gsi and then uses gsi_remove to remove it.  gsi_remove moves the iterator
to the next stmt and in the caller we then do gsi_next before looking at
another stmt, which means we can skip processing of one stmt, which in this
case happened to be a VEC_COND_EXPR but with -g is some debug stmt in
between.  As we always emit some stmts before it, it is easy to update the
iterator to the last stmt emitted there, so that caller continues really
with the next stmt.

2022-05-10  Jakub Jelinek  <jakub@redhat.com>

PR tree-optimization/105528
* gimple-isel.cc (gimple_expand_vec_set_expr): After gsi_remove
set *gsi to gsi_for_stmt (ass_stmt).  Fix up function comment.

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

2 years agodoc: Fix mode iterator example
Segher Boessenkool [Tue, 10 May 2022 16:00:05 +0000 (16:00 +0000)]
doc: Fix mode iterator example

The example missed the mode condition in the replacement text.

2022-05-10  Segher Boessenkool  <segher@kernel.crashing.org>

* doc/md.texi (Defining Mode Iterators): Correct example replacement
text.

2 years agoc++: Remove SET_PACK_EXPANSION_PATTERN / SET_ARGUMENT_PACK_ARGS
Patrick Palka [Tue, 10 May 2022 15:52:29 +0000 (11:52 -0400)]
c++: Remove SET_PACK_EXPANSION_PATTERN / SET_ARGUMENT_PACK_ARGS

Unlike in C, in C++ the conditional operator yields an lvalue if both
branches are lvalues, so these setter macros are unnecessary; we can
just assign to PACK_EXPANSION_PATTERN and ARGUMENT_PACK_ARGS directly.

gcc/cp/ChangeLog:

* coroutines.cc (instantiate_coro_traits): Adjust accordingly.
* cp-tree.def: Remove mention of SET_PACK_EXPANSION_PATTERN.
* cp-tree.h (SET_PACK_EXPANSION_PATTERN): Remove.
(SET_ARGUMENT_PACK_ARGS): Remove.
* module.cc (trees_in::tree_node): Adjust accordingly.
* parser.cc (make_char_string_pack): Likewise.
(make_string_pack): Likewise.
* pt.cc (make_pack_expansion): Likewise.
(template_parm_to_arg): Likewise.
(coerce_template_parameter_pack): Likewise.
(extract_fnparm_pack): Likewise.
(extract_locals_r): Likewise.
(make_argument_pack): Likewise.
(tsubst_argument_pack): Likewise.
(lookup_init_capture_pack): Likewise.
(type_unification_real): Likewise.
(unify_pack_expansion): Likewise.
(tsubst_initializer_list): Likewise.

2 years agoc++: Harden *_PACK_EXPANSION and *_ARGUMENT_PACK macros
Patrick Palka [Tue, 10 May 2022 15:52:21 +0000 (11:52 -0400)]
c++: Harden *_PACK_EXPANSION and *_ARGUMENT_PACK macros

This makes the accessor macros for TYPE_/EXPR_PACK_EXPANSION
and TYPE_/NONTYPE_ARGUMENT_PACK check the tree code of the argument.

gcc/cp/ChangeLog:

* cp-tree.h (PACK_EXPANSION_CHECK): Define.
(PACK_EXPANSION_PATTERN): Use PACK_EXPANSION_CHECK.
(SET_PACK_EXPANSION_PATTERN): Likewise.
(PACK_EXPANSION_PARAMETER_PACKS): Likewise.
(PACK_EXPANSION_EXTRA_ARGS): Likewise.
(PACK_EXPANSION_LOCAL_P): Likewise.
(PACK_EXPANSION_SIZEOF_P): Likewise.
(PACK_EXPANSION_AUTO_P): Likewise.
(PACK_EXPANSION_FORCE_EXTRA_ARGS_P): Likewise.
(ARGUMENT_PACK_CHECK): Define.
(ARGUMENT_PACK_ARGS): Use ARGUMENT_PACK_CHECK.
(SET_ARGUMENT_PACK_ARGS): Likewise.
* parser.cc (cp_parser_sizeof_pack): Check for error_mark_node
before setting PACK_EXPANSION_SIZEOF_P.

2 years agolibstdc++: Add <spanstream> declarations to <iosfwd> [PR105284]
Jonathan Wakely [Tue, 10 May 2022 12:06:47 +0000 (13:06 +0100)]
libstdc++: Add <spanstream> declarations to <iosfwd> [PR105284]

libstdc++-v3/ChangeLog:

PR libstdc++/105284
* include/std/iosfwd: Add declarations for <spanstream> class
templates and typedefs.
* include/std/spanstream (basic_spanbuf, basic_ispanstream)
(basic_ospanstream, basic_spanstream): Remove default template
arguments.
* testsuite/27_io/headers/iosfwd/synopsis.cc: Add <spanstream>
declarations.
* testsuite/27_io/headers/iosfwd/types.cc: Check <spanstream>
default arguments.

2 years agolibstdc++: Add <syncstream> declarations to <iosfwd> [PR105284]
Jonathan Wakely [Tue, 10 May 2022 12:03:14 +0000 (13:03 +0100)]
libstdc++: Add <syncstream> declarations to <iosfwd> [PR105284]

libstdc++-v3/ChangeLog:

PR libstdc++/105284
* include/std/iosfwd: Add declarations for <synstream> class
templates and typedefs.
* include/std/syncstream (basic_syncbuf, basic_osyncstream):
Remove default template arguments.
* testsuite/27_io/headers/iosfwd/synopsis.cc: New test.
* testsuite/27_io/headers/iosfwd/types.cc: New test.

2 years agolibiberty: fix wrong replacent in comments
Martin Liska [Tue, 10 May 2022 15:36:28 +0000 (17:36 +0200)]
libiberty: fix wrong replacent in comments

libiberty/ChangeLog:

* regex.c: Restore comments.

2 years agolibiberty: fix type in allocation
Martin Liska [Tue, 10 May 2022 15:31:24 +0000 (17:31 +0200)]
libiberty: fix type in allocation

The allocation function alloc_f is called for nsize
items where each is of type void *.

libiberty/ChangeLog:

* hashtab.c (htab_empty): Use void * type instead of void **.
(htab_expand): Likewise.

Co-Authored-By: Alan Modra <amodra@gmail.com>
2 years agolibiberty: fix bad replacement.
Martin Liska [Tue, 10 May 2022 15:00:34 +0000 (17:00 +0200)]
libiberty: fix bad replacement.

libiberty/ChangeLog:

* random.c: Remove 'define PTR'.

2 years agoRemove non-ANSI C macros in ansidecl.h.
Martin Liska [Tue, 10 May 2022 07:47:08 +0000 (09:47 +0200)]
Remove non-ANSI C macros in ansidecl.h.

include/ChangeLog:

* ansidecl.h (PTR): Remove.
(const): Likewise.
(volatile): Likewise.
(signed): Likewise.

2 years agolibiberty: stop using PTR macro
Martin Liska [Tue, 10 May 2022 14:00:53 +0000 (16:00 +0200)]
libiberty: stop using PTR macro

include/ChangeLog:

* hashtab.h (HTAB_EMPTY_ENTRY): Use void * instead PTR.
(HTAB_DELETED_ENTRY): Likewise.

libiberty/ChangeLog:

* alloca.c (C_alloca): Use void * instead PTR.
* calloc.c (malloc): Likewise.
(bzero): Likewise.
(calloc): Likewise.
* hashtab.c (find_empty_slot_for_expand): Likewise.
(eq_pointer): Likewise.
(htab_create_alloc_ex): Likewise.
(htab_create_typed_alloc): Likewise.
(htab_set_functions_ex): Likewise.
(htab_delete): Likewise.
(htab_empty): Likewise.
(htab_expand): Likewise.
(htab_find_with_hash): Likewise.
(htab_find): Likewise.
(htab_find_slot_with_hash): Likewise.
(htab_find_slot): Likewise.
(htab_remove_elt): Likewise.
(htab_remove_elt_with_hash): Likewise.
(htab_clear_slot): Likewise.
(htab_traverse_noresize): Likewise.
(htab_traverse): Likewise.
(htab_hash_string): Likewise.
(iterative_hash): Likewise.
(hash_pointer): Likewise.
* memchr.c (memchr): Likewise.
* memcmp.c (memcmp): Likewise.
* memcpy.c (memcpy): Likewise.
* memmove.c (memmove): Likewise.
* mempcpy.c (memcpy): Likewise.
(mempcpy): Likewise.
* memset.c (memset): Likewise.
* objalloc.c (malloc): Likewise.
(free): Likewise.
(objalloc_create): Likewise.
(_objalloc_alloc): Likewise.
(objalloc_free_block): Likewise.
* random.c (PTR): Likewise.
(void): Likewise.
(initstate): Likewise.
(setstate): Likewise.
* regex.c: Likewise.
* spaces.c (malloc): Likewise.
(free): Likewise.
* stpcpy.c (memcpy): Likewise.
* strdup.c (malloc): Likewise.
(memcpy): Likewise.
* strerror.c (malloc): Likewise.
(memset): Likewise.
* strndup.c (malloc): Likewise.
(memcpy): Likewise.
* strsignal.c (malloc): Likewise.
(memset): Likewise.
* vasprintf.c (malloc): Likewise.
* vprintf-support.c: Likewise.
* xatexit.c (malloc): Likewise.
* xmalloc.c (xmalloc): Likewise.
(xcalloc): Likewise.
(xrealloc): Likewise.
* xmemdup.c (xmemdup): Likewise.

2 years agoRISC-V: Provide `fmin'/`fmax' RTL patterns
Maciej W. Rozycki [Tue, 10 May 2022 14:02:31 +0000 (15:02 +0100)]
RISC-V: Provide `fmin'/`fmax' RTL patterns

As at r2.2 of the RISC-V ISA specification[1] (equivalent to version 2.0
of the "F" and "D" standard architecture extensions for single-precision
and double-precision floating-point respectively) the FMIN and FMAX
machine instructions fully match our requirement for the `fminM3' and
`fmaxM3' standard RTL patterns:

"For FMIN and FMAX, if at least one input is a signaling NaN, or if both
inputs are quiet NaNs, the result is the canonical NaN.  If one operand
is a quiet NaN and the other is not a NaN, the result is the non-NaN
operand."

suitably for the IEEE 754-2008 `minNum' and `maxNum' operations.

However we only define `sminM3' and `smaxM3' standard RTL patterns to
produce the FMIN and FMAX machine instructions, which in turn causes the
`__builtin_fmin' and `__builtin_fmax' family of intrinsics to emit the
corresponding libcalls rather than the relevant machine instructions.
This is according to earlier revisions of the RISC-V ISA specification,
which we however do not support anymore, as from commit 4b81528241ca
("RISC-V: Support version controling for ISA standard extensions").

As from r20190608 of the RISC-V ISA specification (equivalent to version
2.2 of the "F" and "D" standard ISA extensions for single-precision and
double-precision floating-point respectively) the definition of the FMIN
and FMAX machine instructions has been updated[2]:

"Defined the signed-zero behavior of FMIN.fmt and FMAX.fmt, and changed
their behavior on signaling-NaN inputs to conform to the minimumNumber
and maximumNumber operations in the proposed IEEE 754-201x
specification."

and specifically[3]:

"Floating-point minimum-number and maximum-number instructions FMIN.S
and FMAX.S write, respectively, the smaller or larger of rs1 and rs2 to
rd.  For the purposes of these instructions only, the value -0.0 is
considered to be less than the value +0.0.  If both inputs are NaNs, the
result is the canonical NaN.  If only one operand is a NaN, the result
is the non-NaN operand.  Signaling NaN inputs set the invalid operation
exception flag, even when the result is not NaN."

Consequently for forwards compatibility with r20190608+ hardware we
cannot use the FMIN and FMAX machine instructions unconditionally even
where the ISA level of r2.2 has been specified with the `-misa-spec=2.2'
option where operation would be different between ISA revisions, that
is the handling of signaling NaN inputs.

Therefore provide new `fmin<mode>3' and `fmax<mode>3' patterns removing
the need to emit libcalls with the `__builtin_fmin' and `__builtin_fmax'
family of intrinsics, however limit them to where `-fno-signaling-nans'
is in effect, deferring to other code generation strategies otherwise as
applicable.  Use newly-defined UNSPECs as the operation codes so that
the patterns are only ever used if referred to by their names, as there
is no RTL expression defined for the IEEE 754-2008 `minNum' and `maxNum'
operations.

References:

[1] "The RISC-V Instruction Set Manual, Volume I: User-Level ISA",
    Document Version 2.2, May 7, 2017, Section 8.3 "NaN Generation and
    Propagation", p. 48

[1] "The RISC-V Instruction Set Manual, Volume I: Unprivileged ISA",
    Document Version 20190608-Base-Ratified, June 8, 2019, "Preface",
    p. ii

[2] same, Section 11.6 "Single-Precision Floating-Point Computational
    Instructions", p. 66

gcc/
* config/riscv/riscv.md (UNSPEC_FMIN, UNSPEC_FMAX): New
constants.
(fmin<mode>3, fmax<mode>3): New insns.

gcc/testsuite/
* gcc.target/riscv/fmax-snan.c: New test.
* gcc.target/riscv/fmax.c: New test.
* gcc.target/riscv/fmaxf-snan.c: New test.
* gcc.target/riscv/fmaxf.c: New test.
* gcc.target/riscv/fmin-snan.c: New test.
* gcc.target/riscv/fmin.c: New test.
* gcc.target/riscv/fminf-snan.c: New test.
* gcc.target/riscv/fminf.c: New test.
* gcc.target/riscv/smax-ieee.c: New test.
* gcc.target/riscv/smax.c: New test.
* gcc.target/riscv/smaxf-ieee.c: New test.
* gcc.target/riscv/smaxf.c: New test.
* gcc.target/riscv/smin-ieee.c: New test.
* gcc.target/riscv/smin.c: New test.
* gcc.target/riscv/sminf-ieee.c: New test.
* gcc.target/riscv/sminf.c: New test.

2 years agoUse gimple-match folding in fold_build_cond_expr
Richard Biener [Tue, 10 May 2022 13:39:46 +0000 (15:39 +0200)]
Use gimple-match folding in fold_build_cond_expr

The following cleans up if-conversions fold_build_cond_expr to
use gimple-match folding instead of GENERIC folding.

2022-05-10  Richard Biener  <rguenther@suse.de>

* tree-if-conv.cc (fold_build_cond_expr): Use
match-and-simplify to simplify the condition.
(ifcvt_follow_ssa_use_edges): Remove.
(predicate_scalar_phi): Use follow_all_ssa_edges.

2 years agoMake 'c-c++-common/goacc/kernels-decompose-pr100400-1-*.c' behave consistently, regar...
Thomas Schwinge [Mon, 2 May 2022 13:15:26 +0000 (15:15 +0200)]
Make 'c-c++-common/goacc/kernels-decompose-pr100400-1-*.c' behave consistently, regardless of checking level

Fix-up for commit c14ea6a72fb1ae66e3d32ac8329558497c6e4403
"Catch 'GIMPLE_DEBUG' misbehavior in OpenACC 'kernels' decomposition
[PR100400, PR103836, PR104061]".

For C++ compilation of 'c-c++-common/goacc/kernels-decompose-pr100400-1-2.c',
we first emit a 'sorry' diagnostic, and then a 'gcc_unreachable' (or
'internal_error', see below) diagnostic, but for example, for
'--enable-checking=release' (thus, '!CHECKING_P'), the second one may actually
be turned into a 'confused by earlier errors, bailing out' diagnostic.  (See
'gcc/diagnostic.cc:diagnostic_report_diagnostic': "When not checking, ICEs are
converted to fatal errors when an error has already occurred.")  Thus, make
'c-c++-common/goacc/kernels-decompose-pr100400-1-2.c' behave consistently via
'-Wfatal-errors', and thus only matching the 'sorry' diagnostic.

For example, for '--enable-checking=no' (thus, '!ENABLE_ASSERT_CHECKING'), a
call to 'gcc_unreachable' cannot be assumed emit an 'internal_error'-like
diagnostic, so explicitly call 'internal_error' in
'gcc/omp-oacc-kernels-decompose.cc:visit_loops_in_gang_single_region', in the
'GIMPLE_OMP_FOR' case, to avoid regressing
'c-c++-common/goacc/kernels-decompose-pr100400-1-3.c', and
'c-c++-common/goacc/kernels-decompose-pr100400-1-4.c'.

PR middle-end/100400
gcc/
* omp-oacc-kernels-decompose.cc
(visit_loops_in_gang_single_region) <GIMPLE_OMP_FOR>: Explicitly
call 'internal_error'.
gcc/testsuite/
* c-c++-common/goacc/kernels-decompose-pr100400-1-2.c: Specify
'-Wfatal-errors'.

2 years agoFix up 'libgomp.fortran/use_device_addr-5.f90' multi-device testing
Thomas Schwinge [Tue, 10 May 2022 12:43:56 +0000 (14:43 +0200)]
Fix up 'libgomp.fortran/use_device_addr-5.f90' multi-device testing

Fix-up for recent commit r13-116-g3f8c389fe90bf565a6221a46bb7fb745dd4c1510
"OpenMP: Fix use_device_{addr,ptr} with in-data-sharing arg", where we
currently get:

    libgomp: use_device_ptr pointer wasn't mapped
    FAIL: libgomp.fortran/use_device_addr-5.f90   -O  execution test

libgomp/
* testsuite/libgomp.fortran/use_device_addr-5.f90: Fix up
multi-device testing.

2 years ago[c++] Disambiguate ModuleKind flags
Nathan Sidwell [Mon, 9 May 2022 11:40:43 +0000 (04:40 -0700)]
[c++] Disambiguate ModuleKind flags

In modules, 'attached to global module' nearly always means 'not in
module purview'.  Also the implementation treats, 'in global module &&
in module purview' as meaning 'header unit'.  The ModuleKind flags
reflected that.  The 'nearly always' means there are cases that the
first condition is not invariant, and that of course invalidates the
second equivalence.

This disambiguates the ModuleKind flags to allow that 'not quite', and
separate out header-unitness from the GMF & purview flags combination.

1) Separate out named-module vs header-unit from the MODULE/GLOBAL flags.

2) Replace the MODULE/GLOBAL flags with PURVIEW & ATTACH flags.

3) Adjust the parser state handling.

Lays ground-work for language-declaration changes.

gcc/cp/
* cp-tree.h (enum module_kind_bits): Disambiguate purview,
attach, named module vs header-unit.
(global_purview_p, not_module_p): Delete.
(named_module_p): New.
(header_module_p, module_purview_p): Adjust.
(module_attach_p, named_module_purview_p): New.
* decl.cc (duplicate_decls): Adjust.
* module.cc (declare_module, preprocessed_module): Adjust.
* name-lookup.cc (init_global_partition): Adjust.
(get_fixed_binding_slot, pushdecl): Adjust.
* parser.cc (cp_parser_module_declaration): Adjust.
(cp_parser_import_declaration, cp_parser_declaration): Adjust.

2 years agomiddle-end/105537 - debug processing
Richard Biener [Tue, 10 May 2022 09:44:40 +0000 (11:44 +0200)]
middle-end/105537 - debug processing

The following makes sure to have a consistent state of
flag_var_tracking_assignments with the distributed handling
in process_options and finish_options by moving everything to
finish_options which also restores diagnostics for
-g0 -fvar-tracking which was lost with previous changes.

2022-05-10  Richard Biener  <rguenther@suse.de>

PR middle-end/105537
* toplev.cc (process_options): Move flag_var_tracking
handling ...
* opts.cc (finish_options): ... here.

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

2 years agolibgcov: use proper type for n_functions
Martin Liska [Tue, 10 May 2022 08:52:19 +0000 (10:52 +0200)]
libgcov: use proper type for n_functions

gcov_info::n_functions type is initialized by generated
code in build_info_type:

/* n_functions */
field = build_decl (BUILTINS_LOCATION, FIELD_DECL, NULL_TREE,
    get_gcov_unsigned_t ());

It uses gcov_unsigned_t, but the struct definition in libgcov.h uses
unsigned type. That brings troubled on 16-bit targets.

PR gcov-profile/105535

libgcc/ChangeLog:

* libgcov.h (struct gcov_info): Use gcov_unsigned_t for
n_functions.

Co-Authored-By: Hans-Peter Helfert <peter-helfert@t-online.de>
2 years agoReplace PTR with 'void *' in compiler.
Martin Liska [Tue, 10 May 2022 07:45:16 +0000 (09:45 +0200)]
Replace PTR with 'void *' in compiler.

gcc/ada/ChangeLog:

* gcc-interface/decl.cc (compare_field_bitpos): Use void *
instead PTR.
* gcc-interface/utils2.cc (compare_elmt_bitpos): Likewise.

gcc/ChangeLog:

* basic-block.h (struct basic_block_d): Use void *
instead PTR.
* cfgloop.h: Likewise.
* cgraph.h: Likewise.
* gengtype-state.cc (state_ident_by_name): Likewise.
(record_type): Likewise.
(read_state_already_seen_type): Likewise.
* gengtype.cc (dump_type): Likewise.
(input_file_by_name): Likewise.
(main): Likewise.
* ggc-common.cc (ggc_cleared_alloc_ptr_array_two_args): Likewise.
* ipa-utils.h (struct ipa_dfs_info): Likewise.
* plugin.cc (htab_hash_plugin): Likewise.

2 years agoProperly use opts in finish_options
Richard Biener [Tue, 10 May 2022 07:47:06 +0000 (09:47 +0200)]
Properly use opts in finish_options

When code was moved from process_options to finish_options it
was not properly adjusted to look at and alter the opts set
passed to the function but continued to modify the global options
set.  The following rectifies this and makes sure the same
mistake isn't repeated by poisoning global_options{,_set}.

2022-05-10  Richard Biener  <rguenther@suse.de>

* flags.h (dwarf_debuginfo_p): Add opts argument, guard
API with !GENERATOR_FILE.
* opts.cc (global_options): Poison.
(global_options_set): Likewise.
(finish_options): Refer to options via opts.

2 years agoAvoid andb %dil when optimizing for size.
Roger Sayle [Tue, 10 May 2022 08:44:34 +0000 (09:44 +0100)]
Avoid andb %dil when optimizing for size.

The simple test case below has the unfortunate property that on x86_64,
it is larger when compiled with -Os than when compiled with -O2.

int foo(char x)
{
  return (x & 123) != 0;
}

The issue is x86's complex instruction encoding, where andb $XX,%dil
requires more bytes than andl $XX,%edi.  This patch adds logic to
i386.md's *testqi_1_maybe_si and *andqi_2_maybe_si define_insn patterns
to prefer the shorter SImode alternative when optimizing for size.

2022-05-10  Uroš Bizjak  <ubizjak@gmail.com>
    Roger Sayle  <roger@nextmovesoftware.com>

gcc/ChangeLog
* config/i386/i386.md (*testqi_1_maybe_si): Prefer shorter SImode
alternative when optimizing for size and the immediate operand is
const_0_to_127_operand.
(*andqi_2_maybe_si): Likewise.
* config/i386/predicates.md (const_0_to_127_operand): New predicate.

gcc/testsuite/ChangeLog
* gcc.target/i386/and-1.c: New test case.

2 years agoImproved constant folding for scalar evolution.
Roger Sayle [Tue, 10 May 2022 08:38:47 +0000 (09:38 +0100)]
Improved constant folding for scalar evolution.

This patch adds a small (follow-up) optimization to chrec_apply for
linear chrecs to clean-up the final value expressions sometimes generated
by GCC's scalar evolution pass.  The transformation of A+(X-1)*A into
A*X is usually unsafe with respect to overflow (see PR92712), and so
can't be performed by match.pd (or fold-const).  However, during scalar
evolution's evaluation of recurrences it's known that X-1 can't be negative
(in fact X-1 is unsigned even when A is signed), hence this optimization
can be applied.  Interestingly, this expression does get simplified in
later passes once the range of X-1 is bounded by VRP, but that occurs
long after the decision of whether to perform final value replacement,
which is based on the complexity of this expression.

The motivating test case is the optimization of the loop (from comment

int square(int x) {
  int result = 0;
  for (int i = 0; i < x; ++i)
    result += x;
  return result;
}

which is currently optimized, with final value replacement to:

  final value replacement:
   with expr: (int) ((unsigned int) x_3(D) + 4294967295) * x_3(D) + x_3(D)

but with this patch it first gets simplified further:

  final value replacement:
   with expr: x_3(D) * x_3(D)

2022-05-10  Roger Sayle  <roger@nextmovesoftware.com>

gcc/ChangeLog
* tree-chrec.cc (chrec_apply): Attempt to fold the linear chrec
"{a, +, a} (x-1)" as "a*x", as the number of loop iterations, x-1,
can't be negative.

gcc/testsuite/ChangeLog
* gcc.dg/tree-ssa/pr65855-2.c: New test case.

2 years ago[Ada] Export Is_Expression_Function predicate for use in gigi
Eric Botcazou [Thu, 27 Jan 2022 14:12:27 +0000 (15:12 +0100)]
[Ada] Export Is_Expression_Function predicate for use in gigi

gcc/ada/

* fe.h (Is_Expression_Function): Declare.
* sem_util.ads (Is_Expression_Function): Add warning line.

2 years ago[Ada] Optimize nonstandard boolean validity checking
Alexandre Oliva [Wed, 29 Dec 2021 07:10:46 +0000 (04:10 -0300)]
[Ada] Optimize nonstandard boolean validity checking

Validity checking of enumerations with nonstandard representation
starts by checking the value range, then calling _rep_to_pos to verify
that the value itself is valid. The value range check is thus
redundant and inefficient: the _rep_to_pos call is normally inlined
when optimizing for speed and the range check slows down the fast
path; it is unnecesary and undesirable when optimizing for size, and
just unnecessary when not optimizing. This patch thus drops the range
check for nonstandard boolean types.

gcc/ada/

* exp_attr.adb (Expand_N_Attribute_Reference) <Attribute_Valid>:
Drop redundant range check for nonstandard booleans.

2 years ago[Ada] Optimize nonstandard boolean conversions
Alexandre Oliva [Wed, 29 Dec 2021 07:10:46 +0000 (04:10 -0300)]
[Ada] Optimize nonstandard boolean conversions

This patch improves the generated code for nonstandard boolean types.

One of the improvements extends the code that avoids converting back
to the nonstandard boolean type an expression computed as standard
boolean, when it will be converted to a(nother) nonstandard boolean
type.

The other improvement involves using the literal representation
constants in an If_Expression instead of dereferencing the T'Val array
when converting to a (nonstandard) boolean type. Avoiding the array
dereference enables the compiler middle-end to propagate the constants
and perform optimizations based on them, to the point of obviating the
improvement above.

Unfortunately, the code generated with this alternate expansion tends
to be slightly larger if it turns out to not enable any further
optimization, though it's most certainly faster, especially on targets
with conditional moves, more so if "store flag" is slow, as on x86.
Still, the array dereference is more straightforward and shorter, so
I've arranged for this alternate expansion to be used only when
optimizing for speed.

gcc/ada/

* exp_util.adb (Adjust_Result_Type): Leave result in
Standard.Boolean if it's going to be converted to another
boolean type.
* exp_ch4.adb (Expand_N_Type_Conversion): When optimizing,
convert to nonstandard booleans with an if_expression with
boolean literals.

2 years ago[Ada] Handle non-standard booleans in if_expression condition
Alexandre Oliva [Wed, 29 Dec 2021 07:10:45 +0000 (04:10 -0300)]
[Ada] Handle non-standard booleans in if_expression condition

We failed to call Adjust_Condition for the condition expression of an
if_expression, so non-standard booleans were expanded like standard
booleans, disregarding representation clauses. Fixed.

gcc/ada/

* exp_ch4.adb (Expand_N_If_Expression): Call Adjust_Condition to
handle non-standard booleans.

2 years ago[Ada] Incorrect ineffective use type clause warning
Justin Squirek [Fri, 21 Jan 2022 17:09:29 +0000 (17:09 +0000)]
[Ada] Incorrect ineffective use type clause warning

This patch fixes an issue in the compiler whereby a use_type_clause
incorrectly gets flagged as ineffective when the use of it comes after a
generic package instantiation where the installation of private use
clauses are required and one such clause references the same type.

gcc/ada/

* sem_ch8.adb (Use_One_Type): Remove code in charge of setting
Current_Use_Clause when Id is known to be redundant, and modify
the printing of errors associated with redundant use type
clauses so that line number gets included in more cases.

2 years ago[Ada] Simplify call to overloaded Earlier_In_Extended_Unit
Piotr Trojanek [Mon, 24 Jan 2022 11:19:19 +0000 (12:19 +0100)]
[Ada] Simplify call to overloaded Earlier_In_Extended_Unit

We have two variants of Earlier_In_Extended_Unit that take either
Node_Id or Source_Ptr values. The caller can simply use another variant
and not explicitly convert parameters.

Code cleanup; semantics is unaffected.

gcc/ada/

* sem_warn.adb (Check_Unset_Reference): Use variant of
Earlier_In_Extended_Unit that calls Sloc internally.

2 years ago[Ada] Remove repeated conversions between Source_Ptr and Int
Piotr Trojanek [Thu, 20 Jan 2022 17:05:39 +0000 (18:05 +0100)]
[Ada] Remove repeated conversions between Source_Ptr and Int

Both Source_Ptr and Int are integer types (and even happen to have equal
ranges). Their values can be calculated without converting
back-and-forth, e.g.:

  Int (Loc1) - Int (Loc2)

can be written simply as:

  Int (Loc1 - Loc2)

Code cleanup related to handling of references to unset objects.
Offending occurrences found with various invocations of grep.

gcc/ada/

* par-ch10.adb, scng.adb, sem_res.adb, sinfo-utils.adb,
treepr.adb: Simplify calculations with Source_Ptr and Loc
values.

2 years ago[Ada] Fix style in resolution of expression with actions
Piotr Trojanek [Sat, 22 Jan 2022 18:39:52 +0000 (19:39 +0100)]
[Ada] Fix style in resolution of expression with actions

gcc/ada/

* sem_res.adb (Resolve_Expression_With_Actions): Fix style in
nested routines.

2 years ago[Ada] Reuse Is_Rewrite_Substitution where possible
Piotr Trojanek [Sat, 22 Jan 2022 18:38:10 +0000 (19:38 +0100)]
[Ada] Reuse Is_Rewrite_Substitution where possible

Replace comparisons of Original_Node with semantically equivalent but
high-level calls to Is_Rewrite_Substitution. Offending occurrences found
with:

  $ grep -n "Original_Node (\([A-Za-z_]\+\)) /\?= \1" *.adb

Code cleanup only; semantics is unaffected.

gcc/ada/

* atree.adb, exp_ch6.adb, exp_ch9.adb, ghost.adb, sem_ch3.adb,
sem_ch4.adb, sem_res.adb, sem_util.adb: Use
Is_Rewrite_Substitution where possible.

2 years ago[Ada] Cleanup detection of No_Elist with No and Present
Piotr Trojanek [Thu, 20 Jan 2022 19:14:20 +0000 (20:14 +0100)]
[Ada] Cleanup detection of No_Elist with No and Present

Replace equality and inequality operators with calls to No and Present.
Offending occurrences found with:

$ grep -n " /\?= No_Elist" *.adb

Code cleanup only; semantics is unaffected.

gcc/ada/

* exp_ch11.adb, exp_ch5.adb, exp_prag.adb, gnat_cuda.adb,
sem_ch12.adb, sem_ch3.adb, sem_ch6.adb, sem_util.adb,
treepr.adb: Replace /= and = operators with No and Present,
respectively.

2 years ago[Ada] Prevent search for references in postconditions from going too far
Piotr Trojanek [Sat, 22 Jan 2022 13:51:27 +0000 (14:51 +0100)]
[Ada] Prevent search for references in postconditions from going too far

Add a standard prevention against climbing the entire compilation unit.
Cleanup only; behaviour of the compiler is unaffected.

gcc/ada/

* sem_warn.adb (Within_Postcondition): Guard against search
going too far.

2 years ago[Ada] Remove tiny and incomplete optimization for unset references
Piotr Trojanek [Thu, 20 Jan 2022 21:37:30 +0000 (22:37 +0100)]
[Ada] Remove tiny and incomplete optimization for unset references

Code cleanup; behaviour is unaffected.

gcc/ada/

* sem_warn.adb (Check_Unset_Reference): The early test was only
saving time of calls to Original_Node, Comes_From_Source and
Nkind, which are all quick and cheap.

2 years ago[Ada] Cleanup unnecessary declare block in Check_Unreachable_Code
Piotr Trojanek [Thu, 20 Jan 2022 21:36:16 +0000 (22:36 +0100)]
[Ada] Cleanup unnecessary declare block in Check_Unreachable_Code

Cleanup related to static detection of references to uninitialized
variables. Semantics is unaffected.

gcc/ada/

* sem_ch5.adb (Check_Unreachable_Code): Remove inner declare
block; refill code and comments.

2 years ago[Ada] Refine iteration from entities to formals
Piotr Trojanek [Thu, 20 Jan 2022 19:12:52 +0000 (20:12 +0100)]
[Ada] Refine iteration from entities to formals

When matching formal parameters from spec and body it is cleaner and
more efficient to iterate with First_Formal/Next_Formal and not with
First_Entity/Next_Entity. The previous iteration could unintentionally
pick entities from within the subprogram body, e.g. objects declared
within the subprogram.

gcc/ada/

* sem_ch6.adb (Analyze_Subprogram_Body_Helper): Replace
First_Entity/Next_Entity with First_Formal/Next_Formal; rename
E1/E2 to F1/F2.

2 years ago[Ada] Check declare and qualified expressions for unset references
Piotr Trojanek [Sat, 22 Jan 2022 15:32:57 +0000 (16:32 +0100)]
[Ada] Check declare and qualified expressions for unset references

Detection of references to unset (uninitialized) objects requires calls
to Check_Unset_Reference on every subexpression of a composite statement
and expression. For declare and qualified expressions this was done only
when they occurred within another composite statement/expression.

gcc/ada/

* sem_res.adb (Resolve_Declare_Expression): Check expression for
references to unset objects.
(Resolve_Qualified_Expression): Likewise.
* sem_warn.adb (Check_Unset_Reference): Remove handling of
declare and qualified expressions; clarify comment for type
conversions.

2 years ago[Ada] Check if- and case-expressions for unset references
Piotr Trojanek [Thu, 20 Jan 2022 23:33:06 +0000 (00:33 +0100)]
[Ada] Check if- and case-expressions for unset references

Detection of references to unset (uninitialized) objects requires calls
to Check_Unset_Reference on every subexpression of a composite statement
and expression. This was missing for if-expressions and incomplete for
case-expressions.

gcc/ada/

* sem_res.adb (Resolve_Case_Expression): Check alternative
expressions for references to unset objects.
(Resolve_If_Expression): Check condition, then and else
expressions for references to unset objects.