platform/upstream/gcc.git
2 years agoshrink-wrapping: Fix up prologue block discovery [PR103860]
Jakub Jelinek [Thu, 30 Dec 2021 13:23:18 +0000 (14:23 +0100)]
shrink-wrapping: Fix up prologue block discovery [PR103860]

The following testcase is miscompiled, because a prologue which
contains subq $8, %rsp instruction is emitted at the start of
a basic block which contains conditional jump that depends on
flags register set in an earlier basic block, the prologue instruction
then clobbers those flags.
Normally this case is checked by can_get_prologue predicate, but this
is done only at the start of the loop.  If we update pro later in the
loop (because some bb shouldn't be duplicated) and then don't push
anything further into vec and the vec is already empty (this can happen
when the new pro is already in bb_with bitmask and either has no successors
(that is the case in the testcase where that bb ends with a trap) or
all the successors are already in bb_with, then the loop doesn't iterate
further and can_get_prologue will not be checked.

The following simple patch makes sure we call can_get_prologue even after
the last former iteration when vec is already empty and only break from
the loop afterwards (and only if the updating of pro done because of
!can_get_prologue didn't push anything into vec again).

2021-12-30  Jakub Jelinek  <jakub@redhat.com>

PR rtl-optimization/103860
* shrink-wrap.c (try_shrink_wrapping): Make sure can_get_prologue is
called on pro even if nothing further is pushed into vec.

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

2 years agoloop-invariant: Don't move cold bb instructions to preheader in RTL
Xionghu Luo [Thu, 30 Dec 2021 02:02:12 +0000 (20:02 -0600)]
loop-invariant: Don't move cold bb instructions to preheader in RTL

gcc/ChangeLog:

2021-12-30  Xionghu Luo  <luoxhu@linux.ibm.com>

* loop-invariant.c (find_invariants_bb): Check profile count
before motion.
(find_invariants_body): Add argument.

gcc/testsuite/ChangeLog:

2021-12-30  Xionghu Luo  <luoxhu@linux.ibm.com>

* gcc.dg/loop-invariant-2.c: New.

2 years agoDaily bump.
GCC Administrator [Thu, 30 Dec 2021 00:16:43 +0000 (00:16 +0000)]
Daily bump.

2 years agocompiler, libgo: don't pad sparc64-linux epollevent
Ian Lance Taylor [Wed, 29 Dec 2021 23:08:32 +0000 (15:08 -0800)]
compiler, libgo: don't pad sparc64-linux epollevent

Change the compiler to not add zero padding because of zero-sized
fields named "_", since those can't be referenced anyhow.

Change the sparc-linux64 epollevent struct to name the alignment
field "_", to avoid zero padding.

Fixes PR go/103847

PR go/103847
* godump.c (go_force_record_alignment): Name the alignment
field "_".

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/374914

2 years agotree-ssa-dce: Fix up -fcompare-debug failures in make_forwarders_with_degenerate_phis...
Jakub Jelinek [Wed, 29 Dec 2021 20:46:21 +0000 (21:46 +0100)]
tree-ssa-dce: Fix up -fcompare-debug failures in make_forwarders_with_degenerate_phis [PR103742]

make_forwarders_with_degenerate_phis causes a -fcompare-debug failure on the
following testcase.
The problem is that on:
  # iftmp.4_8 = PHI <&D.2582(6), &D.2583(4), &D.2582(7), &D.2583(5)>
the exact DECL_UIDs are different between -g and -g0 (which is ok, with -g
the decls can have larger gaps in between the uids), which means
iterative_hash_expr is different and because there are 2 pairs of edges
with matching phi arguments, the function processes them in different
orders.
The following patch fixes it by using the iterative_hash_expr order
only to determine which arguments are the same, then replaces the hashes
with the minimum dest_idx in the set of matching arguments and qsorts
again (which makes it stable for -fcompare-debug) and only splits edges etc.
on that stable order.
As a small optimization, if no arguments are equal, it doesn't do the
second qsort and continues, and if all arguments of the PHI are
constants or SSA_NAMEs (I think that is a pretty common case for many
PHIs), then it doesn't do the second qsort either, because in that case
the hash values will be stable, only computed from the constant values or
SSA_NAME_VERSIONs.

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

PR debug/103742
* tree-ssa-dce.c (make_forwarders_with_degenerate_phis): If any phi
argument is not CONSTANT_CLASS_P or SSA_NAME and any arguments are
equal, change second from hash value to lowest dest_idx from the
edges which have equal argument and resort to ensure -fcompare-debug
stability.

* g++.dg/opt/pr103742.C: New test.

2 years agoFortran: keep values of IEEE_CLASS_TYPE in sync
Francois-Xavier Coudert [Wed, 29 Dec 2021 20:32:57 +0000 (21:32 +0100)]
Fortran: keep values of IEEE_CLASS_TYPE in sync

Fortran 2018 added some synonyms to the existing values, namely
IEEE_NEGATIVE_SUBNORMAL (which is the same as IEEE_NEGATIVE_DENORMAL)
and IEEE_POSITIVE_SUBNORMAL (same as IEEE_POSITIVE_DENORMAL). When they
were added to the C side, they were not kept in sync with the Fortran
part of the library. Thew new values are not used (yet), so it is
currently harmless, but better fix it.

libgfortran/ChangeLog:

* ieee/ieee_helper.c: Fix enum values.

2 years agoLTO: Prune some warnings in the testsuite
Francois-Xavier Coudert [Mon, 27 Dec 2021 00:13:59 +0000 (01:13 +0100)]
LTO: Prune some warnings in the testsuite

Warnings like:

    warning: using serial compilation of 2 LTRANS jobs
    warning: visibility attribute not supported in this configuration; ignored\[^\n\]*" $text "" text

are pruned by lto.exp, but not for LTO testcases when run in other parts
of the testsuite. They will be, now.

gcc/testsuite/ChangeLog:

PR testsuite/47334
PR testsuite/103823
* lib/prune.exp: Prune some warnings related to LTO and
visibility.

2 years agoFortran: avoid several NULL pointer dereferences during error recovery
Harald Anlauf [Mon, 27 Dec 2021 22:06:18 +0000 (23:06 +0100)]
Fortran: avoid several NULL pointer dereferences during error recovery

gcc/fortran/ChangeLog:

PR fortran/102332
* expr.c (gfc_get_variable_expr): Avoid NULL pointer dereferences
during handling of errors with invalid uses of CLASS variables.
* match.c (select_type_set_tmp): Likewise.
* primary.c (gfc_match_varspec): Likewise.
* resolve.c (resolve_variable): Likewise.
(resolve_select_type): Likewise.

gcc/testsuite/ChangeLog:

PR fortran/102332
* gfortran.dg/pr102332.f90: New test.

2 years agoSupport ld.mold linker.
Martin Liska [Tue, 21 Dec 2021 16:43:55 +0000 (17:43 +0100)]
Support ld.mold linker.

gcc/ChangeLog:

* collect2.c (main): Add ld.mold.
* common.opt: Add -fuse-ld=mold.
* doc/invoke.texi: Document it.
* gcc.c (driver_handle_option): Handle -fuse-ld=mold.
* opts.c (common_handle_option): Likewise.

2 years agoi386: Robustify some expanders w.r.t. paradoxical SUBREGs
Uros Bizjak [Wed, 29 Dec 2021 08:34:32 +0000 (09:34 +0100)]
i386: Robustify some expanders w.r.t. paradoxical SUBREGs

lowpart_subreg might fail in some cases when trying to create paradoxical
SUBREGs.  Use force_reg on input operand, use new temporary output operand
and emit move into the destination afterwards.

Also, replace simplify_gen_subreg (Mx, op, My, 0)
with equivalent lowpart_subreg (Mx, op, My).

2021-12-29  Uroš Bizjak  <ubizjak@gmail.com>

gcc/ChangeLog:

* config/i386/sse.md (vec_pack<floatprefix>_float_<mode>):
Perform gen_avx512dq_float<floatunssuffix>v2div2sf2 into a
pseudo and emit move insn into operands[0].
(fix<fixunssuffix>_truncv2sfv2di2): Use lowpart_subreg
instead of simplify_gen_subreg.
(trunc<mode><pmov_dst_3_lower>2): Perform
gen_avx512vl_truncate<mode>v<ssescalarnum>qi2 into a
pseudo and emit move insn into operands[0].
(trunc<mode><pmov_dst_4_lower>2): Perform
gen_avx512vl_truncate<mode>v<ssescalarnum>hi2 into a
pseudo and emit move insn into operands[0].
(truncv2div2si2): Perform gen_avx512vl_truncatev2div2si2 into a
pseudo and emit move insn into operands[0].
(truncv8div8qi2): Perform gen_avx512f_truncatev8div16qi2 into a
pseudo and emit move insn into operands[0].
(<any_extend:insn>v8qiv8hi2): Use lowpart_subreg
instead of simplify_gen_subreg.
(<any_extend:insn>v8qiv8si2): Ditto.
(<any_extend:insn>v4qiv4si2): Ditto.
(<any_extend:insn>v4hiv4si2): Ditto.
(<any_extend:insn>v8qiv8di2): Ditto.
(<any_extend:insn>v4qiv4di2): Ditto.
(<any_extend:insn>v2qiv2di2): Ditto.
(<any_extend:insn>v4hiv4di2): Ditto.
(<any_extend:insn>v2hiv2di2): Ditto.
(<any_extend:insn>v2siv2di2): Ditto.

2 years agoFix ICE in lsplit when built with -O3 -fno-guess-branch-probability [PR103793]
Xionghu Luo [Wed, 29 Dec 2021 01:09:14 +0000 (19:09 -0600)]
Fix ICE in lsplit when built with -O3 -fno-guess-branch-probability [PR103793]

no-guess-branch-probability option requires profile_count scaling with
initialized_p guard, use multiply instead of apply_scale, which will do
the right thing to undefined probabilities and will not cause unnecesary
roundoff errors and precision info loss.
Also merge the missed part of r12-6086 of factor out function to avoid
duplicate code.

Regression testest pass on Power and X86.

gcc/ChangeLog:

PR tree-optimization/103793
* tree-ssa-loop-split.c (fix_loop_bb_probability): New function.
(split_loop): Use multiply to scale loop1's exit probability.
(do_split_loop_on_cond): Call fix_loop_bb_probability.

gcc/testsuite/ChangeLog:

PR tree-optimization/103793
* gcc.dg/pr103793.c: New test.

2 years agoDaily bump.
GCC Administrator [Wed, 29 Dec 2021 00:16:34 +0000 (00:16 +0000)]
Daily bump.

2 years agoLibbacktrace: Fix the use of newline in sed replacement
Francois-Xavier Coudert [Tue, 28 Dec 2021 22:28:49 +0000 (23:28 +0100)]
Libbacktrace: Fix the use of newline in sed replacement

On non-ELF targets, the Makefile needs a newline inside the sed REPLACE
string. The way it is currently done fails with GNU Make < 4, but GCC
only requires "GNU make version 3.80 (or later)".

The portable solution is given in the autoconf manual:
https://www.gnu.org/software/autoconf/manual/autoconf-2.69/html_node/Newlines-in-Make-Rules.html

libbacktrace/ChangeLog:

PR libbacktrace/103822

* Makefile.am: Fix newline.
* Makefile.in: Regenerate.

2 years agoFortran: Emit correct types for CHARACTER(C_CHAR), VALUE arguments
Francois-Xavier Coudert [Sun, 26 Dec 2021 19:18:01 +0000 (20:18 +0100)]
Fortran: Emit correct types for CHARACTER(C_CHAR), VALUE arguments

Make the front-end emit the right type for CHARACTER(C_CHAR), VALUE
arguments to BIND(C) procedures. They are scalar integers of C type
char, and should be emitted as such. They are not strings or arrays,
and are not promoted to C int, either.

gcc/fortran/ChangeLog:

PR fortran/103828
* trans-decl.c (generate_local_decl): Do not call
gfc_conv_scalar_char_value(), but check the type tree.
* trans-expr.c (gfc_conv_scalar_char_value): Rename to
conv_scalar_char_value, do not alter type tree.
(gfc_conv_procedure_call): Adjust call to renamed
conv_scalar_char_value() function.
* trans-types.c (gfc_sym_type): Take care of
CHARACTER(C_CHAR), VALUE arguments.
* trans.h (gfc_conv_scalar_char_value): Remove prototype.

gcc/testsuite/ChangeLog:

PR fortran/103828
* gfortran.dg/c_char_tests_3.f90: New file.
* gfortran.dg/c_char_tests_3_c.c: New file.
* gfortran.dg/c_char_tests_4.f90: New file.
* gfortran.dg/c_char_tests_5.f90: New file.

2 years agoc++: ICE on enum with bool value [PR99968]
Jason Merrill [Tue, 28 Dec 2021 04:46:13 +0000 (23:46 -0500)]
c++: ICE on enum with bool value [PR99968]

BOOLEAN_TYPE also counts as integral, so verify_type should allow it.

PR c++/99968

gcc/ChangeLog:

* tree.c (verify_type): Allow enumerator with BOOLEAN_TYPE.

gcc/testsuite/ChangeLog:

* g++.dg/ext/is_enum2.C: New test.

2 years agofold-const: Fix up fold_truth_andor_1 shift handling [PR103813]
Jakub Jelinek [Tue, 28 Dec 2021 16:41:24 +0000 (17:41 +0100)]
fold-const: Fix up fold_truth_andor_1 shift handling [PR103813]

Some time ago I've changed const_binop -> wide_int_binop, so that it punts
on shifts by negative count.  fold_truth_andor_1 doesn't check the results
of const_binop (?SHIFT_EXPR, ) though and assumes they will be always
non-NULL, which is no longer the case.

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

PR middle-end/103813
* fold-const.c (fold_truth_andor_1): Punt of const_binop LSHIFT_EXPR
or RSHIFT_EXPR returns NULL.  Formatting fix.

* gcc.c-torture/compile/pr103813.c: New test.

2 years agoloop-invariant: Fix -fcompare-debug failure [PR103837]
Jakub Jelinek [Tue, 28 Dec 2021 16:40:17 +0000 (17:40 +0100)]
loop-invariant: Fix -fcompare-debug failure [PR103837]

In the following testcase we have a -fcompare-debug failure, because
can_move_invariant_reg doesn't ignore DEBUG_INSNs in its decisions.
In the testcase we have due to uninitialized variable:
  loop_header
    debug_insn using pseudo84
    pseudo84 = invariant
    insn using pseudo84
  end loop
and with -g decide not to move the pseudo84 = invariant before the
loop header; in this case not resetting the debug insns might be fine.
But, we could have also:
  pseudo84 = whatever
  loop_header
    debug_insn using pseudo84
    pseudo84 = invariant
    insn using pseudo84
  end loop
and in that case not resetting the debug insns would result in wrong-debug.
And, we don't really have generally a good substitution on what pseudo84
contains, it could inherit various values from different paths.
So, the following patch ignores DEBUG_INSNs in the decisions, and if there
are any that previously prevented the optimization, resets them before
return true.

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

PR rtl-optimization/103837
* loop-invariant.c (can_move_invariant_reg): Ignore DEBUG_INSNs in
the decisions whether to return false or continue and right before
returning true reset those debug insns that previously caused
returning false.

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

2 years agooptabs: Fix up checking for CALLs in newly added code by double-word divmod [PR103838]
Jakub Jelinek [Tue, 28 Dec 2021 16:39:23 +0000 (17:39 +0100)]
optabs: Fix up checking for CALLs in newly added code by double-word divmod [PR103838]

These two spots are meant to punt if the newly added code contains
any CALL_INSNs, because in that case having a large sequence of insns
that also calls something is undesirable, better have one call that
is optimized in itself well.
The functions do last = get_last_insn (); before emitting any insns
(and expand_binop as the ultimate caller uses delete_insns_since if
the expansion fails), but the checks were incorrect for 2 reasons:
1) it checked not just what follows after that last insn, but also
   the last insn itself; so, if the division or modulo is immediately
   preceded by a CALL_INSN, then we punt; this also causes -fcompare-debug
   failures if the CALL_INSN is with -g followed by one or more DEBUG_INSNs
2) if get_last_insn () is NULL (i.e. emitting into a new sequence), then
   we didn't check anything

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

PR debug/103838
* optabs.c (expand_doubleword_mod, expand_doubleword_divmod): Only
check newly added insns for CALL_P, not the last insn of previous
code.

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

2 years agodocs: Use https in manual.
Martin Liska [Tue, 28 Dec 2021 10:11:45 +0000 (11:11 +0100)]
docs: Use https in manual.

gcc/d/ChangeLog:

* gdc.texi: Use one more https.

2 years agodriver: Improve option diagnostics [PR103465]
Martin Liska [Fri, 10 Dec 2021 08:58:52 +0000 (09:58 +0100)]
driver: Improve option diagnostics [PR103465]

It happens that options are parsed and various diagnostics happen
in finish_options. That's a proper place as the function is also called
for optimize/target attributes (pragmas). However, it is possible that
target overwrites an option from command line and so the diagnostics
does not happen. That's fixed in the patch.

- options are parsed and finish_options is called:

  if (opts->x_flag_unwind_tables
      && !targetm_common.unwind_tables_default
      && opts->x_flag_reorder_blocks_and_partition
      && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
    {
      if (opts_set->x_flag_reorder_blocks_and_partition)
        inform (loc,
"%<-freorder-blocks-and-partition%> does not support "
"unwind info on this architecture");
      opts->x_flag_reorder_blocks_and_partition = 0;
      opts->x_flag_reorder_blocks = 1;
    }

It's not triggered because of opts->x_flag_unwind_tables is false by default, but
the option is overwritten in target:

...
  if (TARGET_64BIT_P (opts->x_ix86_isa_flags))
    {
      if (opts->x_optimize >= 1)
SET_OPTION_IF_UNSET (opts, opts_set, flag_omit_frame_pointer,
     !USE_IX86_FRAME_POINTER);
      if (opts->x_flag_asynchronous_unwind_tables
  && TARGET_64BIT_MS_ABI)
SET_OPTION_IF_UNSET (opts, opts_set, flag_unwind_tables, 1);
...

PR driver/103465

gcc/ChangeLog:

* opts.c (finish_options): More part of diagnostics to ...
(diagnose_options): ... here. Call the function from both
finish_options and process_options.
* opts.h (diagnose_options): Declare.
* toplev.c (process_options): Call diagnose_options.

2 years agodocs: replace http:// with https://
Martin Liska [Wed, 22 Dec 2021 12:55:28 +0000 (13:55 +0100)]
docs: replace http:// with https://

I replaced and verified http:// links for various domains.

gcc/ada/ChangeLog:

* doc/share/gnu_free_documentation_license.rst: Replace http:// with https.
* gnat-style.texi: Likewise.
* gnat_rm.texi: Likewise.
* gnat_ugn.texi: Likewise.

gcc/d/ChangeLog:

* gdc.texi: Replace http:// with https.

gcc/ChangeLog:

* doc/contrib.texi: Replace http:// with https.
* doc/contribute.texi: Likewise.
* doc/extend.texi: Likewise.
* doc/gccint.texi: Likewise.
* doc/gnu.texi: Likewise.
* doc/implement-c.texi: Likewise.
* doc/implement-cxx.texi: Likewise.
* doc/include/fdl.texi: Likewise.
* doc/include/gpl_v3.texi: Likewise.
* doc/install.texi: Likewise.
* doc/invoke.texi: Likewise.
* doc/passes.texi: Likewise.
* doc/service.texi: Likewise.
* doc/sourcebuild.texi: Likewise.
* doc/standards.texi: Likewise.

gcc/fortran/ChangeLog:

* gfortran.texi: Replace http:// with https.
* intrinsic.texi: Likewise.

gcc/go/ChangeLog:

* gccgo.texi: Replace http:// with https.

gcc/jit/ChangeLog:

* docs/_build/texinfo/libgccjit.texi: Replace http:// with https.
* docs/cp/index.rst: Likewise.
* docs/cp/intro/index.rst: Likewise.
* docs/cp/intro/tutorial01.rst: Likewise.
* docs/cp/intro/tutorial02.rst: Likewise.
* docs/cp/intro/tutorial03.rst: Likewise.
* docs/cp/intro/tutorial04.rst: Likewise.
* docs/cp/topics/asm.rst: Likewise.
* docs/cp/topics/compilation.rst: Likewise.
* docs/cp/topics/contexts.rst: Likewise.
* docs/cp/topics/expressions.rst: Likewise.
* docs/cp/topics/functions.rst: Likewise.
* docs/cp/topics/index.rst: Likewise.
* docs/cp/topics/locations.rst: Likewise.
* docs/cp/topics/objects.rst: Likewise.
* docs/cp/topics/types.rst: Likewise.
* docs/index.rst: Likewise.
* docs/internals/index.rst: Likewise.
* docs/intro/index.rst: Likewise.
* docs/intro/tutorial01.rst: Likewise.
* docs/intro/tutorial02.rst: Likewise.
* docs/intro/tutorial03.rst: Likewise.
* docs/intro/tutorial04.rst: Likewise.
* docs/intro/tutorial05.rst: Likewise.
* docs/topics/asm.rst: Likewise.
* docs/topics/compatibility.rst: Likewise.
* docs/topics/compilation.rst: Likewise.
* docs/topics/contexts.rst: Likewise.
* docs/topics/expressions.rst: Likewise.
* docs/topics/function-pointers.rst: Likewise.
* docs/topics/functions.rst: Likewise.
* docs/topics/index.rst: Likewise.
* docs/topics/locations.rst: Likewise.
* docs/topics/objects.rst: Likewise.
* docs/topics/performance.rst: Likewise.
* docs/topics/types.rst: Likewise.

2 years agoi386: Fix handling of SUBREGs in divv2sf3 [PR103842]
Jakub Jelinek [Tue, 28 Dec 2021 09:58:43 +0000 (10:58 +0100)]
i386: Fix handling of SUBREGs in divv2sf3 [PR103842]

register_operand predicate allows not just REGs, but also SUBREGs of REGs,
and for the latter lowpart_subreg might FAIL when trying to create paradoxical
SUBREG in some cases.  For the input operand fixed by force_reg on it first,
for the output operand handled by always dividing into a fresh V4SFmode temporary
and emit_move_insn into the destination afterwards, that is also beneficial for
combine.

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

PR target/103842
* config/i386/mmx.md (divv2sf3): Use force_reg on op1.  Always perform
divv4sf3 into a pseudo and emit_move_insn into operands[0].

* g++.dg/opt/pr103842.C: New test.

2 years agoFix tdpbf16ps testcase
Haochen Jiang [Fri, 24 Dec 2021 05:55:06 +0000 (13:55 +0800)]
Fix tdpbf16ps testcase

gcc/testsuite/ChangeLog:

* gcc.target/i386/amx-check.h (check_float_tile_register):
New check function for float to prevent precision loss.
* gcc.target/i386/amxbf16-dpbf16ps-2.c: Correct the type convert
and byte offset. Use the new check function.

2 years agoDaily bump.
GCC Administrator [Tue, 28 Dec 2021 00:16:37 +0000 (00:16 +0000)]
Daily bump.

2 years agoFortran: fix use of static_assert() to conform to C11
Francois-Xavier Coudert [Mon, 27 Dec 2021 20:32:08 +0000 (21:32 +0100)]
Fortran: fix use of static_assert() to conform to C11

libgfortran/ChangeLog:

PR libfortran/98076
* runtime/string.c (gfc_itoa): Use two args for static_assert().

2 years agoImprove atomic store implementation on hppa-linux.
John David Anglin [Mon, 27 Dec 2021 17:56:19 +0000 (17:56 +0000)]
Improve atomic store implementation on hppa-linux.

2021-12-27  John David Anglin  <danglin@gcc.gnu.org>

gcc/ChangeLog:

* config/pa/pa-protos.h: Delete
pa_maybe_emit_compare_and_swap_exchange_loop() declaration.
* config/pa/pa.c (pa_expand_compare_and_swap_loop): Delete.
(pa_maybe_emit_compare_and_swap_exchange_loop): Delete.
* config/pa/pa.md (atomic_storeq): Use __sync_lock_test_and_set
instead of pa_maybe_emit_compare_and_swap_exchange_loop.
(atomic_storehi, atomic_storesi, atomic_storedi): Likewise.

2 years agoc++: Add testcase for SFINAE w/ p[N] and incomplete type [PR101239]
Patrick Palka [Mon, 27 Dec 2021 15:01:42 +0000 (10:01 -0500)]
c++: Add testcase for SFINAE w/ p[N] and incomplete type [PR101239]

The r12-6123 fix for SFINAE with p+N and incomplete type also fixed
the analogous issue with p[N].

PR c++/101239

gcc/testsuite/ChangeLog:

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

2 years agoc++: hard error w/ ptr+N and incomplete type [PR103700]
Patrick Palka [Mon, 27 Dec 2021 14:05:17 +0000 (09:05 -0500)]
c++: hard error w/ ptr+N and incomplete type [PR103700]

In pointer_int_sum when called from a SFINAE context, we need to avoid
calling size_in_bytes_loc on an incomplete pointed-to type since this
latter function isn't SFINAE-enabled and always emits an error on such
input.

PR c++/103700

gcc/c-family/ChangeLog:

* c-common.c (pointer_int_sum): When quiet, return
error_mark_node for an incomplete pointed-to type and don't
call size_in_bytes_loc.

gcc/testsuite/ChangeLog:

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

2 years agoix86: Don't use the 'm' constraint for x86_64_general_operand
H.J. Lu [Sun, 19 Dec 2021 16:47:03 +0000 (08:47 -0800)]
ix86: Don't use the 'm' constraint for x86_64_general_operand

The 'm' constraint is defined with define_memory_constraint which allows
LRA to convert the operand to the form '(mem (reg X))', where X is a
base register.  To prevent LRA from generating '(mem (reg X))' from a
register:

1. Add a 'BM' constraint which is similar to the 'm' constraint, but
is defined with define_constraint.
2. Add a 'm' mode attribute which is mapped to the 'm' constraint for
general_operand and the 'BM' constraint for x86_64_general_operand.
3. Replace the 'm' constraint on <general_operand> with the '<m>'
constraint.
4. Replace the 'm' constraint on x86_64_general_operand with the 'BM'
constraint.

gcc/

PR target/103762
* config/i386/constraints.md (BM): New constraint.
* config/i386/i386.md (m): New mode attribute.
Replace the 'm' constraint on <general_operand> with the '<m>'
constraint.
Replace the 'm' constraint on x86_64_general_operand with the
'BM' constraint.

gcc/testsuite/

* gcc.target/i386/pr103762-1a.c: New test.
* gcc.target/i386/pr103762-1b.c: Likewise.
* gcc.target/i386/pr103762-1c.c: Likewise.

2 years agotestsuite: Avoid unwanted vecorization [PR95046]
Uros Bizjak [Mon, 27 Dec 2021 09:00:28 +0000 (10:00 +0100)]
testsuite: Avoid unwanted vecorization [PR95046]

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

gcc/testsuite/ChangeLog:

PR target/95046
* gfortran.dg/extract_recip_1.f: Adjust testcase.

2 years agoRISC-V: fixed testcase riscv/pr103302.c
LiaoShihua [Mon, 27 Dec 2021 04:03:08 +0000 (12:03 +0800)]
RISC-V: fixed testcase riscv/pr103302.c

Because riscv32 not support __int128, so skip if -march=rv32*.

gcc/testsuite/ChangeLog:
* gcc.target/riscv/pr103302.c: skip if -march=rv32*

2 years agoDaily bump.
GCC Administrator [Mon, 27 Dec 2021 00:16:20 +0000 (00:16 +0000)]
Daily bump.

2 years agoi386: Check AX input in any_mul_highpart peepholes
H.J. Lu [Fri, 24 Dec 2021 20:50:21 +0000 (12:50 -0800)]
i386: Check AX input in any_mul_highpart peepholes

When applying peephole optimization to transform

mov imm, %reg0
mov %reg1, %AX_REG
imul %reg0

to

mov imm, %AX_REG
imul %reg1

disable peephole optimization if reg1 == AX_REG.

gcc/

PR target/103785
* config/i386/i386.md: Swap operand order in comments and check
AX input in any_mul_highpart peepholes.

gcc/testsuite/

PR target/103785
* gcc.target/i386/pr103785.c: New test.

2 years agoFortran: speed up decimal output of integers
Francois-Xavier Coudert [Sun, 26 Dec 2021 10:59:14 +0000 (11:59 +0100)]
Fortran: speed up decimal output of integers

libgfortran/ChangeLog:

PR libfortran/98076
* runtime/string.c (itoa64, itoa64_pad19): New helper functions.
(gfc_itoa): On targets with 128-bit integers, call fast
64-bit functions to avoid many slow divisions.

gcc/testsuite/ChangeLog:

PR libfortran/98076
* gfortran.dg/pr98076.f90: New test.

2 years agoDaily bump.
GCC Administrator [Sun, 26 Dec 2021 00:16:17 +0000 (00:16 +0000)]
Daily bump.

2 years agoFortran: simplify library code for integer-to-decimal conversion
Francois-Xavier Coudert [Sat, 25 Dec 2021 14:07:12 +0000 (15:07 +0100)]
Fortran: simplify library code for integer-to-decimal conversion

libgfortran/ChangeLog:

PR libfortran/81986
PR libfortran/99191

* libgfortran.h: Remove gfc_xtoa(), adjust gfc_itoa() and
GFC_ITOA_BUF_SIZE.
* io/write.c (write_decimal): conversion parameter is always
gfc_itoa(), so remove it. Protect from overflow.
(xtoa): Move gfc_xtoa and update its name.
(xtoa_big): Renamed from ztoa_big for consistency.
(write_z): Adjust to new function names.
(write_i, write_integer): Remove last arg of write_decimal.
* runtime/backtrace.c (error_callback): Comment on the use of
gfc_itoa().
* runtime/error.c (gfc_xtoa): Move to io/write.c.
* runtime/string.c (gfc_itoa): Take an unsigned argument,
remove the handling of negative values.

2 years agoDaily bump.
GCC Administrator [Sat, 25 Dec 2021 00:16:18 +0000 (00:16 +0000)]
Daily bump.

2 years agoi386: Add V2SFmode DIV insn pattern [PR95046, PR103797]
Uros Bizjak [Fri, 24 Dec 2021 16:09:36 +0000 (17:09 +0100)]
i386: Add V2SFmode DIV insn pattern [PR95046, PR103797]

Use V4SFmode "DIVPS X,Y" with [y0, y1, 1.0f, 1.0f] as a divisor
to avoid division by zero.

2021-12-24  Uroš Bizjak  <ubizjak@gmail.com>

gcc/ChangeLog:

PR target/95046
PR target/103797
* config/i386/mmx.md (divv2sf3): New instruction pattern.

gcc/testsuite/ChangeLog:

PR target/95046
PR target/103797
* gcc.target/i386/pr95046-1.c (test_div): Add.
(dg-options): Add -mno-recip.

2 years agoDarwin: Amend a comment to be more inclusive [NFC].
Iain Sandoe [Fri, 24 Dec 2021 10:59:35 +0000 (10:59 +0000)]
Darwin: Amend a comment to be more inclusive [NFC].

As per title.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
gcc/ChangeLog:

* config/darwin.c (darwin_override_options): Make a comment
more inclusive.

2 years agoDarwin: Update rules for handling alignment of globals.
Iain Sandoe [Mon, 20 Dec 2021 15:19:50 +0000 (15:19 +0000)]
Darwin: Update rules for handling alignment of globals.

The current rule was too strict and has not been required since Darwin11.

This relaxes the constraint to allow up to 2^28 alignment for non-common
entities.  Common is still restricted to a maximum aligment of 2^15.

When the host is an older version of Darwin ( earlier that 11 ) then the
existing constraint is still applied.  Note that this is a host constraint
not a target one (so that a compilation on 10.7 targeting 10.6 is allowed
to use a greater alignment than the tools on 10.6 support).  This matches
the behaviour of clang.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
gcc/ChangeLog:

* config.gcc: Emit L2_MAX_OFILE_ALIGNMENT with suitable
values for the host.
* config/darwin.c (darwin_emit_common): Error for alignment
values > 32768.
* config/darwin.h (MAX_OFILE_ALIGNMENT): Rework to use the
configured L2_MAX_OFILE_ALIGNMENT.

gcc/testsuite/ChangeLog:

* gcc.dg/darwin-aligned-globals.c: New test.
* gcc.dg/darwin-comm-1.c: New test.
* gcc.dg/attr-aligned.c: Amend for new alignment values on
Darwin.
* gcc.target/i386/pr89261.c: Likewise.

2 years agoDarwin: Check for that flag-reorder-and-partition.
Iain Sandoe [Fri, 10 Dec 2021 23:55:49 +0000 (23:55 +0000)]
Darwin: Check for that flag-reorder-and-partition.

We were checking whether the flag had been set by the user, but not if
it was set to true.  Which means that the check fails in its intent when
the user puts -fno-reorder-and-partition.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
gcc/ChangeLog:

* config/darwin.c (darwin_override_options): When checking for the
flag-reorder-and-partition case, also check that it is set on.

2 years agoDarwin: Define OBJECT_FORMAT_MACHO.
Iain Sandoe [Wed, 22 Dec 2021 14:00:25 +0000 (14:00 +0000)]
Darwin: Define OBJECT_FORMAT_MACHO.

There are places that we need to make different codegen depending
on the object format rather than on the arch.  We already have
definitions for ELF, COFF etc. this adds one for MACHO.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
gcc/ChangeLog:

* config/darwin.h (OBJECT_FORMAT_MACHO): New.

2 years agoDaily bump.
GCC Administrator [Fri, 24 Dec 2021 00:16:27 +0000 (00:16 +0000)]
Daily bump.

2 years agosmuldi3_highpart.c: Replace long with long long for -mx32
H.J. Lu [Thu, 23 Dec 2021 18:07:25 +0000 (10:07 -0800)]
smuldi3_highpart.c: Replace long with long long for -mx32

* gcc.target/i386/smuldi3_highpart.c: Replace long with long long.

2 years agox86: PR target/103773: Fix wrong-code with -Oz from pop to memory.
Roger Sayle [Thu, 23 Dec 2021 12:33:07 +0000 (12:33 +0000)]
x86: PR target/103773: Fix wrong-code with -Oz from pop to memory.

This is a fix to PR target/103773 where -Oz shouldn't use push/pop
on x86 to shrink writing small integer constants to memory.
Instead clang uses "andl $0, mem" for writing zero, and "orl $-1, mem"
when writing -1 to memory when using -Oz.  This patch implements this
via peephole2 where we can confirm that its ok to clobber the flags.

2021-12-23  Roger Sayle  <roger@nextmovesoftware.com>
    Uroš Bizjak  <ubizjak@gmail.com>

gcc/ChangeLog
PR target/103773
* config/i386/i386.md (*mov<mode>_and): New define_insn for
writing a zero to memory using AND.
(*mov<mode>_or): Extend to allow memory destination and HImode.
(*movdi_internal): Remove -Oz push/pop optimization from here.
(*movsi_internal): Likewise.
(peephole2): Perform -Oz push/pop optimization here, only for
register destinations, values other than zero, and in functions
that don't used the red zone.
(peephole2): With -Oz, convert writes of 0 or -1 to memory into
their clobber forms, i.e. *mov<mode>_and and *mov<mode>_or resp.

gcc/testsuite/ChangeLog
PR target/103773
* gcc.target/i386/pr103773-2.c: New test case.
* gcc.target/i386/pr103773.c: New test case.

2 years agoi386: Enable intrinsics that convert float and bf16 data to each other.
konglin1 [Tue, 7 Dec 2021 09:08:23 +0000 (17:08 +0800)]
i386: Enable intrinsics that convert float and bf16 data to each other.

gcc/ChangeLog:

* config/i386/avx512bf16intrin.h (_mm_cvtsbh_ss): Add new intrinsic.
(_mm512_cvtpbh_ps): Likewise.
(_mm512_maskz_cvtpbh_ps): Likewise.
(_mm512_mask_cvtpbh_ps): Likewise.
* config/i386/avx512bf16vlintrin.h (_mm_cvtness_sbh): Likewise.
(_mm_cvtpbh_ps): Likewise.
(_mm256_cvtpbh_ps): Likewise.
(_mm_maskz_cvtpbh_ps): Likewise.
(_mm256_maskz_cvtpbh_ps): Likewise.
(_mm_mask_cvtpbh_ps): Likewise.
(_mm256_mask_cvtpbh_ps): Likewise.

gcc/testsuite/ChangeLog:

* gcc.target/i386/avx512bf16-cvtsbh2ss-1.c: New test.
* gcc.target/i386/avx512bf16-vcvtpbh2ps-1.c: Ditto.
* gcc.target/i386/avx512bf16vl-cvtness2sbh-1.c: Ditto.
* gcc.target/i386/avx512bf16vl-vcvtpbh2ps-1.c: Ditto.

2 years agoFix typo in type verification.
Feng Xue [Tue, 21 Dec 2021 08:48:16 +0000 (09:48 +0100)]
Fix typo in type verification.

PR ipa/103786

gcc/ChangeLog:

* tree.c (verify_type): Fix typo.

2 years agoCombine vpcmpuw + zero_extend to vpcmpuw.
liuhongt [Wed, 22 Dec 2021 08:48:54 +0000 (16:48 +0800)]
Combine vpcmpuw + zero_extend to vpcmpuw.

vcmp{ps,ph,pd} and vpcmp{,u}{b,w,d,q} implicitly clear the upper bits
of dest.

gcc/ChangeLog:

PR target/103750
* config/i386/sse.md
(*<avx512>_cmp<V48H_AVX512VL:mode>3_zero_extend<SWI248x:mode>):
New pre_reload define_insn_and_split.
(*<avx512>_cmp<VI12_AVX512VL:mode>3_zero_extend<SWI248x:mode>):
Ditto.
(*<avx512>_ucmp<VI12_AVX512VL:mode>3_zero_extend<SWI248x:mode>):
Ditto.
(*<avx512>_ucmp<VI48_AVX512VL:mode>3_zero_extend<SWI248x:mode>):
Ditto.
(*<avx512>_cmp<V48H_AVX512VL:mode>3_zero_extend<SWI248x:mode>_2):
Ditto.
(*<avx512>_cmp<VI12_AVX512VL:mode>3_zero_extend<SWI248x:mode>_2):
Ditto.
(*<avx512>_ucmp<VI12_AVX512VL:mode>3_zero_extend<SWI248x:mode>_2):
Ditto.
(*<avx512>_ucmp<VI48_AVX512VL:mode>3_zero_extend<SWI248x:mode>_2):
Ditto.

gcc/testsuite/ChangeLog:

* gcc.target/i386/avx512bw-pr103750-1.c: New test.
* gcc.target/i386/avx512bw-pr103750-2.c: New test.
* gcc.target/i386/avx512f-pr103750-1.c: New test.
* gcc.target/i386/avx512f-pr103750-2.c: New test.
* gcc.target/i386/avx512fp16-pr103750-1.c: New test.
* gcc.target/i386/avx512fp16-pr103750-2.c: New test.

2 years agoDaily bump.
GCC Administrator [Thu, 23 Dec 2021 00:16:29 +0000 (00:16 +0000)]
Daily bump.

2 years agoFortran: BOZ literal constants are not interoperable
Harald Anlauf [Mon, 20 Dec 2021 21:12:33 +0000 (22:12 +0100)]
Fortran: BOZ literal constants are not interoperable

gcc/fortran/ChangeLog:

PR fortran/103778
* check.c (is_c_interoperable): A BOZ literal constant is not
interoperable.

gcc/testsuite/ChangeLog:

PR fortran/103778
* gfortran.dg/illegal_boz_arg_3.f90: New test.

2 years agoFortran: CASE selector expressions must be scalar
Harald Anlauf [Mon, 20 Dec 2021 21:01:05 +0000 (22:01 +0100)]
Fortran: CASE selector expressions must be scalar

gcc/fortran/ChangeLog:

PR fortran/103776
* match.c (match_case_selector): Reject expressions in CASE
selector which are not scalar.

gcc/testsuite/ChangeLog:

PR fortran/103776
* gfortran.dg/select_10.f90: New test.

2 years agoarm: Declare MVE types internally via pragma
Murray Steele [Wed, 22 Dec 2021 14:55:07 +0000 (14:55 +0000)]
arm: Declare MVE types internally via pragma

Move the implementation of MVE ACLE types from arm_mve_types.h to
inside GCC via a new pragma, which replaces the prior type
definitions.  This allows for the types to be used internally for
intrinsic function definitions.

gcc/ChangeLog:

* config.gcc (arm*-*-*): Add arm-mve-builtins.o to extra_objs.
* config/arm/arm-c.c (arm_pragma_arm): Handle "#pragma GCC arm".
(arm_register_target_pragmas): Register it.
* config/arm/arm-protos.h: (arm_mve::arm_handle_mve_types_h): New
prototype.
* config/arm/arm_mve_types.h: Replace MVE type definitions with
new pragma.
* config/arm/t-arm: (arm-mve-builtins.o): New target rule.
* config/arm/arm-mve-builtins.cc: New file.
* config/arm/arm-mve-builtins.def: New file.
* config/arm/arm-mve-builtins.h: New file.

gcc/testsuite/ChangeLog:

* gcc.target/arm/mve/mve.exp: Add new subdirectories.
* gcc.target/arm/mve/general-c/type_redef_1.c: New test.
* gcc.target/arm/mve/general/double_pragmas_1.c: New test.
* gcc.target/arm/mve/general/nomve_1.c: New test.

2 years agoarm: Move arm_simd_info array declaration into header
Murray Steele [Wed, 22 Dec 2021 14:50:00 +0000 (14:50 +0000)]
arm: Move arm_simd_info array declaration into header

Move the arm_simd_type and arm_type_qualifiers enums, and
arm_simd_info struct from arm-builtins.c into arm-builtins.h header.

This is a first step towards internalising the type definitions for
MVE predicate, vector, and tuple types.  By moving arm_simd_types into
a header, we allow future patches to use these type trees externally
to arm-builtins.c, which is a crucial step towards developing an MVE
intrinsics framework similar to the current SVE implementation.

gcc/ChangeLog:

* config/arm/arm-builtins.c (enum arm_type_qualifiers): Move to
arm_builtins.h.
(enum arm_simd_type): Move to arm-builtins.h.
(struct arm_simd_type_info): Move to arm-builtins.h.
* config/arm/arm-builtins.h (enum arm_simd_type): Move from
arm-builtins.c.
(enum arm_type_qualifiers): Move from arm-builtins.c.
(struct arm_simd_type_info): Move from arm-builtins.c.

2 years agoFortran: allow __float128 on targets where long double is not REAL(KIND=10)
Francois-Xavier Coudert [Wed, 22 Dec 2021 11:46:07 +0000 (12:46 +0100)]
Fortran: allow __float128 on targets where long double is not REAL(KIND=10)

The logic for detection of REAL(KIND=16) in kinds-override.h made
assumptions:

    -- if real(kind=10) exists, i.e. if HAVE_GFC_REAL_10 is defined,
       then it is necessarily the "long double" type
    -- if real(kind=16) exists, then:
       * if HAVE_GFC_REAL_10, real(kind=16) is "__float128"
       * otherwise, real(kind=16) is "long double"

This may not always be true. Take the aarch64-apple-darwin port,
it has double == long double == binary64, and __float128 == binary128.

We already have more fine-grained logic in the mk-kinds-h.sh script,
where we actually check the Fortran kind corresponding to C’s long
double. So let's use it, and emit the GFC_REAL_16_IS_FLOAT128 /
GFC_REAL_16_IS_LONG_DOUBLE macros there.

libgfortran/ChangeLog:

* kinds-override.h: Move GFC_REAL_16_IS_* macros...
* mk-kinds-h.sh: ... here.

2 years agodocs: docs: use ';' for function declarations. (part 3)
Martin Liska [Wed, 22 Dec 2021 11:16:47 +0000 (12:16 +0100)]
docs: docs: use ';' for function declarations. (part 3)

gcc/ChangeLog:

* doc/extend.texi: Unify all function declarations in examples
where some miss trailing ';'.

2 years agodocs: docs: use ';' for function declarations. (part 2)
Martin Liska [Wed, 22 Dec 2021 11:06:53 +0000 (12:06 +0100)]
docs: docs: use ';' for function declarations. (part 2)

gcc/ChangeLog:

* doc/extend.texi: Unify all function declarations in examples
where some miss trailing ';'.

2 years agodocs: use ';' for function declarations.
Martin Liska [Wed, 22 Dec 2021 10:59:28 +0000 (11:59 +0100)]
docs: use ';' for function declarations.

gcc/ChangeLog:

* doc/extend.texi: Unify all function declarations in examples
where some miss trailing ';'.

2 years agodocs: Unify instruct set name.
Martin Liska [Wed, 22 Dec 2021 10:20:42 +0000 (11:20 +0100)]
docs: Unify instruct set name.

gcc/ChangeLog:

* doc/extend.texi: Use uppercase letters for SSEx.

2 years agoDaily bump.
GCC Administrator [Wed, 22 Dec 2021 00:16:30 +0000 (00:16 +0000)]
Daily bump.

2 years agoconfig: Add check whether D compiler works (PR103528)
Iain Buclaw [Thu, 16 Dec 2021 22:56:16 +0000 (23:56 +0100)]
config: Add check whether D compiler works (PR103528)

As well as checking for the existence of a GDC compiler, also validate
that it has also been built with libphobos, otherwise warn or fail with
the message that GDC is required to build d.

config/ChangeLog:

PR d/103528
* acx.m4 (ACX_PROG_GDC): Add check whether D compiler works.

ChangeLog:

* configure: Regenerate.

2 years agolibphobos: Add power*-*-freebsd* as supported target
Iain Buclaw [Tue, 21 Dec 2021 14:03:47 +0000 (15:03 +0100)]
libphobos: Add power*-*-freebsd* as supported target

This has been tested on powerpc64-freebsd13 and powerpc64le-freebsd13,
and used to build dub, along with some D tools from ports.

libphobos/ChangeLog:

* configure.tgt: Add power*-*-freebsd* as a supported target.

2 years agoi386: Add missing BMI intrinsic to align with clang
Jiang Haochen [Tue, 21 Dec 2021 08:12:02 +0000 (16:12 +0800)]
i386: Add missing BMI intrinsic to align with clang

gcc/ChangeLog:

* config/i386/bmiintrin.h (_tzcnt_u16): New intrinsic.
(_andn_u32): Ditto.
(_andn_u64): Ditto.

gcc/testsuite/ChangeLog:

* gcc.target/i386/bmi-1.c: Add test for new intrinsic.
* gcc.target/i386/bmi-2.c: Ditto.
* gcc.target/i386/bmi-3.c: Ditto.

2 years agoconfig.sub: change mode to 755.
Martin Liska [Tue, 21 Dec 2021 08:10:43 +0000 (09:10 +0100)]
config.sub: change mode to 755.

ChangeLog:

* config.sub: Change mode back to 755.

2 years agoDon't move cold code out of loop by checking bb count
Xionghu Luo [Wed, 8 Dec 2021 01:24:35 +0000 (19:24 -0600)]
Don't move cold code out of loop by checking bb count

v8 changes:
1. Use hotter_than_inner_loop instead of colder to store a hotter loop
nearest to loop.
2. Update the logic in fill_coldest_and_hotter_out_loop and
get_coldest_out_loop to make common case O(1).
3. Update function argument bb_colder_than_loop_preheader.
4. Make cached array to vec<class *loop> for index checking.

v7 changes:
1. Refine get_coldest_out_loop to replace loop with checking
pre-computed coldest_outermost_loop and colder_than_inner_loop.
2. Add function fill_cold_out_loop, compute coldest_outermost_loop and
colder_than_inner_loop recursively without loop.

v6 changes:
1. Add function fill_coldest_out_loop to pre compute the coldest
outermost loop for each loop.
2. Rename find_coldest_out_loop to get_coldest_out_loop.
3. Add testcase ssa-lim-22.c to differentiate with ssa-lim-19.c.

v5 changes:
1. Refine comments for new functions.
2. Use basic_block instead of count in bb_colder_than_loop_preheader
to align with function name.
3. Refine with simpler implementation for get_coldest_out_loop and
ref_in_loop_hot_body::operator for better understanding.

v4 changes:
1. Sort out profile_count comparision to function bb_cold_than_loop_preheader.
2. Update ref_in_loop_hot_body::operator () to find cold_loop before compare.
3. Split RTL invariant motion part out.
4. Remove aux changes.

v3 changes:
1. Handle max_loop in determine_max_movement instead of outermost_invariant_loop.
2. Remove unnecessary changes.
3. Add for_all_locs_in_loop (loop, ref, ref_in_loop_hot_body) in can_sm_ref_p.
4. "gsi_next (&bsi);" in move_computations_worker is kept since it caused
infinite loop when implementing v1 and the iteration is missed to be
updated actually.

v1: https://gcc.gnu.org/pipermail/gcc-patches/2021-August/576488.html
v2: https://gcc.gnu.org/pipermail/gcc-patches/2021-September/579086.html
v3: https://gcc.gnu.org/pipermail/gcc-patches/2021-September/580211.html
v4: https://gcc.gnu.org/pipermail/gcc-patches/2021-October/581231.html
v5: https://gcc.gnu.org/pipermail/gcc-patches/2021-October/581961.html
...
v8: https://gcc.gnu.org/pipermail/gcc-patches/2021-December/586209.html

There was a patch trying to avoid move cold block out of loop:

https://gcc.gnu.org/pipermail/gcc/2014-November/215551.html

Richard suggested to "never hoist anything from a bb with lower execution
frequency to a bb with higher one in LIM invariantness_dom_walker
before_dom_children".

In gimple LIM analysis, add get_coldest_out_loop to move invariants to
expected target loop, if profile count of the loop bb is colder
than target loop preheader, it won't be hoisted out of loop.
Likely for store motion, if all locations of the REF in loop is cold,
don't do store motion of it.

SPEC2017 performance evaluation shows 1% performance improvement for
intrate GEOMEAN and no obvious regression for others.  Especially,
500.perlbench_r +7.52% (Perf shows function S_regtry of perlbench is
largely improved.), and 548.exchange2_r+1.98%, 526.blender_r +1.00%
on P8LE.

gcc/ChangeLog:

2021-12-21  Xionghu Luo  <luoxhu@linux.ibm.com>

* tree-ssa-loop-im.c (bb_colder_than_loop_preheader): New
function.
(get_coldest_out_loop): New function.
(determine_max_movement): Use get_coldest_out_loop.
(move_computations_worker): Adjust and fix iteration udpate.
(class ref_in_loop_hot_body): New functor.
(ref_in_loop_hot_body::operator): New.
(can_sm_ref_p): Use for_all_locs_in_loop.
(fill_coldest_and_hotter_out_loop): New.
(tree_ssa_lim_finalize): Free coldest_outermost_loop and
hotter_than_inner_loop.
(loop_invariant_motion_in_fun): Call fill_coldest_and_hotter_out_loop.

gcc/testsuite/ChangeLog:

2021-12-21  Xionghu Luo  <luoxhu@linux.ibm.com>

* gcc.dg/tree-ssa/recip-3.c: Adjust.
* gcc.dg/tree-ssa/ssa-lim-19.c: New test.
* gcc.dg/tree-ssa/ssa-lim-20.c: New test.
* gcc.dg/tree-ssa/ssa-lim-21.c: New test.
* gcc.dg/tree-ssa/ssa-lim-22.c: New test.
* gcc.dg/tree-ssa/ssa-lim-23.c: New test.

2 years agoFix loop split incorrect count and probability
Xionghu Luo [Wed, 8 Dec 2021 05:17:51 +0000 (23:17 -0600)]
Fix loop split incorrect count and probability

In tree-ssa-loop-split.c, split_loop and split_loop_on_cond does two
kind of split. split_loop only works for single loop and insert edge at
exit when split, while split_loop_on_cond is not limited to single loop
and insert edge at latch when split.  Both split behavior should consider
loop count and probability update.  For split_loop, loop split condition
is moved in front of loop1 and loop2; But split_loop_on_cond moves the
condition between loop1 and loop2, this patch does:
 1) profile count proportion for both original loop and copied loop
without dropping down the true branch's count;
 2) probability update in the two loops and between the two loops.

Regression tested pass.

Changes diff for split_loop and split_loop_on_cond cases:

1) diff base/loop-split.c.151t.lsplit patched/loop-split.c.152t.lsplit
...
   <bb 2> [local count: 118111600]:
   if (beg_5(D) < end_8(D))
     goto <bb 14>; [89.00%]
   else
     goto <bb 6>; [11.00%]

   <bb 14> [local count: 105119324]:
   if (beg2_6(D) < c_9(D))
