platform/upstream/gcc.git
3 years agoxtensa: Fix 2 warnings during xtensa build [PR100841]
Jakub Jelinek [Wed, 2 Jun 2021 20:09:53 +0000 (22:09 +0200)]
xtensa: Fix 2 warnings during xtensa build [PR100841]

When building gcc targetting xtensa-linux, there are 2 warnings the PR
complains about:
../../gcc/dwarf2cfi.c: In function ‘void init_one_dwarf_reg_size(int, machine_mode, rtx, machine_mode, init_one_dwarf_reg_state*)’:
../../gcc/dwarf2cfi.c:291:12: warning: comparison of integer expressions of different signedness: ‘const unsigned int’ and ‘int’ [-Wsign-compare]
  291 |   if (rnum >= DWARF_FRAME_REGISTERS)
../../gcc/function.c: In function ‘void gen_call_used_regs_seq(rtx_insn*, unsigned int)’:
../../gcc/function.c:5897:63: warning: comparison of unsigned expression in ‘< 0’ is always false [-Wtype-limits]
 5897 |       if (crtl->uses_only_leaf_regs && LEAF_REG_REMAP (regno) < 0)
which might during bootstrap or when configured with --enable-werror-always
be turned into errors.

The first one is the -Wsign-compare warning, in c-family we do:
2281          /* Do not warn if the signed quantity is an unsuffixed integer
2282             literal (or some static constant expression involving such
2283             literals or a conditional expression involving such literals)
2284             and it is non-negative.  */
2285          if (tree_expr_nonnegative_warnv_p (sop, &ovf))
2286            /* OK */;
and so don't warn if that function determines the expression is
non-negative.  But xtensa defines DWARF_FRAME_REGISTERS as
(16 + (something ? 0 : 1)) and that isn't handled by
tree_expr_nonnegative_warnv_p, VRP can handle it of course, but that is much
later.
The second chunk rewrites it into a form that tree_expr_nonnegative_warnv_p
can handle, in particular (something ? 16 : 16 + 1), where for COND_EXPRs
that function checks both the 2nd and 3rd operand of the ternary operator
and if both are nonnegative, returns true.

The other warning has been introduced fairly recently; LEAF_REG_REMAP is
currently used by 2 targets only, and is documented to yield -1 if a hard
reg number can't be remapped and the remapped register number otherwise.
That means that the type of the expression should be signed (otherwise -1
could never appear), and on SPARC indeed it is defined as
 extern char leaf_reg_remap[];
 #define LEAF_REG_REMAP(REGNO) (leaf_reg_remap[REGNO])
so unless the host is -funsigned-char by default it works fine.
I guess sparc.[ch] should be fixed to use signed char of leaf_reg_remap,
Eric?
The argument to LEAF_REG_REMAP is often unsigned int though, hard
register numbers are usually not negative, and thus the warning.
I think xtensa doesn't have 2G hard registers and so it is ok to just cast
it to int.

2021-06-02  Jakub Jelinek  <jakub@redhat.com>

PR target/100841
* config/xtensa/xtensa.h (LEAF_REG_REMAP): Cast REGNO to int to avoid
-Wtype-limits warnings.
(DWARF_FRAME_REGISTER): Rewrite into ternary operator with addition
in operands to avoid -Wsign-compare warnings.

3 years agoMake sure link reg save MEM has frame alias set.
Pat Haugen [Wed, 2 Jun 2021 20:03:40 +0000 (15:03 -0500)]
Make sure link reg save MEM has frame alias set.

gcc/ChangeLog:

* config/rs6000/rs6000-logue.c (rs6000_emit_prologue): Use
gen_frame_store.

3 years agoc++: missing dtor with -fno-elide-constructors [PR100838]
Jason Merrill [Mon, 31 May 2021 16:36:25 +0000 (12:36 -0400)]
c++: missing dtor with -fno-elide-constructors [PR100838]

tf_no_cleanup only applies to the outermost TARGET_EXPR, and we already
clear it for nested calls in build_over_call, but in this case both
constructor calls came from convert_like, so we need to clear it in the
recursive call as well.  This revealed that we were adding an extra
ck_rvalue in direct-initialization cases where it was wrong.

PR c++/100838

gcc/cp/ChangeLog:

* call.c (convert_like_internal): Clear tf_no_cleanup when
recursing.
(build_user_type_conversion_1): Only add ck_rvalue if
LOOKUP_ONLYCONVERTING.

gcc/testsuite/ChangeLog:

* g++.dg/init/no-elide2.C: New test.

3 years agoMAINTAINERS: Add DCO section
Jason Merrill [Tue, 1 Jun 2021 13:58:21 +0000 (09:58 -0400)]
MAINTAINERS: Add DCO section

ChangeLog:

* MAINTAINERS: Add DCO section.

3 years agolibstdc++: Value-initialize objects held by EBO helpers [PR 100863]
Jonathan Wakely [Wed, 2 Jun 2021 11:34:48 +0000 (12:34 +0100)]
libstdc++: Value-initialize objects held by EBO helpers [PR 100863]

The allocator, hash function and equality function should all be
value-initialized by the default constructor of an unordered container.
Do it in the EBO helper, so we don't have to get it right in multiple
places.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:

PR libstdc++/100863
PR libstdc++/65816
* include/bits/hashtable_policy.h (_Hashtable_ebo_helper):
Value-initialize subobject.
* testsuite/23_containers/unordered_map/allocator/default_init.cc:
Remove XFAIL.
* testsuite/23_containers/unordered_set/allocator/default_init.cc:
Remove XFAIL.

3 years agolibstdc++: Fix tests for COW std::string [PR 96088]
Jonathan Wakely [Wed, 2 Jun 2021 11:33:38 +0000 (12:33 +0100)]
libstdc++: Fix tests for COW std::string [PR 96088]

The expected number of allocations is different when copying COW
strings.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:

PR libstdc++/96088
* testsuite/23_containers/unordered_map/96088.cc: Adjust
expected number of allocations.
* testsuite/23_containers/unordered_set/96088.cc: Likewise.

3 years agoARC: gcc driver default to hs38_linux
Claudiu Zissulescu [Wed, 2 Jun 2021 11:31:00 +0000 (14:31 +0300)]
ARC: gcc driver default to hs38_linux

arc700 is legacy and there's no active development for it, so switch to
latest hs38_linux as default

Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Signed-off-by: Claudiu Zissulescu <claziss@synopsys.com>
gcc/
2021-06-02  Vineet Gupta  <vgupta@synopsys.com>

* config/arc/arc.h (TARGET_CPU_DEFAULT): Change to hs38_linux.

3 years agolibstdc++: Improve punctuation in implementation status docs
Jonathan Wakely [Wed, 2 Jun 2021 11:31:04 +0000 (12:31 +0100)]
libstdc++: Improve punctuation in implementation status docs

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:

* doc/xml/manual/status_cxxis29124.xml: Improve punctuation.
* doc/xml/manual/status_cxxtr1.xml: Likewise.
* doc/xml/manual/status_cxxtr24733.xml: Likewise.
* doc/html/*: Regenerate.

3 years agoIBM Z: Remove match_scratch workaround
Ilya Leoshkevich [Mon, 31 May 2021 19:59:50 +0000 (21:59 +0200)]
IBM Z: Remove match_scratch workaround

Since commit dd1ef00c45ba ("Fix bug in the define_subst handling that
made match_scratch unusable for multi-alternative patterns.") the
workaround for that bug in *ashrdi3_31<setcc><cconly> is not only no
longer necessary, but actually breaks the build.

Get rid of it by using only one alternative in (match_scratch).  It
will be replicated as many times as needed in order to match the
pattern with which (define_subst) is used.

gcc/ChangeLog:

* config/s390/s390.md(*ashrdi3_31<setcc><cconly>): Use a single
constraint.
* config/s390/subst.md(cconly_subst): Use a single constraint
in (match_scratch).

gcc/testsuite/ChangeLog:

* gcc.target/s390/ashr.c: New test.

3 years agoFortran/OpenMP: Add gfortran.dg/gomp/taskloop-2.f90 [PR99928]
Tobias Burnus [Wed, 2 Jun 2021 09:48:21 +0000 (11:48 +0200)]
Fortran/OpenMP: Add gfortran.dg/gomp/taskloop-2.f90 [PR99928]

PR middle-end/99928

gcc/testsuite/ChangeLog

* gfortran.dg/gomp/taskloop-2.f90: New.

3 years agotestsuite: Add -Wno-psabi -w to g++.dg/ext/builtin-shufflevector-1.C
Jakub Jelinek [Wed, 2 Jun 2021 08:24:56 +0000 (10:24 +0200)]
testsuite: Add -Wno-psabi -w to g++.dg/ext/builtin-shufflevector-1.C

The testcase without this FAILs on i686-linux, where we warn about returning
of a generic vector changing the ABI.

2021-06-02  Jakub Jelinek  <jakub@redhat.com>

* g++.dg/ext/builtin-shufflevector-1.C: Add -Wno-psabi -w to
dg-options.

3 years agoicf: Fix memory leak of a vector.
Martin Liska [Tue, 1 Jun 2021 13:26:47 +0000 (15:26 +0200)]
icf: Fix memory leak of a vector.

gcc/ChangeLog:

* ipa-icf.h: Use auto_vec for memory_access_types.

3 years agoFix minor bugs in H8 port logical ops. Prepare for more compare/test removal
Jeff Law [Wed, 2 Jun 2021 04:56:38 +0000 (00:56 -0400)]
Fix minor bugs in H8 port logical ops.  Prepare for more compare/test removal

gcc/
* config/h8300/h8300-protos.h (compute_a_shift_length): Drop unused
argument from prototype.
(output_logical_op): Add rtx_code argument.
(compute_logical_op_length): Likewise.
* config/h8300/h8300.c (h8300_and_costs): Pass additional argument
to compute_a_shift_length.
(output_logical_op); New argument with the rtx code rather than
extracting it from an operand.  Handle QImode too.
(compute_logical_op_length): Similary.
(compute_a_shift_length): Drop unused argument.
* config/h8300/h8300.md (logicals): New code iterator.
* config/h8300/logical.md (<code><mode>3 expander): Combine
the "and" expander with the "ior"/"xor" expander.
(bclr<mode>msx): Combine the QI/HI mode patterns.
(<logical><mode>3 insns): Use code iterator rather than match_operator.
Handle QImode as well.   Update call to output_logical_op and
compute_logical_op_length to pass in rtx_code
Fix split condition on all define_insn_and_split patterns.
(one_cmpl<mode>2<cczn>): Use <cczn> to support both clobbering
the flags and setting ZN via existing define_subst.
* config/h8300/shiftrotate.md: Drop unused argument from
calls to compute_a_shift_length.

Signed-off-by: Jeff Law <jeffreyalaw@gmail.com>
3 years agoDaily bump.
GCC Administrator [Wed, 2 Jun 2021 00:16:43 +0000 (00:16 +0000)]
Daily bump.

3 years agoc++: value-init vs zero-init in expand_aggr_init_1 [PR65816]
Patrick Palka [Tue, 1 Jun 2021 16:23:49 +0000 (12:23 -0400)]
c++: value-init vs zero-init in expand_aggr_init_1 [PR65816]

In the case of value-initializing an object of class type T,
[dcl.init.general]/8 says:

  - if T has either no default constructor ([class.default.ctor]) or
    a default constructor that is user-provided or deleted, then the
    object is default-initialized;
  - otherwise, the object is zero-initialized and ...  if T has a
    non-trivial default constructor, the object is default-initialized;

But when determining whether to first zero-initialize the object,
expand_aggr_init_1 incorrectly considers the user-providedness of _all_
constructors rather than only that of the _default_ constructors.  This
causes us to skip the zero-initialization step when the class type has a
defaulted default constructor alongside a user-defined constructor.

It seems the predicate type_has_non_user_provided_default_constructor
accurately captures the above rule for when to first perform a
zero-initialization during value-initialization, so this patch adjusts
expand_aggr_init_1 to use this predicate instead.

PR c++/65816

gcc/cp/ChangeLog:

* init.c (expand_aggr_init_1): Check
type_has_non_user_provided_default_constructor instead of
type_has_user_provided_constructor.

gcc/testsuite/ChangeLog:

* g++.dg/cpp0x/constexpr-delegating3.C: New test.
* g++.dg/cpp0x/dc10.C: New test.
* g++.dg/cpp0x/initlist-base4.C: New test.
* g++.dg/cpp2a/constexpr-init22.C: New test.

libstdc++-v3/ChangeLog:

* testsuite/23_containers/deque/allocator/default_init.cc,
testsuite/23_containers/forward_list/allocator/default_init.cc,
testsuite/23_containers/list/allocator/default_init.cc,
testsuite/23_containers/map/allocator/default_init.cc,
testsuite/23_containers/set/allocator/default_init.cc,
testsuite/23_containers/vector/allocator/default_init.cc,
testsuite/23_containers/vector/bool/allocator/default_init.cc:
Remove xfail.

3 years agoReplace conditional_replacement with match and simplify
Andrew Pinski [Tue, 1 Jun 2021 01:05:09 +0000 (01:05 +0000)]
Replace conditional_replacement with match and simplify

This is the first of series of patches to simplify phi-opt
to use match and simplify in many cases.  This simplification
will more things to optimize.

This is what Richard requested in
https://gcc.gnu.org/pipermail/gcc-patches/2021-May/571197.html
and I think it is the right thing to do too.

OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.

gcc/ChangeLog:

PR tree-optimization/25290
* tree-ssa-phiopt.c (match_simplify_replacement):
New function.
(tree_ssa_phiopt_worker): Use match_simplify_replacement.
(two_value_replacement): Change the comment about
conditional_replacement.
(conditional_replacement): Delete.

3 years agoFix PR 95481: tail call fails with empty struct types
Andrew Pinski [Mon, 31 May 2021 00:17:22 +0000 (00:17 +0000)]
Fix PR 95481: tail call fails with empty struct types

The problem here is we don't have an assignment type any more
for empty structs as they were removed during gimplifcation.
This adds a special case where the assignment var does not exist
and the return decl is empty typed.

OK? Tested on aarch64-linux-gnu with no regressions.

Thanks,
Andrew Pinski

changes since v1:
v2: Use is_empty_type instead of zero-sized type.

gcc/ChangeLog:
PR tree-optimization/95481
* tree-tailcall.c (find_tail_calls): Handle empty typed
return decls.

gcc/testsuite/ChangeLog:

PR tree-optimization/95481
* gcc.dg/tree-ssa/tailcall-10.c: New test.
* gcc.dg/tree-ssa/tailcall-11.c: New test.
* gcc.dg/tree-ssa/tailcall-12.c: New test.
* gcc.dg/tree-ssa/tailcall-13.c: New test.
* gcc.dg/tree-ssa/tailrecursion-8.c: New test.

3 years agoUse is_empty_type instead of zero-sized type.
Andrew Pinski [Mon, 31 May 2021 12:25:28 +0000 (12:25 +0000)]
Use is_empty_type instead of zero-sized type.

Instead of only removing assignments of zero-sized types,
assignments of all empty types should be removed during gimplification.
This moves to use is_empty_type which will be used in other places too.

OK?  Bootstrapped and tested on aarch64-linux-gnu with no regressions.

Thanks,
Andrew Pinski

gcc/ChangeLog:

* gimplify.c (zero_sized_field_decl): Delete
(zero_sized_type): Delete
(gimplify_init_ctor_eval): Use is_empty_type instead
of zero_sized_field_decl.
(gimplify_modify_expr): Use is_empty_type instead of
zero_sized_type.

3 years agolibstdc++: Fix effective target for new tests [PR 96088]
Jonathan Wakely [Tue, 1 Jun 2021 18:05:03 +0000 (19:05 +0100)]
libstdc++: Fix effective target for new tests [PR 96088]

These tests use <string_view> so must not run for anything older than
C++17.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:

* testsuite/23_containers/unordered_map/96088.cc: Change
effective target to c++17.
* testsuite/23_containers/unordered_set/96088.cc: Likewise.

3 years agolibstdc++: Fix new test for C++98 mode [PR 89728]
Jonathan Wakely [Tue, 1 Jun 2021 18:01:37 +0000 (19:01 +0100)]
libstdc++: Fix new test for C++98 mode [PR 89728]

The isblank class is not supported until C++11.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:

* testsuite/22_locale/ctype/is/string/89728_neg.cc: Only test
isblank for C++11 and later.

3 years agoPR100750: Require ELFv2 ABI for ROP test
Bill Schmidt [Tue, 1 Jun 2021 16:08:53 +0000 (11:08 -0500)]
PR100750: Require ELFv2 ABI for ROP test

2021-06-01  Bill Schmidt  <wschmidt@linux.ibm.com>

gcc/testsuite/
PR testsuite/100750
* gcc.target/powerpc/rop-5.c: Require ELFv2 ABI.

3 years agolibstdc++: Fix return value of std::ranges::advance [PR 100833]
Jonathan Wakely [Tue, 1 Jun 2021 15:02:45 +0000 (16:02 +0100)]
libstdc++: Fix return value of std::ranges::advance [PR 100833]

The three-argument form of ranges::advance is supposed to return the
difference between the second argument and the distance the iterator was
advanced. When a non-random-access iterator is not advanced (because it
already equals the sentinel) we were returning 0 rather than n - 0.

libstdc++-v3/ChangeLog:

PR libstdc++/100833
* include/bits/ranges_base.h (ranges::advance(iter, n, sentinel)):
Fix return value for no-op case.
* testsuite/24_iterators/range_operations/advance.cc: Test
return values of three-argument overload.

3 years agoc++: no clobber for C++20 destroying delete [PR91859]
Jason Merrill [Fri, 28 May 2021 21:05:23 +0000 (17:05 -0400)]
c++: no clobber for C++20 destroying delete [PR91859]

Before C++20 added destroying operator delete, by the time we called
operator delete for a pointer, the object would already be gone.  But that
isn't true for destroying delete.  Since the optimizers' assumptions about
operator delete are based on either DECL_IS_REPLACEABLE_OPERATOR (which
already is not set) or CALL_FROM_NEW_OR_DELETE_P, let's avoid setting the
latter flag in this case.

PR c++/91859

gcc/ChangeLog:

* tree.h (CALL_FROM_NEW_OR_DELETE_P): Adjust comment.

gcc/cp/ChangeLog:

* call.c (build_op_delete_call): Don't set CALL_FROM_NEW_OR_DELETE_P
for destroying delete.
* init.c (build_delete): Don't clobber before destroying delete.

gcc/testsuite/ChangeLog:

* g++.dg/cpp2a/destroying-delete5.C: New test.

3 years agoc++: -Wdeprecated-copy and #pragma diagnostic [PR94492]
Jason Merrill [Tue, 27 Apr 2021 21:13:39 +0000 (17:13 -0400)]
c++: -Wdeprecated-copy and #pragma diagnostic [PR94492]

-Wdeprecated-copy was depending only on the state of the warning at the
point where we call the function, making it hard to use #pragma diagnostic
to suppress the warning for a particular implicitly declared function.

But checking whether the warning is enabled at the location of the implicit
declaration turned out to be a bit complicated; option_enabled only tests
whether it was enabled at the start of compilation, the actual test only
existed in the middle of diagnostic_report_diagnostic.  So this patch
factors it out and adds a new warning_enabled function to diagnostic.h.

gcc/ChangeLog:

PR c++/94492
* diagnostic.h (warning_enabled_at): Declare.
* diagnostic.c (diagnostic_enabled): Factor out from...
(diagnostic_report_diagnostic): ...here.
(warning_enabled_at): New.

gcc/cp/ChangeLog:

PR c++/94492
* decl2.c (cp_warn_deprecated_use): Check warning_enabled_at.

gcc/testsuite/ChangeLog:

PR c++/94492
* g++.dg/cpp0x/depr-copy4.C: New test.

3 years agoRevert patch that disabled exporting of global ranges.
Aldy Hernandez [Tue, 1 Jun 2021 09:26:02 +0000 (05:26 -0400)]
Revert patch that disabled exporting of global ranges.

Andrew's last set of changes fixes the bootstrap problem on i686 when
global ranges are exported from evrp.  The specific patch that fixes the
problem is 715914d3:

Author: Andrew MacLeod <amacleod@redhat.com>
Date:   Mon May 31 12:13:50 2021 -0400

    Do not calculate new values when evaluating a debug statement.

    Add a flag to enable/disable immediately improving poor values found during
    cache propagation. Then disable it when processing debug statements.

This patch reverts commit 2364b58 now that exporting of global ranges works.

Tested on x86-64 Linux with default flags, and on i686 with the flags in
the PR: --enable-clocale=gnu --with-system-zlib --with-demangler-in-ld --with-fpmath=sse --enable-languages=c,c++ --enable-cet i686-linux --enable-bootstrap --with-fpmath=sse --disable-libcc1 --disable-libcilkrts --disable-libsanitizer

gcc/ChangeLog:

* gimple-ssa-evrp.c: Enable exporting of global ranges.

gcc/testsuite/ChangeLog:

* gcc.dg/Wstringop-overflow-55.c: Adjust for global ranges changes.
* gcc.dg/pr80776-1.c: Same.

3 years agoFix sanity checking of global_options.
Martin Liska [Tue, 1 Jun 2021 08:41:04 +0000 (10:41 +0200)]
Fix sanity checking of global_options.

gcc/c-family/ChangeLog:

PR other/100759
* c-attribs.c (handle_optimize_attribute): Limit sanity check
to a situation where we are not in processing of an optimize
pragma.
* c-pragma.c (handle_pragma_pop_options): Restore target
options.

3 years agolibstdc++: Fix installation of python hooks [PR 99453]
Jonathan Wakely [Tue, 1 Jun 2021 10:00:16 +0000 (11:00 +0100)]
libstdc++: Fix installation of python hooks [PR 99453]

When no shared library is installed, the new code to determine the name
of the -gdb.py file yields an empty string. Use the name of the static
library in that case.

libstdc++-v3/ChangeLog:

PR libstdc++/99453
* python/Makefile.am: Use archive name for printer hook if no
dynamic library name is available.
* python/Makefile.in: Regenerate.

3 years agodocs: Mention that -fgcse-after-reload is enabled with -O3.
Martin Liska [Tue, 1 Jun 2021 12:17:39 +0000 (14:17 +0200)]
docs: Mention that -fgcse-after-reload is enabled with -O3.

gcc/ChangeLog:

PR other/100826
* doc/invoke.texi: Mention that -fgcse-after-reload
is enabled with -O3.

3 years agoFortran/OpenMP: Support (parallel) master taskloop (simd) [PR99928]
Tobias Burnus [Tue, 1 Jun 2021 10:46:37 +0000 (12:46 +0200)]
Fortran/OpenMP: Support (parallel) master taskloop (simd) [PR99928]

PR middle-end/99928

gcc/fortran/ChangeLog:

* dump-parse-tree.c (show_omp_node, show_code_node): Handle
(parallel) master taskloop (simd).
* frontend-passes.c (gfc_code_walker): Set in_omp_workshare
to false for parallel master taskloop (simd).
* gfortran.h (enum gfc_statement):
Add ST_OMP_(END_)(PARALLEL_)MASTER_TASKLOOP(_SIMD).
(enum gfc_exec_op): EXEC_OMP_(PARALLEL_)MASTER_TASKLOOP(_SIMD).
* match.h (gfc_match_omp_master_taskloop,
gfc_match_omp_master_taskloop_simd,
gfc_match_omp_parallel_master_taskloop,
gfc_match_omp_parallel_master_taskloop_simd): New prototype.
* openmp.c (gfc_match_omp_parallel_master_taskloop,
gfc_match_omp_parallel_master_taskloop_simd,
gfc_match_omp_master_taskloop,
gfc_match_omp_master_taskloop_simd): New.
(gfc_match_omp_taskloop_simd): Permit 'reduction' clause.
(resolve_omp_clauses): Handle new combined directives; remove
inscan-reduction check to reduce multiple errors; add
task-reduction error for 'taskloop simd'.
(gfc_resolve_omp_parallel_blocks,
resolve_omp_do, omp_code_to_statement,
gfc_resolve_omp_directive): Handle new combined constructs.
* parse.c (decode_omp_directive, next_statement,
gfc_ascii_statement, parse_omp_do, parse_omp_structured_block,
parse_executable): Likewise.
* resolve.c (gfc_resolve_blocks, gfc_resolve_code): Likewise.
* st.c (gfc_free_statement): Likewise.
* trans.c (trans_code): Likewise.
* trans-openmp.c (gfc_split_omp_clauses,
gfc_trans_omp_directive): Likewise.
(gfc_trans_omp_parallel_master): Move after gfc_trans_omp_master_taskloop;
handle parallel master taskloop (simd) as well.
(gfc_trans_omp_taskloop): Take gfc_exec_op as arg.
(gfc_trans_omp_master_taskloop): New.

gcc/testsuite/ChangeLog:

* gfortran.dg/gomp/reduction5.f90: Remove dg-error; the issue is
now diagnosed with less error output.
* gfortran.dg/gomp/scan-1.f90: Likewise.
* gfortran.dg/gomp/pr99928-3.f90: New test.
* gfortran.dg/gomp/taskloop-1.f90: New test.

3 years agoExtend is_cond_scalar_reduction to handle nop_expr after/before scalar reduction...
liuhongt [Wed, 6 Jan 2021 08:33:27 +0000 (16:33 +0800)]
Extend is_cond_scalar_reduction to handle nop_expr after/before scalar reduction.[PR98365]

gcc/ChangeLog:

PR tree-optimization/98365
* tree-if-conv.c (strip_nop_cond_scalar_reduction): New function.
(is_cond_scalar_reduction): Handle nop_expr in cond scalar reduction.
(convert_scalar_cond_reduction): Ditto.
(predicate_scalar_phi): Ditto.

gcc/testsuite/ChangeLog:

PR tree-optimization/98365
* gcc.target/i386/pr98365.c: New test.

3 years agoDo not calculate new values when evaluating a debug statement.
Andrew MacLeod [Mon, 31 May 2021 16:13:50 +0000 (12:13 -0400)]
Do not calculate new values when evaluating a debug statement.

Add a flag to enable/disable immediately improving poor values found during
cache propagation. Then disable it when processing debug statements.

gcc/
PR tree-optimization/100781
* gimple-range-cache.cc (ranger_cache::ranger_cache): Enable new
value calculation by default.
(ranger_cache::enable_new_values): New.
(ranger_cache::disable_new_values): New.
(ranger_cache::push_poor_value): Check if new values are allowed.
* gimple-range-cache.h (class ranger_cache): New member/methods.
* gimple-range.cc (gimple_ranger::range_of_expr): Check for debug
statement, and disable/renable new value calculation.

gcc/testsuite/
PR tree-optimization/100781
* gcc.dg/pr100781.c: New.

3 years agoReplace ssa_range_in_bb with entry exit and def range
Andrew MacLeod [Mon, 31 May 2021 20:41:27 +0000 (16:41 -0400)]
Replace ssa_range_in_bb with entry exit and def range

Split the old functionality of ssa_name_in_bb into the components for
definition in a block, entry and exit range.  Call these as appropriate.

* gimple-range-cache.cc (ranger_cache::ssa_range_in_bb): Delete.
(ranger_cache::range_of_def): New.
(ranger_cache::entry_range): New.
(ranger_cache::exit_range): New.
(ranger_cache::range_of_expr): Adjust.
(ranger_cache::range_on_edge): Adjust.
(ranger_cache::propagate_cache): Call exit_range directly.
* gimple-range-cache.h (class ranger_cache): Adjust.

3 years agoMove Ranger cache to range-query and fur_source model.
Andrew MacLeod [Mon, 31 May 2021 20:00:16 +0000 (16:00 -0400)]
Move Ranger cache to range-query and fur_source model.

Flatten and simplify gori-computes. Tweak debug output.
range-cache now provides range_of_expr and range_on_edge in the
standard formats, but in a "query what you have" mode rather than
"go figure out anything that is missing" mode.

* gimple-range-cache.cc (ranger_cache::ranger_cache): Adjust for
gori_compute being a member rather than base class.
dervied call to member call.
(ranger_cache::dump): No longer dump gori_map.
(ranger_cache::dump_bb): New.
(ranger_cache::get_non_stale_global_range): Adjust for gori_compute
being a member rather than base class.
(ranger_cache::set_global_range): Ditto.
(ranger_cache::ssa_range_in_bb): Ditto.
(ranger_cache::range_of_expr): New.
(ranger_cache::range_on_edge): New.
(ranger_cache::block_range): Adjust for gori_computes.  Debug changes.
(ranger_cache::propagate_cache):  Adjust debugging output.
(ranger_cache::fill_block_cache): Adjust for gori_computes.  Debug
output changes.
* gimple-range-cache.h (class ranger_cache): Make gori_compute a
member, and inherit from range_query instead.
(ranger_cache::dump_bb): New. split from dump.
* gimple-range-gori.cc (gori_compute::ssa_range_in_bb): Delete.
(gori_compute::expr_range_at_stmt): Delete.
(gori_compute::compute_name_range_op): Delete.
(gori_compute::compute_operand_range_switch): Add fur_source.
(gori_compute::compute_operand_range): Add fur_source param, inline
old compute_name_range_op and optimize_logical_operands.
(struct tf_range): Delete.
(gori_compute::logical_combine): Adjust
(gori_compute::optimize_logical_operands): Delete.
(gori_compute::compute_logical_operands_in_chain): Delete.
(gori_compute::compute_logical_operands): Adjust.
(gori_compute::compute_operand1_range): Adjust to fur_source.
(gori_compute::compute_operand2_range): Ditto.
(gori_compute::compute_operand1_and_operand2_range): Ditto.
(gori_compute::outgoing_edge_range_p): Add range_query parameter,
and adjust to fur_source.
* gimple-range-gori.h (class gori_compute): Simplify and adjust to
range_query and fur_source.
* gimple-range.cc (gimple_ranger::range_on_edge): Query range_on_edge
from the ranger_cache..
(gimple_ranger::fold_range_internal): Adjust to base class change of
ranger_cache.
(gimple_ranger::dump_bb): Adjust dump.
* gimple-range.h (gimple_ranger):export gori computes object.

3 years agoRange invariant global values are also always current.
Andrew MacLeod [Thu, 27 May 2021 15:19:10 +0000 (11:19 -0400)]
Range invariant global values are also always current.

when a range evolves to the point where it becomes a constant, it is
marked as invariant.  Rather than marking it as always_current in the
timestamp, give it the correct timestamp and just never flag it as stale.
This will allow other names which use this value to become stale and be
recomputed using the newly invariant value.

gcc/
PR tree-optimization/100774
* gimple-range-cache.cc (ranger_cache::get_non_stale_global_range):
Constant values are also not stale.
(ranger_cache::set_global_range): Range invariant values should also
have the correct timestamp.

gcc/testsuite
PR tree-optimization/100774
* g++.dg/pr100774.C: New.

3 years agoDaily bump.
GCC Administrator [Tue, 1 Jun 2021 00:16:37 +0000 (00:16 +0000)]
Daily bump.

3 years agoPR testsuite/100749 - gcc.dg/pch/valid-1.c fails after r12-949
Indu Bhagat [Mon, 31 May 2021 16:19:38 +0000 (09:19 -0700)]
PR testsuite/100749 - gcc.dg/pch/valid-1.c fails after r12-949

Fix failing pch testcases. Use xstrdup to retain a reliable copy of the debug
format str containing the names (df_set_names is a static string var).

2021-05-31  Indu Bhagat  <indu.bhagat@oracle.com>

gcc/c-family/
PR testsuite/100749
* c-pch.c (c_common_valid_pch): Use xstrdup for debug format set names.

3 years agoMAINTAINERS: Add myself for write after approval
Indu Bhagat [Mon, 31 May 2021 15:37:06 +0000 (08:37 -0700)]
MAINTAINERS: Add myself for write after approval

ChangeLog:

2021-05-31  Indu Bhagat  <indu.bhagat@oracle.com>

* MAINTAINERS (Write After Approval): Add myself.

3 years agogfortran.dg/gomp/depend-iterator-{1,2}.f90: Use dg-do compile
Tobias Burnus [Mon, 31 May 2021 14:38:05 +0000 (16:38 +0200)]
gfortran.dg/gomp/depend-iterator-{1,2}.f90: Use dg-do compile

'dg-do run' is pointless -1 due to dg-error. And it won't work except
by chance for gomp tests; as -2 only has depend(out:), a 'dg-do compile'
is sufficient.

gcc/testsuite/ChangeLog:

* gfortran.dg/gomp/depend-iterator-1.f90: Use dg-do compile.
* gfortran.dg/gomp/depend-iterator-2.f90: Use dg-do compile.

3 years agoLTO: stream properly FUNCTION_DECL_DECL_TYPE.
Martin Liska [Mon, 24 May 2021 09:18:21 +0000 (11:18 +0200)]
LTO: stream properly FUNCTION_DECL_DECL_TYPE.

gcc/lto/ChangeLog:

* lto-common.c (compare_tree_sccs_1): Compare
FUNCTION_DECL_DECL_TYPE.

gcc/ChangeLog:

* tree-streamer-in.c (unpack_ts_function_decl_value_fields):
Unpack FUNCTION_DECL_DECL_TYPE.
* tree-streamer-out.c (pack_ts_function_decl_value_fields):
Stream FUNCTION_DECL_DECL_TYPE instead of
DECL_IS_OPERATOR_NEW_P.
* tree.h (set_function_decl_type): Use FUNCTION_DECL_DECL_TYPE
macro.
(DECL_IS_OPERATOR_NEW_P): Likewise.
(DECL_IS_OPERATOR_DELETE_P): Likewise.
(DECL_LAMBDA_FUNCTION_P): Likewise.

3 years agoc++/88601 - [C/C++] __builtin_shufflevector support
Richard Biener [Fri, 21 May 2021 09:33:30 +0000 (11:33 +0200)]
c++/88601 - [C/C++] __builtin_shufflevector support

This adds support for the clang __builtin_shufflevector extension to
the C and C++ frontends.  The builtin is lowered to VEC_PERM_EXPR.
Because VEC_PERM_EXPR does not support different sized vector inputs
or result or the special permute index of -1 (don't-care)
c_build_shufflevector applies lowering by widening inputs and output
to the widest vector, replacing -1 by a defined index and
subsetting the final vector if we produced a wider result than
desired.

Code generation thus can be sub-optimal, followup patches will
aim to fix that by recovering from part of the missing features
during RTL expansion and by relaxing the constraints of the GIMPLE
IL with regard to VEC_PERM_EXPR.

2021-05-21  Richard Biener  <rguenther@suse.de>

PR c++/88601
gcc/c-family/
* c-common.c: Include tree-vector-builder.h and
vec-perm-indices.h.
(c_common_reswords): Add __builtin_shufflevector.
(c_build_shufflevector): New funtion.
* c-common.h (enum rid): Add RID_BUILTIN_SHUFFLEVECTOR.
(c_build_shufflevector): Declare.

gcc/c/
* c-decl.c (names_builtin_p): Handle RID_BUILTIN_SHUFFLEVECTOR.
* c-parser.c (c_parser_postfix_expression): Likewise.

gcc/cp/
* cp-objcp-common.c (names_builtin_p): Handle
RID_BUILTIN_SHUFFLEVECTOR.
* cp-tree.h (build_x_shufflevector): Declare.
* parser.c (cp_parser_postfix_expression): Handle
RID_BUILTIN_SHUFFLEVECTOR.
* pt.c (tsubst_copy_and_build): Handle IFN_SHUFFLEVECTOR.
* typeck.c (build_x_shufflevector): Build either a lowered
VEC_PERM_EXPR or an unlowered shufflevector via a temporary
internal function IFN_SHUFFLEVECTOR.

gcc/
* internal-fn.c (expand_SHUFFLEVECTOR): Define.
* internal-fn.def (SHUFFLEVECTOR): New.
* internal-fn.h (expand_SHUFFLEVECTOR): Declare.
* doc/extend.texi: Document __builtin_shufflevector.

gcc/testsuite/
* c-c++-common/builtin-shufflevector-2.c: New testcase.
* c-c++-common/torture/builtin-shufflevector-1.c: Likewise.
* g++.dg/ext/builtin-shufflevector-1.C: Likewise.
* g++.dg/ext/builtin-shufflevector-2.C: Likewise.

3 years agors6000: MMA test case ICEs using -O3 [PR99842]
Peter Bergner [Mon, 31 May 2021 03:45:55 +0000 (22:45 -0500)]
rs6000: MMA test case ICEs using -O3 [PR99842]

The mma_assemble_input_operand predicate does not accept reg+reg indexed
addresses which can lead to ICEs.  The lxv and lxvp instructions have
indexed forms (lxvx and lxvpx), so the simple solution is to just allow
indexed addresses in the predicate.

2021-05-30  Peter Bergner  <bergner@linux.ibm.com>

gcc/
PR target/99842
* config/rs6000/predicates.md(mma_assemble_input_operand): Allow
indexed form addresses.

gcc/testsuite/
PR target/99842
* g++.target/powerpc/pr99842.C: New.

3 years agoDaily bump.
GCC Administrator [Mon, 31 May 2021 00:16:25 +0000 (00:16 +0000)]
Daily bump.

3 years agolibstdc++: Remove "Intel Compilers" bibliography entry
Gerald Pfeifer [Sun, 30 May 2021 22:27:17 +0000 (00:27 +0200)]
libstdc++: Remove "Intel Compilers" bibliography entry

The original link redirects to a very generic page that advertises
lots of tools and other things, just not this.

libstdc++-v3/ChangeLog:

2021-05-31  Gerald Pfeifer  <gerald@pfeifer.com>

* doc/xml/manual/abi.xml: Remove dead reference to "Intel
Compilers for Linux: Compatibility with GNU Compilers" article.
* doc/html/manual/abi.html: Regenerate.

3 years agoFortran: Fix typo in documentation of BOZ
Gerald Pfeifer [Sun, 30 May 2021 13:27:53 +0000 (15:27 +0200)]
Fortran: Fix typo in documentation of BOZ

gcc/fortran/ChangeLog:

2021-05-30  Gerald Pfeifer  <gerald@pfeifer.com>

* gfortran.texi (BOZ literal constants): Fix typo.

3 years agoDaily bump.
GCC Administrator [Sun, 30 May 2021 00:16:26 +0000 (00:16 +0000)]
Daily bump.

3 years agodiagnostics: Fix sporadic test failure
Bernd Edlinger [Fri, 28 May 2021 12:26:02 +0000 (14:26 +0200)]
diagnostics: Fix sporadic test failure

it turns out to be reproducible this way:

COLUMNS=80 make check-gcc-c RUNTESTFLAGS="plugin.exp=diagnostic*"

Running /home/ed/gnu/gcc-trunk/gcc/testsuite/gcc.dg/plugin/plugin.exp ...
FAIL: gcc.dg/plugin/diagnostic-test-expressions-1.c
 -fplugin=./diagnostic_plugin_test_tree_expression_range.so  1 blank line(s) in output
FAIL: gcc.dg/plugin/diagnostic-test-expressions-1.c
 -fplugin=./diagnostic_plugin_test_tree_expression_range.so  expected multiline pattern lines 550-551 not found: "                            __builtin_types_compatible_p \(long, int\) \+ f \(i\)\);.*\n                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\^~~~~~~\n"
FAIL: gcc.dg/plugin/diagnostic-test-expressions-1.c
 -fplugin=./diagnostic_plugin_test_tree_expression_range.so (test for excess errors)

a lot more errors happen with COLUMNS=20.

2021-05-29  Bernd Edlinger  <bernd.edlinger@hotmail.de>

* gcc.dg/plugin/diagnostic_plugin_show_trees.c (plugin_init): Fix caret_max_with.
* gcc.dg/plugin/diagnostic_plugin_test_inlining.c
(plugin_init): Likewise.
* gcc.dg/plugin/diagnostic_plugin_test_paths.c (plugin_init): Likewise.
* gcc.dg/plugin/diagnostic_plugin_test_string_literals.c
(plugin_init): Likewise.
* gcc.dg/plugin/diagnostic_plugin_test_tree_expression_range.c
(plugin_init): Likewise.

3 years ago[committed][PR bootstrap/100730] Fix warnings in H8 target files
Jeff Law [Sat, 29 May 2021 15:37:30 +0000 (09:37 -0600)]
[committed][PR bootstrap/100730] Fix warnings in H8 target files

gcc/

* config/h8300/h8300.c (h8300_emit_stack_adjustment): Drop unused
parameter.  Call callers fixed.
(push): Likewise.
(output_plussi): Add FALLTHRU markers.
(h8300_shift_needs_scratch_p): Add gcc_unreachable marker.

3 years agosim: leverage gnulib
Mike Frysinger [Sat, 1 May 2021 22:05:49 +0000 (18:05 -0400)]
sim: leverage gnulib

We use getline, so leverage gnulib to provide fallback implementation.

ChangeLog:

* configure.ac: Add gnulib to configdirs for sim.
* configure: Regenerate.

3 years agoopenmp: Add shared to parallel for linear on parallel master taskloop simd [PR99928]
Jakub Jelinek [Sat, 29 May 2021 08:05:38 +0000 (10:05 +0200)]
openmp: Add shared to parallel for linear on parallel master taskloop simd [PR99928]

I forgot to add default(none) and defaultmap(none) wherever possible on the
testcases to make sure none of the required clauses are added implicitly (because
in that case it doesn't work with these none arguments of those default* clauses
or works differently with other default* settings.

And that revealed we didn't add shared on parallel for linear clause
on parallel master taskloop simd, so this patch fixes that too.

2021-05-29  Jakub Jelinek  <jakub@redhat.com>

PR middle-end/99928
* gimplify.c (gimplify_scan_omp_clauses): For taskloop simd
combined with parallel, make sure to add shared clause to
parallel for explicit linear clause.

* c-c++-common/gomp/pr99928-1.c: Add default(none) to constructs
combined with parallel, teams or taskloop and defaultmap(none)
to constructs combined with target.
* c-c++-common/gomp/pr99928-2.c: Likewise.
* c-c++-common/gomp/pr99928-3.c: Likewise.
* c-c++-common/gomp/pr99928-4.c: Likewise.
* c-c++-common/gomp/pr99928-5.c: Likewise.
* c-c++-common/gomp/pr99928-6.c: Likewise.
* c-c++-common/gomp/pr99928-7.c: Likewise.
* c-c++-common/gomp/pr99928-8.c: Likewise.
* c-c++-common/gomp/pr99928-9.c: Likewise.
* c-c++-common/gomp/pr99928-10.c: Likewise.
* c-c++-common/gomp/pr99928-13.c: Likewise.
* c-c++-common/gomp/pr99928-14.c: Likewise.

3 years agoFix i686 bootstrap by temporarily disabling exporting of global ranges.
Aldy Hernandez [Fri, 28 May 2021 20:17:51 +0000 (22:17 +0200)]
Fix i686 bootstrap by temporarily disabling exporting of global ranges.

The patch converting evrp to the get_range_query(fun) API broke i686
bootstrap (commit 57bf37515).  The problem seems to be in a subsequent
pass that has more up-to-date global ranges.  I won't be able to look at
this until next week, so I am reverting the problematic bit of the
patch-- the exporting of global ranges once evrp finishes.  The use of
the new API remains.

Reverting the behavior shouldn't be a problem as we never used to export
global ranges from ranger.  This was new behavior in the patchset.

Tested on x86-64 Linux with a bootstrap and regtest, and on x86-32 with
only a bootstrap and the configure flags from the PR:

--enable-clocale=gnu --with-system-zlib --with-demangler-in-ld --with-fpmath=sse --enable-languages=c,c++ --enable-cet i686-linux --enable-bootstrap --with-fpmath=sse --disable-libcc1 --disable-libcilkrts --disable-libsanitizer

gcc/ChangeLog:

PR tree-optimization/100787
* gimple-ssa-evrp.c: Disable exporting of global ranges.

gcc/testsuite/ChangeLog:

* gcc.dg/Wstringop-overflow-55.c:
* gcc.dg/pr80776-1.c:

3 years agoDaily bump.
GCC Administrator [Sat, 29 May 2021 00:16:29 +0000 (00:16 +0000)]
Daily bump.

3 years agotree-iterator: C++11 range-for and tree_stmt_iterator
Jason Merrill [Sat, 3 Apr 2021 02:20:43 +0000 (22:20 -0400)]
tree-iterator: C++11 range-for and tree_stmt_iterator

Like my recent patch to add ovl_range and lkp_range in the C++ front end,
this patch adds the tsi_range adaptor for using C++11 range-based 'for' with
a STATEMENT_LIST, e.g.

  for (tree stmt : tsi_range (stmt_list)) { ... }

This also involves adding some operators to tree_stmt_iterator that are
needed for range-for iterators, and should also be useful in code that uses
the iterators directly.

The patch updates the suitable loops in the C++ front end, but does not
touch any loops elsewhere in the compiler.

gcc/ChangeLog:

* tree-iterator.h (struct tree_stmt_iterator): Add operator++,
operator--, operator*, operator==, and operator!=.
(class tsi_range): New.

gcc/cp/ChangeLog:

* constexpr.c (build_data_member_initialization): Use tsi_range.
(build_constexpr_constructor_member_initializers): Likewise.
(constexpr_fn_retval, cxx_eval_statement_list): Likewise.
(potential_constant_expression_1): Likewise.
* coroutines.cc (await_statement_expander): Likewise.
(await_statement_walker): Likewise.
* module.cc (trees_out::core_vals): Likewise.
* pt.c (tsubst_expr): Likewise.
* semantics.c (set_cleanup_locs): Likewise.

3 years agotree-optimization/100778 - avoid cross-BB vectorization of trapping op
Richard Biener [Fri, 28 May 2021 12:26:06 +0000 (14:26 +0200)]
tree-optimization/100778 - avoid cross-BB vectorization of trapping op

This avoids vectorizing a possibly trapping operation when lanes
are handled in different BBs.  I spotted this when working on the
originally reported issue in PR100778.

2021-05-28  Richard Biener  <rguenther@suse.de>

PR tree-optimization/100778
* tree-vect-slp.c (vect_build_slp_tree_1): Prevent possibly
trapping ops in different BBs.

* gcc.dg/vect/bb-slp-pr100778-1.c: New testcase.

3 years agoc++: 'this' adjustment for devirtualized call
Jason Merrill [Fri, 28 May 2021 03:54:52 +0000 (23:54 -0400)]
c++: 'this' adjustment for devirtualized call

My patch for 95719 made us do a better job of finding the actual virtual
function we want to call, but didn't update the 'this' pointer adjustment to
match.

PR c++/100797
PR c++/95719

gcc/cp/ChangeLog:

* call.c (build_over_call): Adjust base_binfo in
resolves_to_fixed_type_p case.

gcc/testsuite/ChangeLog:

* g++.dg/inherit/virtual15.C: New test.

3 years agoipa/100791 - copy fntype when processing __builtin_va_arg_pack
Richard Biener [Fri, 28 May 2021 11:31:35 +0000 (13:31 +0200)]
ipa/100791 - copy fntype when processing __builtin_va_arg_pack

This missing copying exposed a type mismatch in the IL.

2021-05-28  Richard Biener  <rguenther@suse.de>

PR ipa/100791
* tree-inline.c (copy_bb): When processing __builtin_va_arg_pack
copy fntype from original call.

* gcc.dg/pr100791.c: New testcase.

3 years agoc/100803 - diagnose invalid GIMPLE condition
Richard Biener [Fri, 28 May 2021 11:05:39 +0000 (13:05 +0200)]
c/100803 - diagnose invalid GIMPLE condition

another easy fix for GIMPLE FE parser robustness.

2021-05-28  Richard Biener   <rguenther@suse.de>

PR c/100803
gcc/c/
* gimple-parser.c (c_parser_gimple_paren_condition): Diagnose
invalid if conditions.

gcc/testsuite/
* gcc.dg/gimplefe-error-11.c: New testcase.

3 years agoDOC: Update __gcov_dump documentation.
Martin Liska [Fri, 28 May 2021 11:35:33 +0000 (13:35 +0200)]
DOC: Update __gcov_dump documentation.

PR gcov-profile/100751

gcc/ChangeLog:

* doc/gcov.texi: Revert partially a hunk that was wrong.

3 years agoC-SKY: Define HAVE_sync_compare_and_swap*.
Cooper Qu [Fri, 28 May 2021 09:02:05 +0000 (17:02 +0800)]
C-SKY: Define HAVE_sync_compare_and_swap*.

The SYNC operations are implemented as library functions, not
NSN patterns.  As a result, the HAVE defines for the patterns are
not defined.  We need to define them to generate the corresponding
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_* and __GCC_ATOMIC_*_LOCK_FREE
defines.

gcc/
* config/csky/csky-linux-elf.h (HAVE_sync_compare_and_swapqi):
Defined.
(HAVE_sync_compare_and_swaphi): Likewise.
(HAVE_sync_compare_and_swapsi): Likewise.

3 years agoopenmp: Fix up handling of reduction clause on constructs combined with target [PR99928]
Jakub Jelinek [Fri, 28 May 2021 09:26:48 +0000 (11:26 +0200)]
openmp: Fix up handling of reduction clause on constructs combined with target [PR99928]

The reduction clause should be copied as map (tofrom: ) to combined target if
present, but as we need different handling of array sections between map and reduction,
doing that during gimplification would be harder.

So, this patch adds them during splitting, and similarly to firstprivate adds them
with a new flag that they should be just ignored/removed if an explicit map clause
of the same list item is present.

The exact rules are to be decided in https://github.com/OpenMP/spec/issues/2766
so this patch just implements something that is IMHO reasonable and exact detailed
testcases for the cornercases will follow once it is clarified.

2021-05-28  Jakub Jelinek  <jakub@redhat.com>

PR middle-end/99928
gcc/
* tree.h (OMP_CLAUSE_MAP_IMPLICIT): Define.
gcc/c-family/
* c-omp.c (c_omp_split_clauses): For reduction clause if combined with
target add a map tofrom clause with OMP_CLAUSE_MAP_IMPLICIT.
gcc/c/
* c-typeck.c (handle_omp_array_sections): Copy OMP_CLAUSE_MAP_IMPLICIT.
(c_finish_omp_clauses): Move not just OMP_CLAUSE_FIRSTPRIVATE_IMPLICIT
marked clauses last, but also OMP_CLAUSE_MAP_IMPLICIT.  Add
map_firstprivate_head bitmap, set it for GOMP_MAP_FIRSTPRIVATE_POINTER
maps and silently remove OMP_CLAUSE_FIRSTPRIVATE_IMPLICIT if it is
present too.  For OMP_CLAUSE_MAP_IMPLICIT silently remove the clause
if present in map_head, map_field_head or map_firstprivate_head
bitmaps.
gcc/cp/
* semantics.c (handle_omp_array_sections): Copy
OMP_CLAUSE_MAP_IMPLICIT.
(finish_omp_clauses): Move not just OMP_CLAUSE_FIRSTPRIVATE_IMPLICIT
marked clauses last, but also OMP_CLAUSE_MAP_IMPLICIT.  Add
map_firstprivate_head bitmap, set it for GOMP_MAP_FIRSTPRIVATE_POINTER
maps and silently remove OMP_CLAUSE_FIRSTPRIVATE_IMPLICIT if it is
present too.  For OMP_CLAUSE_MAP_IMPLICIT silently remove the clause
if present in map_head, map_field_head or map_firstprivate_head
bitmaps.
gcc/testsuite/
* c-c++-common/gomp/pr99928-8.c: Remove all xfails.
* c-c++-common/gomp/pr99928-9.c: Likewise.
* c-c++-common/gomp/pr99928-10.c: Likewise.
* c-c++-common/gomp/pr99928-16.c: New test.

3 years agoOpenMP: Add iterator support to Fortran's depend; add affinity clause
Tobias Burnus [Fri, 28 May 2021 08:01:19 +0000 (10:01 +0200)]
OpenMP: Add iterator support to Fortran's depend; add affinity clause

gcc/c-family/ChangeLog:

* c-pragma.h (enum pragma_omp_clause): Add PRAGMA_OMP_CLAUSE_AFFINITY.

gcc/c/ChangeLog:

* c-parser.c (c_parser_omp_clause_affinity): New.
(c_parser_omp_clause_name, c_parser_omp_variable_list,
c_parser_omp_all_clauses, OMP_TASK_CLAUSE_MASK): Handle affinity clause.
* c-typeck.c (handle_omp_array_sections_1, handle_omp_array_sections,
c_finish_omp_clauses): Likewise.

gcc/cp/ChangeLog:

* parser.c (cp_parser_omp_clause_affinity): New.
(cp_parser_omp_clause_name, cp_parser_omp_var_list_no_open,
cp_parser_omp_all_clauses, OMP_TASK_CLAUSE_MASK): Handle affinity
clause.
* semantics.c (handle_omp_array_sections_1, handle_omp_array_sections,
finish_omp_clauses): Likewise.

gcc/fortran/ChangeLog:

* dump-parse-tree.c (show_iterator): New.
(show_omp_namelist): Handle iterators.
(show_omp_clauses): Handle affinity.
* gfortran.h (gfc_free_omp_namelist): New union with 'udr' and new 'ns'.
* match.c (gfc_free_omp_namelist): Add are to choose union element.
* openmp.c (gfc_free_omp_clauses, gfc_match_omp_detach,
gfc_match_omp_clause_reduction, gfc_match_omp_flush): Update
call to gfc_free_omp_namelist.
(gfc_match_omp_variable_list): Likewise; permit preceeding whitespace.
(enum omp_mask1): Add OMP_CLAUSE_AFFINITY.
(gfc_match_iterator): New.
(gfc_match_omp_clauses): Use it; update call to gfc_free_omp_namelist.
(OMP_TASK_CLAUSES): Add OMP_CLAUSE_AFFINITY.
(gfc_match_omp_taskwait): Match depend clause.
(resolve_omp_clauses): Handle affinity; update for udr/union change.
(gfc_resolve_omp_directive): Resolve clauses of taskwait.
* st.c (gfc_free_statement): Update gfc_free_omp_namelist call.
* trans-openmp.c (gfc_trans_omp_array_reduction_or_udr): Likewise
(handle_iterator): New.
(gfc_trans_omp_clauses): Handle iterators for depend/affinity clause.
(gfc_trans_omp_taskwait): Handle depend clause.
(gfc_trans_omp_directive): Update call.

gcc/ChangeLog:

* gimplify.c (gimplify_omp_affinity): New.
(gimplify_scan_omp_clauses): Call it; remove affinity clause afterwards.
* tree-core.h (enum omp_clause_code): Add OMP_CLAUSE_AFFINITY.
* tree-pretty-print.c (dump_omp_clause): Handle OMP_CLAUSE_AFFINITY.
* tree.c (omp_clause_num_ops, omp_clause_code_name): Add clause.
(walk_tree_1): Handle OMP_CLAUSE_AFFINITY.

libgomp/ChangeLog:

* testsuite/libgomp.fortran/depend-iterator-2.f90: New test.

gcc/testsuite/ChangeLog:

* c-c++-common/gomp/affinity-1.c: New test.
* c-c++-common/gomp/affinity-2.c: New test.
* c-c++-common/gomp/affinity-3.c: New test.
* c-c++-common/gomp/affinity-4.c: New test.
* c-c++-common/gomp/affinity-5.c: New test.
* c-c++-common/gomp/affinity-6.c: New test.
* c-c++-common/gomp/affinity-7.c: New test.
* gfortran.dg/gomp/affinity-clause-1.f90: New test.
* gfortran.dg/gomp/affinity-clause-2.f90: New test.
* gfortran.dg/gomp/affinity-clause-3.f90: New test.
* gfortran.dg/gomp/affinity-clause-4.f90: New test.
* gfortran.dg/gomp/affinity-clause-5.f90: New test.
* gfortran.dg/gomp/affinity-clause-6.f90: New test.
* gfortran.dg/gomp/depend-iterator-1.f90: New test.
* gfortran.dg/gomp/depend-iterator-2.f90: New test.
* gfortran.dg/gomp/depend-iterator-3.f90: New test.
* gfortran.dg/gomp/taskwait.f90: New test.

3 years agoRecognize popcount also when a double width operation is needed.
Joern Rennecke [Fri, 28 May 2021 08:34:07 +0000 (09:34 +0100)]
Recognize popcount also when a double width operation is needed.

2021-05-28  Joern Rennecke  <joern.rennecke@riscy-ip.com>
gcc/
* match.pd <popcount & / + pattern matching>:
When generating popcount directly fails, try doing it in two halves.
gcc/testsuite/
* gcc.dg/tree-ssa/popcount4ll.c: Remove lp64 condition.
Adjust scanning pattern for !lp64.
* gcc.dg/tree-ssa/popcount5ll.c: Likewise.
* gcc.dg/tree-ssa/popcount4l.c: Adjust scanning pattern
for ! int32plus.

Co-Authored-By: Richard Biener <rguenther@suse.de>
3 years agoGenerate gimple-match.c and generic-match.c earlier
Bernd Edlinger [Fri, 28 May 2021 04:27:27 +0000 (06:27 +0200)]
Generate gimple-match.c and generic-match.c earlier

I was wondering, why gimple-match.c and generic-match.c
are not built early but always last, which slows down parallel
makes significantly.

The reason seems to be that generated_files does not
mention gimple-match.c and generic-match.c.

This comment in Makefile.in says it all:

"In order for parallel make to really start compiling the expensive
objects from $(OBJS) as early as possible, build all their
prerequisites strictly before all objects."

So this patch adds gimple-match.c and generic-match.c to generated_files.

2021-05-28  Bernd Edlinger  <bernd.edlinger@hotmail.de>

* Makefile.in (generated_files): Add gimple-match.c and
generic-match.c

3 years agoFix match_dup bug of define_cond_exec.
Joern Rennecke [Fri, 28 May 2021 06:46:28 +0000 (07:46 +0100)]
Fix match_dup bug of define_cond_exec.

2021-05-28  Joern Rennecke  <joern.rennecke@embecosm.com>

gcc/
* gensupport.c (alter_predicate_for_insn): Handle MATCH_DUP.

3 years agoFix bug in the define_subst handling that made match_scratch unusable for multi-alter...
Joern Rennecke [Fri, 28 May 2021 06:29:53 +0000 (07:29 +0100)]
Fix bug in the define_subst handling that made match_scratch unusable for multi-alternative patterns.

2021-05-28  Joern Rennecke  <joern.rennecke@embecosm.com>

gcc/
* gensupport.c (alter_constraints): Add MATCH_SCRATCH case.

3 years agoforwprop: Enhance vec perm fed by CTOR and CTOR/CST [PR99398]
Kewen Lin [Fri, 28 May 2021 06:11:45 +0000 (01:11 -0500)]
forwprop: Enhance vec perm fed by CTOR and CTOR/CST [PR99398]

VEC_PERM_EXPR requires the number of MASK elements must be the
same with the number of elements in operands V0 and V1.  In
some cases, like with Power altivec built-in function vec_perm,
VIEW_CONVERT_EXPR has to be used to guarantee this requirement,
but it can prevent some simplifications which don't consider
this well.

For the cases that the permutated operands of vector
permutation are from two same type CTOR and CTOR, or one CTOR
and one VECTOR CST, this patch is to enhance forwprop to look
through intermediate VIEW_CONVERT_EXPR and further simplify
them if possible.

Bootstrapped/regtested on powerpc64le-linux-gnu P9,
powerpc64-linux-gnu P8, x86_64-redhat-linux and
aarch64-linux-gnu.

gcc/ChangeLog:

PR tree-optimization/99398
* tree-ssa-forwprop.c (simplify_permutation): Optimize some cases
where the fed operands are CTOR/CST and propagated through
VIEW_CONVERT_EXPR.  Call vec_perm_indices::new_shrunk_vector.
* vec-perm-indices.c (vec_perm_indices::new_shrunk_vector): New
function.
* vec-perm-indices.h (vec_perm_indices::new_shrunk_vector): New
declare.

gcc/testsuite/ChangeLog:

PR tree-optimization/99398
* gcc.target/powerpc/vec-perm-ctor-run.c: New test.
* gcc.target/powerpc/vec-perm-ctor.c: New test.
* gcc.target/powerpc/vec-perm-ctor.h: New test.

3 years agoDaily bump.
GCC Administrator [Fri, 28 May 2021 00:16:38 +0000 (00:16 +0000)]
Daily bump.

3 years agogccgo.texi: remove HTML quoting
Ian Lance Taylor [Thu, 27 May 2021 22:32:28 +0000 (15:32 -0700)]
gccgo.texi: remove HTML quoting

* gccgo.texi (Function Names): Don't HTML quote ampersand.

3 years agoc++: Output less irrelevant info for function template decl [PR100716]
Matthias Kretz [Thu, 27 May 2021 15:25:37 +0000 (17:25 +0200)]
c++: Output less irrelevant info for function template decl [PR100716]

Ensure dump_template_decl for function templates never prints template
parameters after the function name (it did with -fno-pretty-templates)
and skip output of irrelevant & confusing "[with T = T]" in
dump_substitution.

gcc/cp/ChangeLog:

PR c++/100716
* error.c (dump_template_bindings): Include code to print
"[with" and ']', conditional on whether anything is printed at
all. This is tied to whether a semicolon is needed to separate
multiple template parameters. If the template argument repeats
the template parameter (T = T), then skip the parameter.
(dump_substitution): Moved code to print "[with" and ']' to
dump_template_bindings.
(dump_function_decl): Partial revert of PR50828, which masked
TFF_TEMPLATE_NAME for all of dump_function_decl. Now
TFF_TEMPLATE_NAME is masked for the scope of the function and
only carries through to dump_function_name.
(dump_function_name): Avoid calling dump_template_parms if
TFF_TEMPLATE_NAME is set.

gcc/testsuite/ChangeLog:

PR c++/100716
* g++.dg/diagnostic/pr100716.C: New test.
* g++.dg/diagnostic/pr100716-1.C: Same test with
-fno-pretty-templates.

3 years agoc++: Add missing scope in typedef diagnostic [PR100763]
Matthias Kretz [Thu, 27 May 2021 15:30:34 +0000 (17:30 +0200)]
c++: Add missing scope in typedef diagnostic [PR100763]

dump_type on 'const std::string' should not print 'const string' unless
TFF_UNQUALIFIED_NAME is requested.

gcc/cp/ChangeLog:

PR c++/100763
* error.c: Call dump_scope when printing a typedef.

3 years agolibgomp: Add openacc_{cuda,cublas,cudart} effective targets and use them in openacc...
Jakub Jelinek [Thu, 27 May 2021 20:44:36 +0000 (22:44 +0200)]
libgomp: Add openacc_{cuda,cublas,cudart} effective targets and use them in openacc testsuite

When gcc is configured for nvptx offloading with --without-cuda-driver
and full CUDA isn't installed, many libgomp.oacc-*/* tests fail,
some of them because cuda.h header can't be found, others because
the tests can't be linked against -lcuda, -lcudart or -lcublas.
I usually only have akmod-nvidia and xorg-x11-drv-nvidia-cuda rpms
installed, so libcuda.so.1 can be dlopened and the offloading works,
but linking against those libraries isn't possible nor are the
headers around (for the plugin itself there is the fallback
libgomp/plugin/cuda/cuda.h).