-    goto <bb 15>; [100.00%]
+    goto <bb 15>; [33.00%]
   else
-    goto <bb 16>; [100.00%]
+    goto <bb 16>; [67.00%]

-  <bb 15> [local count: 105119324]:
+  <bb 15> [local count: 34689377]:
   _25 = beg_5(D) + 1;
   _26 = end_8(D) - beg_5(D);
   _27 = beg2_6(D) + _26;
   _28 = MIN_EXPR <c_9(D), _27>;

-  <bb 3> [local count: 955630225]:
+  <bb 3> [local count: 315357973]:
   # i_16 = PHI <i_11(8), beg_5(D)(15)>
   # j_17 = PHI <j_12(8), beg2_6(D)(15)>
   printf ("a: %d %d\n", i_16, j_17);
   i_11 = i_16 + 1;
   j_12 = j_17 + 1;
   if (j_12 < _28)
-    goto <bb 8>; [89.00%]
+    goto <bb 8>; [29.37%]
   else
-    goto <bb 17>; [11.00%]
+    goto <bb 17>; [70.63%]

-  <bb 8> [local count: 850510901]:
+  <bb 8> [local count: 280668596]:
   goto <bb 3>; [100.00%]

-  <bb 16> [local count: 105119324]:
+  <bb 16> [local count: 70429947]:
   # i_22 = PHI <beg_5(D)(14), i_29(17)>
   # j_23 = PHI <beg2_6(D)(14), j_30(17)>

   <bb 10> [local count: 955630225]:
   # i_2 = PHI <i_22(16), i_20(13)>
   # j_1 = PHI <j_23(16), j_21(13)>
   i_20 = i_2 + 1;
   j_21 = j_1 + 1;
   if (end_8(D) > i_20)