The following patch adds 3 new effective targets and uses them in tests that
needs those.

2021-05-27  Jakub Jelinek  <jakub@redhat.com>

* testsuite/lib/libgomp.exp (check_effective_target_openacc_cuda,
check_effective_target_openacc_cublas,
check_effective_target_openacc_cudart): New.
* testsuite/libgomp.oacc-fortran/host_data-4.f90: Require effective
target openacc_cublas.
* testsuite/libgomp.oacc-fortran/host_data-2.f90: Likewise.
* testsuite/libgomp.oacc-fortran/host_data-3.f: Likewise.
* testsuite/libgomp.oacc-c-c++-common/lib-91.c: Require effective
target openacc_cuda.
* testsuite/libgomp.oacc-c-c++-common/lib-70.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/lib-90.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/lib-75.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/lib-69.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/lib-74.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/lib-81.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/lib-72.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/lib-85.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/pr87835.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/lib-82.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/lib-73.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/lib-83.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/lib-78.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/lib-76.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/lib-84.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/lib-79.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/host_data-1.c: Require effective
targets openacc_cublas and openacc_cudart.
* testsuite/libgomp.oacc-c-c++-common/context-1.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/context-2.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/context-3.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/context-4.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/acc_get_property-nvptx.c:
Require effective target openacc_cudart.
* testsuite/libgomp.oacc-c-c++-common/asyncwait-1.c: Add -DUSE_CUDA_H
for effective target openacc_cuda and add && defined USE_CUDA_H to
preprocessor conditionals.  Guard -lcuda also on openacc_cuda
effective target.

3 years agoi386: Remove unneeded binary operand fixup from expanders.
Uros Bizjak [Thu, 27 May 2021 20:23:52 +0000 (22:23 +0200)]
i386: Remove unneeded binary operand fixup from expanders.

There is no need to call ix86_fixup_binary_operands when there are
only one or no memory operands allowed.

2021-05-27  Uroš Bizjak  <ubizjak@gmail.com>

gcc/
* config/i386/mmx.md (addv2sf3): Do not call
ix86_fixup_binary_operands_no_copy.
(subv2sf3): Ditto.
(mulv2sf3): Ditto.
(<smaxmin:code>v2sf3): Ditto.
(<plusminus:insn><MMXMODEI:mode>3): Ditto.
(<plusminus:insn><VI_32:mode>3): Remove expander.
(<plusminus:insn><VI_32:mode>3): Rename from
"*<plusminus:insn><VI_32:mode>3".
(mulv4hi): Do not call ix86_fixup_binary_operands_no_copy.
(mulv2hi3): Remove expander.
(mulv2hi3): Rename from *mulv2hi3.
(<s>mulv2hi3_highpart): Remove expander.
(<s>mulv2hi3_highpart): Rename from *<s>mulv2hi3_highpart.
(<smaxmin:code><MMXMODE14:mode>3): Rename from
"*mmx_<smaxmin:code><MMXMODE14:mode>3".
(<smaxmin:code><SMAXMIN_MMXMODEI:mode>3): Remove expander.
(SMAXMIN_MMXMODEI): Remove mode iterator.
(<smaxmin:code>v4hi3): New expander.
(<smaxmin:code>v4qi3): Rename from *<smaxmin:code>v4qi3.
(<smaxmin:code>v2hi3): Rename from *<smaxmin:code>v2hi3.
(<smaxmin:code><SMAXMIN_VI_32:mode>3): Remove expander.
(SMAXMIN_VI_32): Remove mode iterator.
(<umaxmin:code><MMXMODE24:mode>3): Rename from
"*mmx_<umaxmin:code><MMXMODE24:mode>3".
(<umaxmin:code><UMAXMIN_MMXMODEI:mode>3): Remove expander.
(UMAXMIN_MMXMODEI): Remove mode iterator.
(<umaxmin:code>v8qi3): New expander.
(<umaxmin:code>v4qi3): Rename from *<umaxmin:code>v4qi3.
(<umaxmin:code>v2hi3): Rename from *<umaxmin:code>v2hi3.
(<umaxmin:code><SMAXMIN_VI_32:mode>3): Remove expander.
(UMAXMIN_VI_32): Remove mode iterator.
(<any_shift:insn>v2hi3): Remove expander.
(<any_shift:insn>v2hi3): Rename from *<any_shift:insn>v2hi3.
(<any_logic:code><MMXMODEI:mode>3): Do not call
ix86_fixup_binary_operands_no_copy.
(<any_logic:code><VI_32:mode>3): Remove expander.
(<any_logic:code><VI_32:mode>3): Rename from
"*<any_logic:code><VI_32:mode>3".
(uavg<mode>3_ceil): Do not call ix86_fixup_binary_operands_no_copy.
* config/i386/sse.md (div<VF2:mode>3): Do not call
ix86_fixup_binary_operands_no_copy.
(div<VF1:mode>3): Ditto.
(<maxmin:code><VI8_AVX2_AVX512F:mode>3): Ditto.
(smulhrsv4hi3): Ditto.
(smulhrsv2hi3): Ditto.