-    goto <bb 13>; [89.00%]
+    goto <bb 13>; [59.63%]
   else
-    goto <bb 9>; [11.00%]
+    goto <bb 9>; [40.37%]

-  <bb 13> [local count: 850510901]:
+  <bb 13> [local count: 569842305]:
   goto <bb 10>; [100.00%]

   <bb 17> [local count: 105119324]:
   # i_29 = PHI <i_11(3)>
   # j_30 = PHI <j_12(3)>
   if (end_8(D) > i_29)
     goto <bb 16>; [80.00%]
   else
     goto <bb 9>; [20.00%]

   <bb 9> [local count: 105119324]:

   <bb 6> [local count: 118111600]:
   return 0;

 }
   <bb 2> [local count: 118111600]:
-  if (beg_5(D) < end_8(D))
+  _1 = end_6(D) - beg_7(D);
+  j_9 = _1 + beg2_8(D);
+  if (end_6(D) > beg_7(D))
     goto <bb 14>; [89.00%]
   else
     goto <bb 6>; [11.00%]

   <bb 14> [local count: 105119324]:
-  if (beg2_6(D) < c_9(D))
-    goto <bb 15>; [100.00%]
+  if (j_9 >= c_11(D))
+    goto <bb 15>; [33.00%]
   else
-    goto <bb 16>; [100.00%]
+    goto <bb 16>; [67.00%]

-  <bb 15> [local count: 105119324]:
-  _25 = beg_5(D) + 1;
-  _26 = end_8(D) - beg_5(D);
-  _27 = beg2_6(D) + _26;
-  _28 = MIN_EXPR <c_9(D), _27>;
-
-  <bb 3> [local count: 955630225]:
-  # i_16 = PHI <i_11(8), beg_5(D)(15)>
-  # j_17 = PHI <j_12(8), beg2_6(D)(15)>
-  printf ("a: %d %d\n", i_16, j_17);
-  i_11 = i_16 + 1;
-  j_12 = j_17 + 1;
-  if (j_12 < _28)
-    goto <bb 8>; [89.00%]
+  <bb 15> [local count: 34689377]:
+  _27 = end_6(D) + -1;
+  _28 = beg_7(D) - end_6(D);
+  _29 = j_9 + _28;
+  _30 = _29 + 1;
+  _31 = MAX_EXPR <c_11(D), _30>;
+
+  <bb 3> [local count: 315357973]:
+  # i_18 = PHI <i_13(8), end_6(D)(15)>
+  # j_19 = PHI <j_14(8), j_9(15)>
+  printf ("a: %d %d\n", i_18, j_19);
+  i_13 = i_18 + -1;
+  j_14 = j_19 + -1;
+  if (j_14 >= _31)
+    goto <bb 8>; [29.37%]
   else