3 years agoPR other/100463 - many errors using GTY and hash_map
Martin Sebor [Thu, 27 May 2021 19:37:43 +0000 (13:37 -0600)]
PR other/100463 - many errors using GTY and hash_map

gcc/ChangeLog:
* ggc.h (gt_ggc_mx): Add overloads for all integers.
(gt_pch_nx):  Same.
* hash-map.h (class hash_map): Add pch_nx_helper overloads for all
integers.
(hash_map::operator==): New function.

3 years agoc++: parameter pack inside static_assert [PR99893]
Patrick Palka [Thu, 27 May 2021 18:25:33 +0000 (14:25 -0400)]
c++: parameter pack inside static_assert [PR99893]

Here, we're not finding the parameter pack inside the static_assert because
STATIC_ASSERT trees are tcc_exceptional, and we weren't explicitly walking
them in cp_walk_subtrees.

PR c++/99893

gcc/cp/ChangeLog:

* tree.c (cp_walk_subtrees) <case STATIC_ASSERT>: New case.

gcc/testsuite/ChangeLog:

* g++.dg/cpp0x/static_assert17.C: New test.

3 years agoc++: argument pack with expansion [PR86355]
Jason Merrill [Wed, 26 May 2021 21:38:42 +0000 (17:38 -0400)]
c++: argument pack with expansion [PR86355]