-    goto <bb 17>; [11.00%]
+    goto <bb 17>; [70.63%]

-  <bb 8> [local count: 850510901]:
+  <bb 8> [local count: 280668596]:
   goto <bb 3>; [100.00%]

-  <bb 16> [local count: 105119324]:
-  # i_22 = PHI <beg_5(D)(14), i_29(17)>
-  # j_23 = PHI <beg2_6(D)(14), j_30(17)>
+  <bb 16> [local count: 70429947]:
+  # i_24 = PHI <end_6(D)(14), i_32(17)>
+  # j_25 = PHI <j_9(14), j_33(17)>

   <bb 10> [local count: 955630225]:
-  # i_2 = PHI <i_22(16), i_20(13)>
-  # j_1 = PHI <j_23(16), j_21(13)>
-  i_20 = i_2 + 1;
-  j_21 = j_1 + 1;
-  if (end_8(D) > i_20)
+  # i_3 = PHI <i_24(16), i_22(13)>
+  # j_2 = PHI <j_25(16), j_23(13)>
+  i_22 = i_3 + -1;
+  j_23 = j_2 + -1;
+  if (beg_7(D) < i_22)
     goto <bb 13>; [89.00%]
   else
     goto <bb 9>; [11.00%]

-  <bb 13> [local count: 850510901]:
+  <bb 13> [local count: 569842305]:
   goto <bb 10>; [100.00%]

   <bb 17> [local count: 105119324]:
-  # i_29 = PHI <i_11(3)>
-  # j_30 = PHI <j_12(3)>
-  if (end_8(D) > i_29)
+  # i_32 = PHI <i_13(3)>
+  # j_33 = PHI <j_14(3)>
+  if (beg_7(D) < i_32)
     goto <bb 16>; [80.00%]
   else
     goto <bb 9>; [20.00%]

   <bb 9> [local count: 105119324]:

   <bb 6> [local count: 118111600]:
   return 0;

 }

2) diff base/loop-cond-split-1.c.151t.lsplit  patched/loop-cond-split-1.c.151t.lsplit:
...
   <bb 2> [local count: 118111600]:
   if (n_7(D) > 0)
     goto <bb 4>; [89.00%]
   else
     goto <bb 3>; [11.00%]

   <bb 3> [local count: 118111600]:
   return;

   <bb 4> [local count: 105119324]:
   pretmp_3 = ga;

-  <bb 5> [local count: 955630225]:
+  <bb 5> [local count: 315357973]:
   # i_13 = PHI <i_10(20), 0(4)>
   # prephitmp_12 = PHI <prephitmp_5(20), pretmp_3(4)>
   if (prephitmp_12 != 0)
     goto <bb 6>; [33.00%]
   else
     goto <bb 7>; [67.00%]

   <bb 6> [local count: 315357972]:
   _2 = do_something ();
   ga = _2;

-  <bb 7> [local count: 955630225]:
+  <bb 7> [local count: 315357973]:
   # prephitmp_5 = PHI <prephitmp_12(5), _2(6)>
   i_10 = inc (i_13);
   if (n_7(D) > i_10)
     goto <bb 21>; [89.00%]
   else
     goto <bb 11>; [11.00%]

   <bb 11> [local count: 105119324]:
   goto <bb 3>; [100.00%]

-  <bb 21> [local count: 850510901]:
+  <bb 21> [local count: 280668596]:
   if (prephitmp_12 != 0)
-    goto <bb 20>; [100.00%]
+    goto <bb 20>; [33.00%]
   else
-    goto <bb 19>; [INV]
+    goto <bb 19>; [67.00%]

-  <bb 20> [local count: 850510901]:
+  <bb 20> [local count: 280668596]:
   goto <bb 5>; [100.00%]

-  <bb 19> [count: 0]:
+  <bb 19> [local count: 70429947]:
   # i_23 = PHI <i_10(21)>
   # prephitmp_25 = PHI <prephitmp_5(21)>

-  <bb 12> [local count: 955630225]:
+  <bb 12> [local count: 640272252]:
   # i_15 = PHI <i_23(19), i_22(16)>
   # prephitmp_16 = PHI <prephitmp_25(19), prephitmp_16(16)>
   i_22 = inc (i_15);
   if (n_7(D) > i_22)
     goto <bb 16>; [89.00%]
   else
     goto <bb 11>; [11.00%]

-  <bb 16> [local count: 850510901]:
+  <bb 16> [local count: 569842305]:
   goto <bb 12>; [100.00%]

 }

gcc/ChangeLog:

2021-12-21  Xionghu Luo  <luoxhu@linux.ibm.com>

* tree-ssa-loop-split.c (split_loop): Fix incorrect
profile_count and probability.
(do_split_loop_on_cond): Likewise.

2 years agoFix incorrect loop exit edge probability [PR103270]
Xionghu Luo [Tue, 21 Dec 2021 03:10:09 +0000 (21:10 -0600)]
Fix incorrect loop exit edge probability [PR103270]

r12-4526 cancelled jump thread path rotates loop. It exposes a issue in
profile-estimate when predict_extra_loop_exits, outer loop's exit edge
is marked as inner loop's extra loop exit and set with incorrect
prediction, then a hot inner loop will become cold loop finally through
optimizations, this patch add loop check when searching extra exit edges
to avoid unexpected predict_edge from predict_paths_for_bb.

Regression tested on P8LE.

gcc/ChangeLog:

2021-12-21  Xionghu Luo  <luoxhu@linux.ibm.com>

PR middle-end/103270
* predict.c (predict_extra_loop_exits): Add loop parameter.
(predict_loops): Call with loop argument.

gcc/testsuite/ChangeLog:

2021-12-21  Xionghu Luo  <luoxhu@linux.ibm.com>

PR middle-end/103270
* gcc.dg/pr103270.c: New test.

2 years agors6000: Replace UNSPECS with ss_plus/us_plus and ss_minus/us_minus
Xionghu Luo [Tue, 21 Dec 2021 03:02:50 +0000 (21:02 -0600)]
rs6000: Replace UNSPECS with ss_plus/us_plus and ss_minus/us_minus

These four UNSPECS seems could be replaced with native RTL.

For
"(set (reg:SI VSCR_REGNO) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))":

Quoted David's explanation:

"The design came from the early implementation of Altivec:

https://gcc.gnu.org/pipermail/gcc-patches/2002-May/077409.html

If one later checks for saturation (reads VSCR), one needs a
corresponding SET of the value.  It's set in an architecture-specific
manner that isn't described to GCC, but it's set, not just clobbered
and in an undefined state.

The RTL does not describe that VSCR is set to the value 0.  The
(const_int 0) is not the value set.  You can think of the (const_int
0) as a dummy RTL argument to the VSCR UNSPEC.  UNSPEC requires at
least one argument and the pattern doesn't try to express the
argument, so it uses a dummy RTL constant.  It's part of a PARALLEL
and the plus or minus already expresses the data dependency of the
pattern on the input operands."

gcc/ChangeLog:

2021-12-21  Xionghu Luo  <luoxhu@linux.ibm.com>

* config/rs6000/altivec.md (altivec_vaddu<VI_char>s): Replace
UNSPEC_VADDU with us_plus.
(altivec_vadds<VI_char>s): Replace UNSPEC_VADDS with ss_plus.
(altivec_vsubu<VI_char>s): Replace UNSPEC_VSUBU with us_minus.
(altivec_vsubs<VI_char>s): Replace UNSPEC_VSUBS with ss_minus.
(altivec_abss_<mode>): Likewise.

2 years agoDaily bump.
GCC Administrator [Tue, 21 Dec 2021 00:16:24 +0000 (00:16 +0000)]
Daily bump.

2 years agoUpdate cpplib es.po
Joseph Myers [Mon, 20 Dec 2021 23:09:37 +0000 (23:09 +0000)]
Update cpplib es.po

* es.po: Update.

2 years agoi386: Fix <sse2p4_1>_pinsr<ssemodesuffix> and its splitters [PR103772]
Uros Bizjak [Mon, 20 Dec 2021 20:15:50 +0000 (21:15 +0100)]
i386: Fix <sse2p4_1>_pinsr<ssemodesuffix> and its splitters [PR103772]

The clever trick to duplicate the value of the input operand into itself
proved not so clever after all.  The splitter should not clobber the input
operand in any case, since the register can hold the value outside the HImode
lowpart when accessed as subreg.  Use the standard earlyclobber approach
instead.

The testcase fails with avx2 ISA, but I was not able to create the testcase
that wouldn't require -mavx512fp16 compile flag.

2021-12-20  Uroš Bizjak  <ubizjak@gmail.com>

gcc/ChangeLog:

PR target/103772
* config/i386/sse.md (<sse2p4_1>_pinsr<ssemodesuffix>): Add
earlyclobber to (x,x,x,i) alternative.
(<sse2p4_1>_pinsr<ssemodesuffix> peephole2): Remove.
(<sse2p4_1>_pinsr<ssemodesuffix> splitter): Use output
operand as a temporary register.  Split after reload_completed.

2 years agoc++: memfn lookup consistency in incomplete-class ctx
Patrick Palka [Mon, 20 Dec 2021 20:02:40 +0000 (15:02 -0500)]
c++: memfn lookup consistency in incomplete-class ctx

When instantiating a call to a member function of a class template, we
repeat the member function lookup in order to obtain the corresponding
partially instantiated functions.  Within an incomplete-class context
however, we need to be more careful when repeating the lookup because we
don't want to introduce later-declared member functions that weren't
visible at template definition time.  We're currently not careful enough
in this respect, which causes us to reject memfn1.C below.

This patch fixes this issue by making tsubst_baselink filter out from
the instantiation-time lookup those member functions that were invisible
at template definition time.  This is really only necessary within an
incomplete-class context, so this patch adds a heuristic flag to BASELINK
to help us avoid needlessly performing this filtering step (which would
be a no-op) in complete-class contexts.

This is also necessary for the ahead-of-time overload set pruning
implemented in r12-6075 to be effective for member functions within
class templates.

gcc/cp/ChangeLog:

* call.c (build_new_method_call): Set
BASELINK_FUNCTIONS_MAYBE_INCOMPLETE_P on the pruned baselink.
* cp-tree.h (BASELINK_FUNCTIONS_MAYBE_INCOMPLETE_P): Define.
* pt.c (filter_memfn_lookup): New subroutine of tsubst_baselink.
(tsubst_baselink): Use filter_memfn_lookup on the new lookup
result when BASELINK_FUNCTIONS_MAYBE_INCOMPLETE_P is set on the
old baselink.  Remove redundant BASELINK_P check.
* search.c (build_baselink): Set
BASELINK_FUNCTIONS_MAYBE_INCOMPLETE_P appropriately.

gcc/testsuite/ChangeLog:

* g++.dg/lookup/memfn1.C: New test.
* g++.dg/template/non-dependent16b.C: New test.

2 years agod: Merge upstream dmd ad8412530, druntime fd9a4544, phobos 495e835c2.
Iain Buclaw [Mon, 20 Dec 2021 18:25:32 +0000 (19:25 +0100)]
d: Merge upstream dmd ad8412530, druntime fd9a4544, phobos 495e835c2.

D front-end changes:

    - Import dmd v2.098.1
    - Remove calling of _d_delstruct from code generator.

Druntime changes:

    - Import druntime v2.098.1

Phobos changes:

    - Import phobos v2.098.1

gcc/d/ChangeLog:

* dmd/MERGE: Merge upstream dmd ad8412530.
* expr.cc (ExprVisitor::visit (DeleteExp *)): Remove code generation
of _d_delstruct.
* runtime.def (DELSTRUCT): Remove.

libphobos/ChangeLog:

* libdruntime/MERGE: Merge upstream druntime fd9a4544.
* src/MERGE: Merge upstream phobos 495e835c2.

2 years agoFix static array size in gcc.dg/vect/vect-simd-20.c
Olivier Hainque [Wed, 3 Nov 2021 14:18:16 +0000 (14:18 +0000)]
Fix static array size in gcc.dg/vect/vect-simd-20.c

10000 / 78 is strictly greater than 128 so we will
actually do 128+1 strides in foo() for s == 78 and p[]
needs to be dimensioned accordingly.

2021-12-20  Olivier Hainque  <hainque@adacore.com>

gcc/testsuite/
* gcc.dg/vect/vect-simd-20.c: Fix size of p[]
to accommodate the number of strides performed
by foo() for s == 78.

2 years agox86_64: Improve code expanded for highpart multiplications.
Roger Sayle [Mon, 20 Dec 2021 15:22:18 +0000 (15:22 +0000)]
x86_64: Improve code expanded for highpart multiplications.

While working on a middle-end patch to more aggressively use highpart
multiplications on targets that support them, I noticed that the RTL
expanded by the x86 backend interacts poorly with register allocation
leading to suboptimal code.

For the testcase,
typedef int __attribute ((mode(TI))) ti_t;
long foo(long x)
{
  return ((ti_t)x * 19065) >> 64;
}

we'd like to avoid:
foo: movq    %rdi, %rax
        movl    $19065, %edx
        imulq   %rdx
        movq    %rdx, %rax
        ret

and would prefer:
foo: movl    $19065, %eax
        imulq   %rdi
        movq    %rdx, %rax
        ret

This patch provides a pair of peephole2 transformations to tweak the
spills generated by reload, and at the same time replaces the current
define_expand with a define_insn pattern using the new [su]mul_highpart
RTX codes.

2021-12-20  Roger Sayle  <roger@nextmovesoftware.com>
    Uroš Bizjak  <ubizjak@gmail.com>

gcc/ChangeLog
* config/i386/i386.md (any_mul_highpart): New code iterator.
(sgnprefix, s): Add attribute support for [su]mul_highpart.
(<s>mul<mode>3_highpart): Delete expander.
(<s>mul<mode>3_highpart, <s>mulsi32_highpart_zext):
New define_insn patterns.
(define_peephole2): Tweak the register allocation for the above
instructions after reload.

gcc/testsuite/ChangeLog
* gcc.target/i386/smuldi3_highpart.c: New test case.

2 years agoObsolete m32c-rtems target
Joel Sherrill [Fri, 17 Dec 2021 16:10:10 +0000 (10:10 -0600)]
Obsolete m32c-rtems target

2021-12-20  Joel Sherrill <joel@rtems.org>

gcc/
* config.gcc: Obsolete m32c-*-rtems* target.

2 years agoc++: ahead-of-time overload set pruning for non-dep calls
Patrick Palka [Mon, 20 Dec 2021 14:28:20 +0000 (09:28 -0500)]
c++: ahead-of-time overload set pruning for non-dep calls

This patch makes us remember the function selected by overload resolution
during ahead of time processing of a non-dependent call expression, so
that at instantiation time we avoid repeating some of the work of overload
resolution for the call.  Note that we already do this for non-dependent
operator expressions via build_min_non_dep_op_overload.

Some caveats:

 * When processing ahead of time a non-dependent call to a member
   function template of a currently open class template (as in
   g++.dg/template/deduce4.C), we end up generating an "inside-out"
   partial instantiation such as S<T>::foo<int, int>(), the likes of
   which we're apparently not prepared to fully instantiate.  So in this
   situation, we instead prune to the selected template instead of the
   specialization in this situation.

 * This change triggered a latent FUNCTION_DECL pretty printing issue
   in cpp0x/error2.C -- since we now resolve the call to foo<0> ahead
   of time, the error now looks like:

     error: expansion pattern ‘foo()()=0’ contains no parameter pack

   where the FUNCTION_DECL for foo<0> is clearly misprinted.  But this
   pretty-printing issue could be reproduced without this patch if
   we define foo as a non-template function.  Since this testcase was
   added to verify pretty printing of TEMPLATE_ID_EXPR, I work around
   this test failure by making the call to foo type-dependent and thus
   immune to this ahead of time pruning.

 * We now reject parts of cpp0x/fntmp-equiv1.C because we notice that
   the non-dependent call d(f, b) in

     int d(int, int);
     template <unsigned long f, unsigned b, typename> e<d(f, b)> d();

   is non-constexpr.  Since this testcase is about equivalency of
   dependent names in the context of declaration matching, it seems the
   best fix here is to make the calls to d, d2 and d3 within the
   function signatures dependent.

gcc/cp/ChangeLog:

* call.c (build_new_method_call): For a non-dependent call
expression inside a template, returning a templated tree
whose overload set contains just the selected function.
* semantics.c (finish_call_expr): Likewise.

gcc/testsuite/ChangeLog:

* g++.dg/cpp0x/error2.C: Make the call to foo type-dependent in
order to avoid latent pretty-printing issue for FUNCTION_DECL
inside MODOP_EXPR.
* g++.dg/cpp0x/fntmp-equiv1.C: Make the calls to d, d2 and d3
within the function signatures dependent.
* g++.dg/template/non-dependent16.C: New test.
* g++.dg/template/non-dependent16a.C: New test.
* g++.dg/template/non-dependent17.C: New test.

2 years agojit: Fix -Wodr warning
Martin Liska [Mon, 20 Dec 2021 10:31:50 +0000 (11:31 +0100)]
jit: Fix -Wodr warning

gcc/jit/libgccjit.c:3957:8: warning: type 'struct version_info' violates the C++ One Definition Rule [-Wodr]

../../gcc/jit/libgccjit.c:3957:8: warning: type 'struct version_info' violates the C++ One Definition Rule [-Wodr]
 3957 | struct version_info

../../gcc/tree-ssa-loop-ivopts.c:181: note: a different type is defined in another translation unit
  181 | struct version_info

gcc/jit/ChangeLog:

* libgccjit.c (struct version_info): Rename to jit_version_info.
(struct jit_version_info): Likewise.
(gcc_jit_version_major): Likewise.
(gcc_jit_version_minor): Likewise.
(gcc_jit_version_patchlevel): Likewise.

2 years agoopts: Support -Oz in -Ox option hints.
Martin Liska [Mon, 20 Dec 2021 09:55:50 +0000 (10:55 +0100)]
opts: Support -Oz in -Ox option hints.

gcc/ChangeLog:

* opts.c (default_options_optimization): Support -Oz in -Ox option hints.

2 years agoFix handling of deferred SSA names in modref dataflow
Jan Hubicka [Mon, 20 Dec 2021 07:43:13 +0000 (08:43 +0100)]
Fix handling of deferred SSA names in modref dataflow

In the testcase we fail to analyze SSA name because flag do_dataflow is set
and thus triggers early exist in analyze_ssa_name.  Fixed by disabling
early exits when handling deferred names.

gcc/ChangeLog:

2021-12-20  Jan Hubicka  <hubicka@ucw.cz>

PR ipa/103669
* ipa-modref.c (modref_eaf_analysis::analyze_ssa_name): Add deferred
parameter.
(modref_eaf_analysis::propagate): Use it.

gcc/testsuite/ChangeLog:

2021-12-20  Jan Hubicka  <hubicka@ucw.cz>

PR ipa/103669
* g++.dg/torture/pr103669.C: New test.

2 years agoOptimize bit_and op1 float_vector_all_ones_operands to op1.
liuhongt [Wed, 15 Dec 2021 05:07:30 +0000 (13:07 +0800)]
Optimize bit_and op1 float_vector_all_ones_operands to op1.

gcc/ChangeLog:

PR target/98468
* config/i386/sse.md (*bit_and_float_vector_all_ones): New
pre-reload splitter.

gcc/testsuite/ChangeLog:

* gcc.target/i386/pr98468.c: New test.

2 years agoDaily bump.
GCC Administrator [Mon, 20 Dec 2021 00:16:21 +0000 (00:16 +0000)]
Daily bump.

2 years agoFortran: add support for IEEE intrinsics on aarch64 non-glibc targets
Francois-Xavier Coudert [Sun, 19 Dec 2021 23:45:31 +0000 (00:45 +0100)]
Fortran: add support for IEEE intrinsics on aarch64 non-glibc targets

This enables IEEE support on the upcoming aarch64-apple-darwin target,
and has been tested for some time in an external port.

libgfortran/ChangeLog:

* configure.host: Add aarch64-apple-darwin support.
* config/fpu-aarch64.h: New file.

2 years agoChange the xfail in gcc.dg/uninit-pr89230-1.c
Andrew Pinski [Sun, 19 Dec 2021 22:26:41 +0000 (22:26 +0000)]
Change the xfail in gcc.dg/uninit-pr89230-1.c

With the recent PHI-OPT patch for line numbers, I had missed this
testcase was now failing. The uninitialized warning was there
before my recent patch, just was on the wrong line. The testcase
had added an xfail in r12-4698-gf6d012338 (though a bug report was
not filed to record it).
This patch changes the dg-bogus messages around to catch both locations
and xfail both of them.

At least there is now a patch for the correct line numbers for the
phi-opt.

Committed after testing the testcase.

gcc/testsuite/ChangeLog:

* gcc.dg/uninit-pr89230-1.c: Change the dg-bogus messages
around and xfail both of them.

2 years agoFix early exit in modref_merge_call_site_flags
Jan Hubicka [Sun, 19 Dec 2021 21:28:40 +0000 (22:28 +0100)]
Fix early exit in modref_merge_call_site_flags

When adding support for static chain and return slot flags I forgot to update
early exit condition in modref_merge_call_site_flags.  This yields to wrong
code as demonstrated by the Fortran testcase attached to PR (which I hope
someone will help me to turn into testuite one).

gcc/ChangeLog:

2021-12-19  Jan Hubicka  <hubicka@ucw.cz>

PR ipa/103766
* ipa-modref.c (modref_merge_call_site_flags): Fix early exit condition

2 years agoc++: don't ICE on NAMESPACE_DECL inside FUNCTION_DECL
Matthias Kretz [Wed, 15 Dec 2021 08:45:06 +0000 (09:45 +0100)]
c++: don't ICE on NAMESPACE_DECL inside FUNCTION_DECL

Code like
  void swap() {
    namespace __variant = __detail::__variant;
    ...
  }
create a NAMESPACE_DECL where the CP_DECL_CONTEXT is a FUNCTION_DECL.
DECL_TEMPLATE_INFO fails on NAMESPACE_DECL and therefore must be handled
first in the assertion.

Signed-off-by: Matthias Kretz <m.kretz@gsi.de>
gcc/cp/ChangeLog:

* module.cc (trees_out::get_merge_kind): NAMESPACE_DECLs also
cannot have a DECL_TEMPLATE_INFO.

2 years agoc++: nested lambda capturing a capture proxy, cont [PR94376]
Patrick Palka [Sun, 19 Dec 2021 19:42:14 +0000 (14:42 -0500)]
c++: nested lambda capturing a capture proxy, cont [PR94376]

The r12-5403 fix apparently doesn't handle the case where the inner
lambda explicitly rather than implicitly captures the capture proxy from
the outer lambda, which causes us to reject the first example in the
testcase below.

This is because compared to an implicit capture, the effective initializer
for an explicit capture is wrapped in a location wrapper (pointing to within
the capture list), and this wrapper foils the is_capture_proxy check added
in r12-5403.

The simplest fix appears to be to strip location wrappers accordingly
before checking is_capture_proxy.  And to help prevent against this kind
of bug, this patch also makes is_capture_proxy assert it doesn't see a
location wrapper.

PR c++/94376

gcc/cp/ChangeLog:

* lambda.c (lambda_capture_field_type): Strip location wrappers
before checking for a capture proxy.
(is_capture_proxy): Assert that we don't see a location wrapper.
(mark_const_cap_r): Don't call is_constant_capture_proxy on a
location wrapper.

gcc/testsuite/ChangeLog:

* g++.dg/cpp0x/lambda/lambda-nested9a.C: New test.

2 years agoprint-tree: dump DECL_LANG_FLAG_8
Patrick Palka [Sun, 19 Dec 2021 18:49:04 +0000 (13:49 -0500)]
print-tree: dump DECL_LANG_FLAG_8

gcc/ChangeLog:

* print-tree.c (print_node) <case tcc_declaration>: Dump
DECL_LANG_FLAG_8.

2 years agoc++: local_specializations and recursive constrained fn [PR103714]
Patrick Palka [Sun, 19 Dec 2021 17:10:16 +0000 (12:10 -0500)]
c++: local_specializations and recursive constrained fn [PR103714]

Here during constraint checking for the inner call to A<0>::f<0>,
substitution into the PARM_DECL d in the atomic constraint yields the
wrong local specialization because local_specializations at this point
is nonempty, and contains specializations for the caller A<0>::f<1>.

This patch makes us call push_to_top_level during satisfaction, which'll
temporarily clear local_specializations for us.

PR c++/103714

gcc/cp/ChangeLog:

* constraint.cc (satisfy_declaration_constraints): Do
push_to_top_level and pop_from_top_level around the call to
satisfy_normalized_constraints.

gcc/testsuite/ChangeLog:

* g++.dg/cpp2a/concepts-uneval5.C: New test.

2 years agotestsuite: mark tests that require alias
Francois-Xavier Coudert [Sun, 19 Dec 2021 11:23:32 +0000 (12:23 +0100)]
testsuite: mark tests that require alias

gcc/testsuite/ChangeLog:

* gcc.dg/pr100509.c: Needs alias.
* gcc.dg/pragma-diag-10.c: Needs alias.

2 years agoImprove location for new statements in match-and-simplify phiopt
Andrew Pinski [Sat, 18 Dec 2021 11:52:37 +0000 (11:52 +0000)]
Improve location for new statements in match-and-simplify phiopt

Before match-and-simplify was used in phiot, the location of the
new stamtents were all of that of the conditional, this adds that
back as I did not realize gimple_simplify didn't do that for you.

OK? Bootstrapped and tested on x86_64 with no regressions.

gcc/ChangeLog:

* tree-ssa-phiopt.c (gimple_simplify_phiopt): Annotate the
new sequence with the location of the conditional statement.

2 years agoDaily bump.
GCC Administrator [Sun, 19 Dec 2021 00:16:17 +0000 (00:16 +0000)]
Daily bump.

2 years agoFortran: reject BOZ type argument to SIZEOF().
Harald Anlauf [Sat, 18 Dec 2021 22:21:35 +0000 (23:21 +0100)]
Fortran: reject BOZ type argument to SIZEOF().

gcc/fortran/ChangeLog:

PR fortran/103412
* check.c (gfc_check_sizeof): Reject BOZ type argument.

gcc/testsuite/ChangeLog:

PR fortran/103412
* gfortran.dg/illegal_boz_arg_2.f90: New test.

2 years agox86: PR target/103611: Splitter for DST:DI = (HI:SI<<32)|LO:SI.
Roger Sayle [Sat, 18 Dec 2021 13:51:56 +0000 (13:51 +0000)]
x86: PR target/103611: Splitter for DST:DI = (HI:SI<<32)|LO:SI.

A common idiom is to create a DImode value from the "concat" of two SImode
values, using "(long long)hi << 32 | (long long)lo", where the operation
may be ior, xor or plus.  On x86, with -m32, the high and low parts of
a DImode register are actually different SImode registers (typically %edx
and %eax) so ideally this idiom should reduce to two move instructions
(or optimally, just clever register allocation).

Unfortunately, GCC currently performs the IOR operation above on -m32,
and worse allocates DImode registers (split to SImode register pairs)
for both the zero extended HI and LO values.

Hence, for test1 from the new test case below:

typedef int __v4si __attribute__ ((__vector_size__ (16)));
long long test1(__v4si v) {
  unsigned int loVal = (unsigned int)v[0];
  unsigned int hiVal = (unsigned int)v[1];
  return (long long)(loVal) | ((long long)(hiVal) << 32);
}

we currently generate (with -m32 -O2 -msse4.1):

test1: subl    $28, %esp
        pextrd  $1, %xmm0, %eax
        pmovzxdq        %xmm0, %xmm1
        movq    %xmm1, 8(%esp)
        movl    %eax, %edx
        movl    8(%esp), %eax
        orl     12(%esp), %edx
        addl    $28, %esp
        orb     $0, %ah
        ret

with this patch we now generate:

test1: pextrd  $1, %xmm0, %edx
        movd    %xmm0, %eax
        ret

The fix is to recognize and split the idiom (hi<<32)|zext(lo) prior
to register allocation on !TARGET_64BIT, simplifying this sequence to
"highpart(dst) = hi; lowpart(dst) = lo".

The one minor complication is that sse.md's define_insn for
*vec_extractv4si_0_zext_sse4 can sometimes interfere with this
optimization.  It turns out that on !TARGET_64BIT, the zero_extend:DI
following vec_select:SI isn't free, and this insn gets split back
into multiple instructions during later passes, but too late to
be optimized away by this patch/reload.  Hence the last hunk of
this patch is to restrict *vec_extractv4si_0_zext_sse4 to TARGET_64BIT.
Checking PR target/80286, where *vec_extractv4si_0_zext_sse4 was
first added, this seems reasonable.

2021-12-18  Roger Sayle  <roger@nextmovesoftware.com>
    Uroš Bizjak  <ubizjak@gmail.com>

gcc/ChangeLog
PR target/103611
* config/i386/i386.md (any_or_plus): New code iterator.
(define_split): Split (HI<<32)|zext(LO) into piece-wise
move instructions on !TARGET_64BIT.
* config/i386/sse.md (*vec_extractv4si_0_zext_sse4):
Restrict to TARGET_64BIT.

gcc/testsuite/ChangeLog
PR target/103611
* gcc.target/i386/pr103611-2.c: New test case.

2 years agoPR target/32803: Add -Oz option for improved clang compatibility.
Roger Sayle [Sat, 18 Dec 2021 13:47:52 +0000 (13:47 +0000)]
PR target/32803: Add -Oz option for improved clang compatibility.

This patch adds support for an -Oz command line option, aggressively
optimizing for size at the expense of performance.  GCC's current -Os
provides a reasonable balance of size and performance, whereas -Oz is
probably only useful for code size benchmarks such as CSiBE.  Or so I
thought until I read in https://news.ycombinator.com/item?id=25408853
that clang's -Oz sometimes outperforms -O[23s]; I suspect modern instruction
decode stages can treat "pushq $1; popq %rax" as a short uop encoding.

Instead of introducing a new global variable, this patch simply abuses
the existing optimize_size by setting its value to 2.  The only change
in behaviour is the tweak to the i386 backend implementing the suggestion
in PR target/32803 to use a short push/pop sequence for loading small
immediate values (-128..127) on x86, matching the behaviour of LLVM.

On x86_64, the simple function:
int foo() { return 25; }

currently generates with -Os:
foo:    movl    $25, %eax       // 5 bytes
        ret

With the proposed -Oz, it generates:
foo:    pushq   $25             // 2 bytes
        popq    %rax            // 1 byte
        ret

On CSiBE, this results in a 0.94% improvement (3703513 bytes total
down to 3668516 bytes).

2021-12-18  Roger Sayle  <roger@nextmovesoftware.com>

gcc/ChangeLog
PR target/32803
* common.opt (Oz): New command line option.
* doc/invoke.texi: Document the new -Oz option.
* lto-wrapper.c (merge_and_complain, append_compiler_options):
Treat OPT_Oz as synonymous with OPT_Os.
* optc-save-gen.awk: Increase maximum value of optimize_size to 2.
* opts.c (default_options_optimization) [OPT_Oz]: Handle OPT_Oz
just like OPT_Os, except set opt->x_optimize_size to 2.
(common_handle_option): Skip OPT_Oz just like OPT_Os.

* config/i386/i386.md (*movdi_internal): Use a push/pop sequence
for suitable SImode TYPE_IMOV moves when optimize_size > 1.
(*movsi_internal): Likewise.

gcc/testsuite/ChangeLog
PR target/32803
* gcc.target/i386/pr32803.c: New test case.

2 years agotree-optimization/103759: Use sizetype everywhere for object sizes
Siddhesh Poyarekar [Sat, 18 Dec 2021 11:16:43 +0000 (16:46 +0530)]
tree-optimization/103759: Use sizetype everywhere for object sizes

Since all computations in tree-object-size are now done in sizetype and
not HOST_WIDE_INT, comparisons with HOST_WIDE_INT based unknown and
initval would be incorrect.  Instead, use the sizetype trees directly to
generate and evaluate initval and unknown size values.

gcc/ChangeLog:

PR tree-optimization/103759
* tree-object-size.c (unknown, initval): Remove functions.
(size_unknown, size_initval, size_unknown_p): Operate directly
on trees.

Signed-off-by: Siddhesh Poyarekar <siddhesh@gotplt.org>
2 years agoFortran: Cast arguments of <ctype.h> functions to unsigned char
François-Xavier Coudert [Thu, 16 Dec 2021 17:38:30 +0000 (18:38 +0100)]
Fortran: Cast arguments of <ctype.h> functions to unsigned char

Functions from <ctype.h> should only be called on values that can be
represented by unsigned char. On targets where char is a signed type,
some of libgfortran calls have undefined behaviour.

The solution is to cast the argument to unsigned char type. I’ve defined
macros in libgfortran.h to do so, to retain legibility of the library
code.

PR libfortran/95177

libgfortran/ChangeLog

* libgfortran.h: include ctype.h, provide safe macros.
* io/format.c: use safe macros.
* io/list_read.c: use safe macros.
* io/read.c: use safe macros.
* io/write.c: use safe macros.
* runtime/environ.c: use safe macros.

2 years agoDarwin: Future-proof and homogeneize detection of darwin versions
François-Xavier Coudert [Fri, 17 Dec 2021 18:30:36 +0000 (19:30 +0100)]
Darwin: Future-proof and homogeneize detection of darwin versions

The current GCC branch will become 12.1.0, which will be the stable
version of GCC when the next macOS version is released. There are some
places in GCC that don’t handle darwin22 as a version, so we need to
future-proof it (gcc/config.gcc and gcc/config/darwin-driver.c). We
align that code with what Apple clang does, i.e. accept all potential
major macOS versions until 99.

This patch also homogenises the handling of darwin version numbers,
where the majority of places use darwin2*, but some used darwin2[0-9]*.
Since there never was a darwin2.x version, the two are equivalent, and
we prefer the simpler darwin2*

gcc/ChangeLog:

* config/darwin-driver.c: Make version code more future-proof.
* config.gcc: Homogeneize darwin versions.
* configure.ac: Homogeneize darwin versions.
* configure: Regenerate.

gcc/testsuite/ChangeLog:

* gcc.dg/darwin-minversion-link.c: Test darwin21.
* obj-c++.dg/cxx-ivars-3.mm: Homogeneize darwin versions.
* obj-c++.dg/objc-gc-3.mm: Homogeneize darwin versions.
* objc.dg/objc-gc-4.m: Homogeneize darwin versions.

2 years agoDaily bump.
GCC Administrator [Sat, 18 Dec 2021 00:16:23 +0000 (00:16 +0000)]
Daily bump.

2 years agoattribs: Fix wrong error with -Wno-attribute=A::b [PR103649]
Marek Polacek [Thu, 16 Dec 2021 21:29:41 +0000 (16:29 -0500)]
attribs: Fix wrong error with -Wno-attribute=A::b [PR103649]

My patch to implement -Wno-attribute=A::b caused a bogus error when
parsing

  [[foo::bar(1, 2)]];

when -Wno-attributes=foo::bar was specified on the command line, because
when we create a fake foo::bar attribute and insert it into our attribute
table, it is created with max_length == 0 which doesn't allow any args.
That is wrong -- we know nothing about the attribute, so we shouldn't
require any specific number of arguments.  And since unknown attributes
can be rather complex (see for example omp::{directive,sequence}), we
must skip parsing their arguments.  To that end, I'm using max_length
with value -2.

Also let's not warn about things like

  [[vendor::assume(true)]];

because they may have some meaning (this is reminiscent of C++ Portable
Assumptions).

PR c/103649

gcc/ChangeLog:

* attribs.c (handle_ignored_attributes_option): Create the fake
attribute with max_length == -2.
(attribute_ignored_p): New overloads.
* attribs.h (attribute_ignored_p): Declare them.
* tree-core.h (struct attribute_spec): Document that max_length
can be -2.

gcc/c/ChangeLog:

* c-decl.c (c_warn_unused_attributes): Don't warn for
attribute_ignored_p.
* c-parser.c (c_parser_std_attribute): Skip parsing of the attribute
arguments when the attribute is ignored.

gcc/cp/ChangeLog:

* parser.c (cp_parser_declaration): Don't warn for attribute_ignored_p.
(cp_parser_std_attribute): Skip parsing of the attribute
arguments when the attribute is ignored.

gcc/testsuite/ChangeLog:

* c-c++-common/Wno-attributes-6.c: New test.

2 years agotestsuite: update expected results for ilp32.
David Edelsohn [Fri, 17 Dec 2021 22:16:19 +0000 (17:16 -0500)]
testsuite: update expected results for ilp32.

gcc/testsuite/ChangeLog:

* gcc.target/powerpc/fold-vec-insert-float-p9.c