This testcase revealed that we were using PACK_EXPANSION_EXTRA_ARGS a lot
more than necessary; use_pack_expansion_extra_args_p meant to use it in the
case of corresponding arguments in different argument packs differing in
whether they are pack expansions, but it was mistakenly also returning true
for the case of a single argument pack containing both expansion and
non-expansion elements.

Surprisingly, just disabling that didn't lead to any regressions in the
testsuite; it seems other changes have prevented us getting to this point
for code that used to exercise it.  So this patch limits the check to
arguments in the same position in the packs, and asserts that we never
actually see a mismatch.

PR c++/86355

gcc/cp/ChangeLog:

* pt.c (use_pack_expansion_extra_args_p): Don't compare
args from the same argument pack.

gcc/testsuite/ChangeLog:

* g++.dg/cpp0x/alias-decl-variadic2.C: New test.

3 years agoc++: Relax rule for non-type arguments in partial specs [CWG1315]
Patrick Palka [Thu, 27 May 2021 16:36:39 +0000 (12:36 -0400)]
c++: Relax rule for non-type arguments in partial specs [CWG1315]

This implements the wording changes of CWG 1315, which permits non-type
template arguments in a partial specialization to use template
parameters more freely.  Delightfully, it seems the only change needed
is to remove a single check from process_partial_specialization (amidst
a bunch of whitespace changes).

But that change alone revealed a latent problem with for_each_template_parm:
it ends up looking into some non-deduced contexts even when
include_nondeduced_p is false.  This causes us to silently accept some
partial specializations within the testsuite that contain non-deducible
non-type template parameters (and that were previously rejected due to
the rule that CWG 1315 relaxed).  For now this patch makes a minimal
amount of changes to for_each_template_parm_r so that we continue to
reject existing ill-formed partial specializations within the testsuite.
I opened PR c++/100779 to track this issue.

DR 1315
PR c++/67593
PR c++/96555

gcc/cp/ChangeLog:

* pt.c (process_partial_specialization): Don't error on a
non-simple non-type template argument that involves template
parameters.
(for_each_template_parm_r): Don't walk TRAIT_EXPR, PLUS_EXPR,
MULT_EXPR, or SCOPE_REF when include_nondeduced_p is false.

gcc/testsuite/ChangeLog:

* g++.dg/template/partial16.C: New test.
* g++.dg/template/partial17.C: New test.
* g++.dg/template/partial18.C: New test.
* g++.dg/template/partial19.C: New test.
* g++.dg/cpp0x/pr68724.C: Adjust expected diagnostic for
ill-formed partial specialization.
* g++.dg/cpp0x/variadic38.C: Likewise.
* g++.dg/cpp1z/pr81016.C: Likewise.
* g++.dg/template/partial5.C: Likewise.
* g++.old-deja/g++.pt/spec21.C: Likewise.

3 years agoi386: Add XOP comparisons for 4- and 8-byte vectors [PR100637]
Uros Bizjak [Thu, 27 May 2021 12:46:45 +0000 (14:46 +0200)]
i386: Add XOP comparisons for 4- and 8-byte vectors [PR100637]

2021-05-27  Uroš Bizjak  <ubizjak@gmail.com>

gcc/
PR target/100637
* config/i386/i386-expand.c (ix86_expand_int_sse_cmp):
For TARGET_XOP bypass SSE comparisons for all supported vector modes.
* config/i386/mmx.md (*xop_maskcmp<MMXMODEI:mode>3): New insn pattern.
(*xop_maskcmp<VI_32:mode>3): Ditto.
(*xop_maskcmp_uns<MMXMODEI:mode>3): Ditto.
(*xop_maskcmp_uns<VI_32:mode>3): Ditto.

3 years agoFortran: Fix erroneous "pointer argument is not associated" runtime error
Harald Anlauf [Thu, 27 May 2021 11:58:26 +0000 (13:58 +0200)]
Fortran: Fix erroneous "pointer argument is not associated" runtime error

For CLASS arrays we need to use the CLASS data attributes to determine
which runtime check to generate.

gcc/fortran/ChangeLog:

PR fortran/100602
* trans-intrinsic.c (gfc_conv_intrinsic_size): Use CLASS data
attributes for CLASS arrays for generation of runtime error.

gcc/testsuite/ChangeLog:

PR fortran/100602
* gfortran.dg/pointer_check_14.f90: New test.

3 years agoPR fortran/100656 - prevent ICE in gfc_conv_expr_present
Harald Anlauf [Thu, 27 May 2021 11:55:11 +0000 (13:55 +0200)]
PR fortran/100656 - prevent ICE in gfc_conv_expr_present

gcc/fortran/ChangeLog:

PR fortran/100656
* trans-array.c (gfc_conv_ss_startstride): Do not call check for
presence of a dummy argument when a symbol actually refers to a
non-dummy.

gcc/testsuite/ChangeLog:

PR fortran/100656
* gfortran.dg/bounds_check_22.f90: New test.

3 years agoarm: Remove use of opts_set in arm_configure_build_target [PR100767]
Richard Earnshaw [Thu, 27 May 2021 09:25:37 +0000 (10:25 +0100)]
arm: Remove use of opts_set in arm_configure_build_target [PR100767]

The variable global_options_set is a reflection of which options have
been explicitly set from the command line in the structure
global_options.  But it doesn't describe the contents of a
cl_target_option.  cl_target_option is a set of options to apply and
once configured should represent a viable set of options without
needing to know which were explicitly set by the user.

Unfortunately arm_configure_build_target was incorrectly conflating
the two.  Fortunately, however, we do not really need to know this
since the various override_options functions should have sanitized the
target_options values before constructing a cl_target_option
structure.  It is safe, therefore, to simply drop this parameter to
arm_configure_build_target and rely on checking that various string
parameters are non-null before dereferencing them.

gcc:

PR target/100767
* config/arm/arm.c (arm_configure_build_target): Remove parameter
opts_set, directly check opts parameters for being non-null.
(arm_option_restore): Update call to arm_configure_build_target.
(arm_option_override): Likewise.
(arm_can_inline_p): Likewise.
(arm_valid_target_attribute_tree): Likewise.
* config/arm/arm-c.c (arm_pragma_target_parse): Likewise.
* config/arm/arm-protos.h (arm_configure_build_target): Adjust
prototype.

3 years agoUse get_range_query in simplify_conversion_using_ranges.
Aldy Hernandez [Thu, 27 May 2021 08:43:11 +0000 (10:43 +0200)]
Use get_range_query in simplify_conversion_using_ranges.

Before the fix to the ranger dependency chain yesterday (commit
7f0cfeb1) I thought an ICE I was seeing was due to my get_range_query
patchet.  This was not the case, but this small change crept in while I
was debugging the failure.

I'm reverting the change as was approved.

Tested on x86-64 Linux.

gcc/ChangeLog:

* vr-values.c (simplify_conversion_using_ranges): Use
get_range_query instead of get_global_range_query.

3 years agoMove global range code to value-query.cc.
Aldy Hernandez [Wed, 26 May 2021 06:25:36 +0000 (08:25 +0200)]
Move global range code to value-query.cc.

This patch moves all the global range code from gimple-range.cc into
value-query.cc.  It also moves get_range_info and get_ptr_nonnull from
tree-ssanames.c into their only uses, and removes external access to them.

gcc/ChangeLog:

* gimple-range.cc (get_range_global): Move to value-query.cc.
(gimple_range_global): Same.
(get_global_range_query): Same.
(global_range_query::range_of_expr): Same.
* gimple-range.h (class global_range_query): Move to
value-query.h.
(gimple_range_global): Same.
* tree-ssanames.c (get_range_info): Move to value-query.cc.
(get_ptr_nonnull): Same.
* tree-ssanames.h (get_range_info): Remove.
(get_ptr_nonnull): Remove.
* value-query.cc (get_ssa_name_range_info): Move from
tree-ssanames.c.
(get_ssa_name_ptr_info_nonnull): Same.
(get_range_global): Move from gimple-range.cc.
(gimple_range_global): Same.
(get_global_range_query): Same.
(global_range_query::range_of_expr): Same.
* value-query.h (class global_range_query): Move from
gimple-range.h.
(gimple_range_global): Same.

3 years agoTweak Wstringop-overflow-55.c test.
Aldy Hernandez [Thu, 27 May 2021 07:32:42 +0000 (09:32 +0200)]
Tweak Wstringop-overflow-55.c test.

On x86-32 warn_ptrdiff_anti_range_add() and warn_int_anti_range()
degrade to the same function so ICF is folding the latter into a call
into the former.  This is causing no warnings to be emitted for
warn_int_anti_range.

Fixed by passing -fno-ipa-icf.

gcc/testsuite/ChangeLog:

* gcc.dg/Wstringop-overflow-55.c: Pass -fno-ipa-icf.

3 years agoi386: Add uavg_ceil patterns for 4-byte vectors [PR100637]
Uros Bizjak [Thu, 27 May 2021 07:22:01 +0000 (09:22 +0200)]
i386: Add uavg_ceil patterns for 4-byte vectors [PR100637]

2021-05-27  Uroš Bizjak  <ubizjak@gmail.com>

gcc/
PR target/100637
* config/i386/mmx.md (uavgv4qi3_ceil): New insn pattern.
(uavgv2hi3_ceil): Ditto.

gcc/testsuite/

PR target/100637
* gcc.target/i386/pr100637-3b.c (avgu): New test.
* gcc.target/i386/pr100637-3w.c (avgu): Ditto.

3 years agoDaily bump.
GCC Administrator [Thu, 27 May 2021 00:16:53 +0000 (00:16 +0000)]
Daily bump.

3 years agoSmall tweak to documentation of scalar_storage_order
Eric Botcazou [Wed, 26 May 2021 22:24:20 +0000 (00:24 +0200)]
Small tweak to documentation of scalar_storage_order

gcc/
PR c/100653
* doc/extend.texi (scalar_storage_order): Rephrase slightly.

3 years agoc++: access for hidden friend of nested class template [PR100502]
Patrick Palka [Wed, 26 May 2021 20:02:33 +0000 (16:02 -0400)]
c++: access for hidden friend of nested class template [PR100502]

Here, during ahead of time access checking for the private member
EnumeratorRange<T>::end_reached_ in the hidden friend f, we're triggering
the assert in enforce_access that verifies we're not trying to add a
access check for a dependent decl onto TI_DEFERRED_ACCESS_CHECKS.

The special thing about this class member access expression is that
the overall expression is non-dependent (so finish_class_member_access_expr
doesn't exit early at parse time), and then accessible_p rejects the
access (so we don't exit early from enforce access either, and end up
triggering the assert b/c the member itself is dependent).  I think
we're correct to reject the access because a hidden friend is not a
member function, so [class.access.nest] doesn't apply, and also a hidden
friend of a nested class is not a friend of the enclosing class.

To fix this ICE, this patch disables ahead of time access checking
during the member lookup in finish_class_member_access_expr.  This
avoids potentially pushing an access check for a dependent member onto
TI_DEFERRED_ACCESS_CHECKS, and it's safe because we're going to redo the
same lookup at instantiation time anyway.

PR c++/100502

gcc/cp/ChangeLog:

* typeck.c (finish_class_member_access_expr): Disable ahead
of time access checking during the member lookup.

gcc/testsuite/ChangeLog:

* g++.dg/template/access37.C: New test.
* g++.dg/template/access37a.C: New test.

3 years agolibstdc++: [_GLIBCXX_DEBUG] Enhance rendering of assert message
François Dumont [Sun, 9 May 2021 19:56:15 +0000 (21:56 +0200)]
libstdc++: [_GLIBCXX_DEBUG] Enhance rendering of assert message

Avoid building an intermediate buffer to print to stderr, push directly to stderr.

libstdc++-v3/ChangeLog:

* include/debug/formatter.h
(_Error_formatter::_Parameter::_Named): New.
(_Error_formatter::_Parameter::_Type): Inherit latter.
(_Error_formatter::_Parameter::_M_integer): Likewise.
(_Error_formatter::_Parameter::_M_string): Likewise.
* src/c++11/debug.cc: Include <cstring>.
(_Print_func_t): New.
(print_raw(PrintContext&, const char*, ptrdiff_t)): New.
(print_word): Use '%.*s' format in fprintf to render only expected number of chars.
(pretty_print(PrintContext&, const char*, _Print_func_t)): New.
(print_type): Rename in...
(print_type_info): ...this. Use pretty_print.
(print_address, print_integer): New.
(print_named_name, print_iterator_constness, print_iterator_state): New.
(print_iterator_seq_type): New.
(print_named_field, print_type_field, print_instance_field, print_iterator_field): New.
(print_field): Use latters.
(print_quoted_named_name, print_type_type, print_type, print_instance): New.
(print_string(PrintContext&, const char*, const _Parameter*, size_t)):
Change signature to...
(print_string(PrintContext&, const char*, ptrdiff_t, const _Parameter*, size_t)):
...this and adapt. Remove intermediate buffer to render input string.
(print_string(PrintContext&, const char*, ptrdiff_t)): New.

3 years agoCleanup get_range_info
Aldy Hernandez [Thu, 20 May 2021 10:23:49 +0000 (12:23 +0200)]
Cleanup get_range_info

Now that there is only one user of get_range_info() we can clean this up
to always return a range instead of pairs of wide_ints.

A follow-up patch will inline both get_range_info and get_ptr_nonnull
into its only remaining user.

gcc/ChangeLog:

* tree-ssanames.c (get_range_info): Merge both copies of
get_range_info into one that works with irange.
* tree-ssanames.h (get_range_info): Remove version that works on
wide_ints.

3 years agoConvert remaining passes to get_range_query.
Aldy Hernandez [Wed, 19 May 2021 16:44:08 +0000 (18:44 +0200)]
Convert remaining passes to get_range_query.

This patch converts the remaining users of get_range_info and
get_ptr_nonnull to the get_range_query API.

No effort was made to move passes away from VR_ANTI_RANGE, or any other
use of deprecated methods.  This was a straight up conversion to the new
API, nothing else.

gcc/ChangeLog:

* builtins.c (check_nul_terminated_array): Convert to get_range_query.
(expand_builtin_strnlen): Same.
(determine_block_size): Same.
* fold-const.c (expr_not_equal_to): Same.
* gimple-fold.c (size_must_be_zero_p): Same.
* gimple-match-head.c: Include gimple-range.h.
* gimple-pretty-print.c (dump_ssaname_info): Convert to get_range_query.
* gimple-ssa-warn-restrict.c
(builtin_memref::extend_offset_range): Same.
* graphite-sese-to-poly.c (add_param_constraints): Same.
* internal-fn.c (get_min_precision): Same.
* ipa-fnsummary.c (set_switch_stmt_execution_predicate): Same.
* ipa-prop.c (ipa_compute_jump_functions_for_edge): Same.
* match.pd: Same.
* tree-data-ref.c (split_constant_offset): Same.
(dr_step_indicator): Same.
* tree-dfa.c (get_ref_base_and_extent): Same.
* tree-scalar-evolution.c (iv_can_overflow_p): Same.
* tree-ssa-loop-niter.c (refine_value_range_using_guard): Same.
(determine_value_range): Same.
(record_nonwrapping_iv): Same.
(infer_loop_bounds_from_signedness): Same.
(scev_var_range_cant_overflow): Same.
* tree-ssa-phiopt.c (two_value_replacement): Same.
* tree-ssa-pre.c (insert_into_preds_of_block): Same.
* tree-ssa-reassoc.c (optimize_range_tests_to_bit_test): Same.
* tree-ssa-strlen.c (handle_builtin_stxncpy_strncat): Same.
(get_range): Same.
(dump_strlen_info): Same.
(set_strlen_range): Same.
(maybe_diag_stxncpy_trunc): Same.
(get_len_or_size): Same.
(handle_integral_assign): Same.
* tree-ssa-structalias.c (find_what_p_points_to): Same.
* tree-ssa-uninit.c (find_var_cmp_const): Same.
* tree-switch-conversion.c (bit_test_cluster::emit): Same.
* tree-vect-patterns.c (vect_get_range_info): Same.
(vect_recog_divmod_pattern): Same.
* tree-vrp.c (intersect_range_with_nonzero_bits): Same.
(register_edge_assert_for_2): Same.
(determine_value_range_1): Same.
* tree.c (get_range_pos_neg): Same.
* vr-values.c (vr_values::get_lattice_entry): Same.
(vr_values::update_value_range): Same.
(simplify_conversion_using_ranges): Same.

3 years agoConvert Walloca pass to get_range_query.
Aldy Hernandez [Wed, 19 May 2021 16:27:47 +0000 (18:27 +0200)]
Convert Walloca pass to get_range_query.

This patch converts the Walloca pass to use an on-demand ranger
accesible with get_range_query instead of having to create a ranger and pass
it around.

gcc/ChangeLog:

* gimple-ssa-warn-alloca.c (alloca_call_type): Use
  get_range_query instead of query argument.
(pass_walloca::execute): Enable and disable global ranger.

gcc/testsuite/ChangeLog:

* gcc.dg/Wstringop-overflow-55.c: Adapt for range query changes.
* gcc.dg/pr80776-1.c: Same.

3 years agoConvert evrp pass to get_range_query.
Aldy Hernandez [Tue, 25 May 2021 15:44:51 +0000 (17:44 +0200)]
Convert evrp pass to get_range_query.

gcc/ChangeLog:

* gimple-ssa-evrp.c (rvrp_folder::rvrp_folder): Call
enable_ranger.
(rvrp_folder::~rvrp_folder): Call disable_ranger.
(hybrid_folder::hybrid_folder): Call enable_ranger.
(hybrid_folder::~hybrid_folder): Call disable_ranger.

3 years agoCommon API for accessing global and on-demand ranges.
Aldy Hernandez [Wed, 19 May 2021 16:27:05 +0000 (18:27 +0200)]
Common API for accessing global and on-demand ranges.

This patch provides a generic API for accessing global ranges.  It is
meant to replace get_range_info() and get_ptr_nonnull() with one
common interface.  It uses the same API as the ranger (class
range_query), so there will now be one API for accessing local and
global ranges alike.

Follow-up patches will convert all users of get_range_info and
get_ptr_nonnull to this API.

For get_range_info, instead of:

  if (!POINTER_TYPE_P (TREE_TYPE (name)) && SSA_NAME_RANGE_INFO (name))
    get_range_info (name, vr);

You can now do:

  get_range_query (cfun)->range_of_expr (vr, name, [stmt]);

...as well as any other of the range_query methods (range_on_edge,
range_of_stmt, value_of_expr, value_on_edge, value_on_stmt, etc).

As per the API, range_of_expr will work on constants, SSA names, and
anything we support in irange::supports_type_p().

For pointers, the interface is the same, so instead of:

  else if (POINTER_TYPE_P (TREE_TYPE (name)) && SSA_NAME_PTR_INFO (name))
    {
      if (get_ptr_nonnull (name))
        stuff();
    }

One can do:

  get_range_query (cfun)->range_of_expr (vr, name, [stmt]);
  if (vr.nonzero_p ())
    stuff ();

Along with this interface, we are providing a mechanism by which a
pass can use an on-demand ranger transparently, without having to
change its code.  Of course, this assumes all get_range_info() and
get_ptr_nonnull() users have been converted to the new API, which
follow-up patches will do.

If a pass would prefer to use an on-demand ranger with finer grained
and context aware ranges, all it would have to do is call
enable_ranger() at the beginning of the pass, and disable_ranger() at
the end of the pass.

Note, that to use context aware ranges, any user of range_of_expr()
would need to pass additional context.  For example, the optional
gimple statement (or perhaps use range_on_edge or range_of_stmt).

The observant reader will note that get_range_query is tied to a
struct function, which may not be available in certain contexts, such
as at RTL time, gimple-fold, or some other places where we may or may
not have cfun set.

For cases where we are sure there is no function, you can use
get_global_range_query() instead of get_range_query(fun).  The API is
the same.

For cases where a function may be called with or without a function,
you could use the following idiom:

  range_query *query = cfun ? get_range_query (cfun)
    : get_global_range_query ();

  query->range_of_expr (range, expr, [stmt]);

The default range query obtained by get_range_query() is the global
range query, unless the user has enabled an on-demand ranger with
enable_ranger(), in which case it will use the currently active ranger.
That is, until disable_ranger() is called, at which point, we revert
back to global ranges.

We think this provides a generic way of accessing ranges, both
globally and locally, without having to keep track of types,
SSA_NAME_RANGE_INFO, and SSA_NAME_PTR_INFO.  We also hope this can be
used to transition passes from global to on-demand ranges when
appropriate.

gcc/ChangeLog:

* function.c (allocate_struct_function): Set cfun->x_range_query.
* function.h (struct function): Declare x_range_query.
(get_range_query): New.
(get_global_range_query): New.
* gimple-range-cache.cc (ssa_global_cache::ssa_global_cache):
Remove call to safe_grow_cleared.
* gimple-range.cc (get_range_global): New.
(gimple_range_global): Move from gimple-range.h.
(get_global_range_query): New.
(global_range_query::range_of_expr): New.
(enable_ranger): New.
(disable_ranger): New.
* gimple-range.h (gimple_range_global): Move to gimple-range.cc.
(class global_range_query): New.
(enable_ranger): New.
(disable_ranger): New.
* gimple-ssa-evrp.c (evrp_folder::~evrp_folder): Rename
dump_all_value_ranges to dump.
* tree-vrp.c (vrp_prop::finalize): Same.
* value-query.cc (range_query::dump): New.
* value-query.h (range_query::dump): New.
* vr-values.c (vr_values::dump_all_value_ranges): Rename to...
(vr_values::dump): ...this.
* vr-values.h (class vr_values): Rename dump_all_value_ranges to
dump and make virtual.

3 years agoi386: Autovectorize 4-byte vectors
Uros Bizjak [Wed, 26 May 2021 18:44:49 +0000 (20:44 +0200)]
i386: Autovectorize 4-byte vectors

2021-05-26  Uroš Bizjak  <ubizjak@gmail.com>

gcc/
* config/i386/i386.c (ix86_autovectorize_vector_modes):
Add V4QImode and V16QImode for TARGET_SSE2.
* doc/sourcebuild.texi (Vector-specific attributes):
Add vect64 and vect32 description.

gcc/testsuite/

* lib/target-supports.exp (check_effective_target_vect32): New.
(available_vector_sizes): Append 32 for x86 targets.
* gcc.dg/vect/pr71264.c (dg-final): Xfail scan dump for vect32 targets.
* gcc.dg/vect/slp-28.c (dg-final): Adjust dumps for vect32 targets.
* gcc.dg/vect/slp-3.c (dg-final): Ditto.

* gcc.target/i386/pr100637-3b.c: New test.
* gcc.target/i386/pr100637-3w.c: Ditto.
* gcc.target/i386/pr100637-4b.c: Ditto.
* gcc.target/i386/pr100637-4w.c: Ditto.

3 years agolibstdc++: Change [range.iter.op] functions to function objects [PR 100768]
Jonathan Wakely [Wed, 26 May 2021 16:32:53 +0000 (17:32 +0100)]
libstdc++: Change [range.iter.op] functions to function objects [PR 100768]

The standard specifies std::ranges::distance etc as function templates,
but it also requires them to not be found by ADL, and to suppress ADL
when normal unqualified lookup does find them. That means they need to
be function objects.

libstdc++-v3/ChangeLog:

PR libstdc++/100768
* include/bits/ranges_base.h (advance, distance, next, prev):
Replace function templates with function objects.
* testsuite/24_iterators/headers/iterator/synopsis_c++20.cc:
Adjust for changes to function objects.
* testsuite/std/ranges/adaptors/elements.cc: Add using
declarations for names from namespace ranges.
* testsuite/std/ranges/adaptors/transform.cc: Likewise.
* testsuite/24_iterators/range_operations/100768.cc: New test.

3 years agoFix gcc-bootstrap issue
Bernd Edlinger [Wed, 26 May 2021 16:45:09 +0000 (18:45 +0200)]
Fix gcc-bootstrap issue

... or at least try to.

2021-05-26  Bernd Edlinger  <bernd.edlinger@hotmail.de>

* gimple-range-gori.cc (range_def_chain::register_dependency):
Resize m_def_chain when needed.

3 years agoWarn on type punning that toggles scalar storage order
Eric Botcazou [Wed, 26 May 2021 17:12:05 +0000 (19:12 +0200)]
Warn on type punning that toggles scalar storage order

As documented in the manual, we do not support type punning that toggles
the scalar storage order, so this adds a warning for the case of unions.

gcc/c/
PR c/100653
* c-decl.c (finish_struct): Warn for a union containing an aggregate
field with a differing scalar storage order.
gcc/testsuite/
* gcc.dg/sso-13.c: New test.

3 years agoarm: Auto-vectorization for MVE: vaddv
Christophe Lyon [Fri, 21 May 2021 16:12:58 +0000 (16:12 +0000)]
arm: Auto-vectorization for MVE: vaddv

This patch adds support for the reduc_plus_scal optab with MVE, which
maps to the vaddv instruction.

It moves the reduc_plus_scal_<mode> expander from neon.md to
vec-common.md and adds support for MVE to it.

Since vaddv uses a 32-bits accumulator, we have to truncate it's
result.

For instance:
int32_t test__s8x16 (int8_t *a) {
  int i;
  int8_t result = 0;
  for (i=0; i<16; i++) {
    result += a[i];
  }
  return result;
}
is compiled into:
  vldrb.8 q3, [r0]
  vaddv.s8        r0, q3
  sxtb    r0, r0
  bx      lr

If we used uint8_t instead of int8_t, we still use vaddv.s8        r0, q3,
but truncate with uxtb    r0, r0.

2021-05-25  Christophe Lyon  <christophe.lyon@linaro.org>

gcc/
* config/arm/mve.md (mve_vaddvq_<supf><mode>): Prefix with '@'.
* config/arm/neon.md (reduc_plus_scal_<mode>): Move to ..
* config/arm/vec-common.md: .. here. Add support for MVE.

gcc/testsuite/
* gcc.target/arm/simd/mve-vaddv-1.c: New test.

3 years agoRemove useless register keywords
Jakub Jelinek [Wed, 26 May 2021 13:54:17 +0000 (15:54 +0200)]
Remove useless register keywords

This patch removes useless register keywords from several backends and one
spot in the Ada FE.

2021-05-26  Jakub Jelinek  <jakub@redhat.com>

gcc/
* config/epiphany/epiphany.c (epiphany_print_operand_address): Remove
register keywords.
* config/microblaze/microblaze.c (microblaze_legitimize_address,
call_internal1,
microblaze_option_override, print_operand): Likewise.
* config/microblaze/microblaze.md (call_internal_plt,
call_value_intern_plt, call_value_intern): Likewise.
* config/arm/aout.h (ASM_OUTPUT_ALIGN): Likewise.
* config/iq2000/iq2000.md (call_internal1, call_value_internal1,
call_value_multiple_internal1): Likewise.
* config/bfin/bfin.c (symbolic_reference_mentioned_p): Likewise.
gcc/ada/
* init.c (__gnat_error_handler): Remove register keyword.

3 years agoarc: Remove useless register keyword
Jan-Benedict Glaw [Wed, 26 May 2021 13:22:11 +0000 (15:22 +0200)]
arc: Remove useless register keyword

The "register" keyword was removed in C++17, remove them to get the backend
to build again.

gcc/
* config/arc/arc.c (arc_address_cost, arc_print_operand_address,
arc_ccfsm_advance, symbolic_reference_mentioned_p,
arc_raw_symbolic_reference_mentioned_p): Remove register
keyword.

3 years agoc++: constexpr and copy elision within mem init [PR100368]
Patrick Palka [Wed, 26 May 2021 12:37:30 +0000 (08:37 -0400)]
c++: constexpr and copy elision within mem init [PR100368]

In the testcase below, the member initializer b(f()) inside C's default
constructor is encoded as a TARGET_EXPR wrapping the CALL_EXPR f() in
C++17 mode.  During massaging of this constexpr constructor,
build_target_expr_with_type called from bot_manip on this initializer
tries to add an extra copy using B's implicitly deleted copy constructor
rather than just preserving the copy elision.

Since it's wrong to introduce an extra copy when initializing a
temporary from a CALL_EXPR, this patch makes build_target_expr_with_type
avoid calling force_rvalue in this case.  Additionally, bot_manip should
be copying TARGET_EXPRs in a more oblivious manner, so this patch makes
bot_manip use force_target_expr instead of build_target_expr_with_type.
And since bot_manip is now no longer a caller, we can remove the void
initializer handling in build_target_expr_with_type.

PR c++/100368

gcc/cp/ChangeLog:

* tree.c (build_target_expr_with_type): Don't call force_rvalue
on CALL_EXPR initializer.  Simplify now that bot_manip is no
longer a caller.
(bot_manip): Use force_target_expr instead of
build_target_expr_with_type.

gcc/testsuite/ChangeLog:

* g++.dg/cpp1z/elide6.C: New test.