Commit Graph

179660 Commits

Author SHA1 Message Date
Jonathan Wakely
473da7e22c libstdc++: Remove redundant -std=gnu++1z flags from makefile
Now that G++ defaults to gnu++17 we don't need special rules for
compiling the C++17 allocation and deallocation functions.

libstdc++-v3/ChangeLog:

	* libsupc++/Makefile.am: Remove redundant -std=gnu++1z flags.
	* libsupc++/Makefile.in: Regenerate.
2020-09-25 12:50:17 +01:00
Richard Sandiford
6abd428605 arm: Fix fp16 move patterns for base MVE
This patch fixes ICEs in gcc.dg/torture/float16-basic.c for
-march=armv8.1-m.main+mve -mfloat-abi=hard.  The problem was
that an fp16 argument was (rightly) being passed in FPRs,
but the fp16 move patterns only handled GPRs.  LRA then cycled
trying to look for a way of handling the FPR.

It looks like there are three related problems here:

(1) We're using the wrong fp16 move pattern for base MVE.
    *mov<mode>_vfp_<mode>16 (the pattern we use for +mve.fp)
    works for base MVE too.

(2) The fp16 MVE load and store patterns are separate from the
    main move patterns.  The loads and stores should instead be
    alternatives of the main move patterns, so that LRA knows
    what to do with pseudo registers that become stack slots.

(3) The range restrictions for the loads and stores were wrong
    for fp16: we were enforcing a multiple of 4 in [-255*4, 255*4]
    instead of a multiple of 2 in [-255*2, 255*2].

(2) came from a patch to prevent writeback being used for MVE.
That patch also added a Uj constraint to enforce the correct
memory types for MVE.  I think the simplest fix is therefore to merge
the loads and stores back into the main pattern and extend the Uj
constraint so that it acts like Um for non-MVE.

The testcase for that patch was mve-vldstr16-no-writeback.c, whose
main function is:

void
fn1 (__fp16 *pSrc)
{
  __fp16 high;
  __fp16 *pDst = 0;
  unsigned i;
  for (i = 0;; i++)
    if (pSrc[i])
      pDst[i] = high;
}

Fixing (2) causes the store part to fail, not because we're using
writeback, but because we decide to use GPRs to store high (which is
uninitialised, and so gets replaced with zero).  This patch therefore
adds some scan-assembler-nots instead.  (I wondered about changing the
testcase to initialise high, but that seemed like a bad idea for
a regression test.)

For (3): MVE seems to be the only thing to use arm_coproc_mem_operand_wb
(and its various interfaces) for 16-bit scalars: the Neon patterns only
use it for 32-bit scalars.

I've added new tests to try the various FPR alternatives of the
move patterns.  The range of offsets that GCC uses for FPR loads
and stores is the intersection of the range allowed for GPRs and
FPRs, so the tests include GPR<->memory tests as well.

The fp32 and fp64 tests already pass, they're just there for
completeness.

gcc/
	* config/arm/arm-protos.h (arm_mve_mode_and_operands_type_check):
	Delete.
	* config/arm/arm.c (arm_coproc_mem_operand_wb): Use a scale factor
	of 2 rather than 4 for 16-bit modes.
	(arm_mve_mode_and_operands_type_check): Delete.
	* config/arm/constraints.md (Uj): Allow writeback for Neon,
	but continue to disallow it for MVE.
	* config/arm/arm.md (*arm32_mov<HFBF:mode>): Add !TARGET_HAVE_MVE.
	* config/arm/vfp.md (*mov_load_vfp_hf16, *mov_store_vfp_hf16): Fold
	back into...
	(*mov<mode>_vfp_<mode>16): ...here but use Uj for the FPR memory
	constraints.  Use for base MVE too.

gcc/testsuite/
	* gcc.target/arm/mve/intrinsics/mve-vldstr16-no-writeback.c: Allow
	the store to use GPRs instead of FPRs.  Add scan-assembler-nots
	for writeback.
	* gcc.target/arm/armv8_1m-fp16-move-1.c: New test.
	* gcc.target/arm/armv8_1m-fp32-move-1.c: Likewise.
	* gcc.target/arm/armv8_1m-fp64-move-1.c: Likewise.
2020-09-25 12:45:25 +01:00
Richard Biener
4dcc7f03b5 tree-optimization/97199 - fix virtual operand update in if-conversion
This fixes a corner case with virtual operand update in if-conversion
by re-organizing the code to remove edges only after the last point
we need virtual PHI operands to be available.

2020-09-25  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/97199
	* tree-if-conv.c (combine_blocks): Remove edges only
	after looking at virtual PHI args.
2020-09-25 13:11:53 +02:00
Christophe Lyon
8c775bf447 testsuite: [aarch64] Fix aarch64/advsimd-intrinsics/v{trn,uzp,zip}_half.c
Since r11-3402 (g:65c9878641cbe0ed898aa7047b7b994e9d4a5bb1), the
vtrn_half, vuzp_half and vzip_half started failing with

vtrn_half.c:76:17: error: redeclaration of 'vector_float64x2' with no linkage
vtrn_half.c:77:17: error: redeclaration of 'vector2_float64x2' with no linkage
vtrn_half.c:80:17: error: redeclaration of 'vector_res_float64x2' with no linkage

This is because r11-3402 now always declares float64x2 variables for
aarch64, leading to a duplicate declaration in these testcases.

The fix is simply to remove these now useless declarations.

These tests are skipped on arm*, so there is no impact on that target.

2020-09-25  Christophe Lyon  <christophe.lyon@linaro.org>

	gcc/testsuite/
	PR target/71233
	* gcc.target/aarch64/advsimd-intrinsics/vtrn_half.c: Remove
	declarations of vector, vector2, vector_res for float64x2 type.
	* gcc.target/aarch64/advsimd-intrinsics/vuzp_half.c: Likewise.
	* gcc.target/aarch64/advsimd-intrinsics/vzip_half.c: Likewise.
2020-09-25 10:41:14 +00:00
Richard Biener
499b63048a testsuite/97204 - fix gcc.target/i386/sse2-mmx-pinsrw.c
This fixes the testcase writing to adjacent stack vars, exposed
my IPA modref.

2020-09-25  Richard Biener  <rguenther@suse.de>

	PR testsuite/97204
	* gcc.target/i386/sse2-mmx-pinsrw.c: Fix.
2020-09-25 11:46:01 +02:00
Jakub Jelinek
c2ebf4f10d openmp: Add support for non-rect simd and improve collapsed simd support
The following change adds support for non-rectangular simd loops.
While working on that, I've noticed we actually don't vectorize collapsed
simd loops at all, because the code that I thought would be vectorizable
actually is not vectorized.  While in theory for the constant lower/upper
bounds and constant step of all but the outermost loop we could in theory
vectorize by computing the seprate iterators using vectorized division
and modulo for each of them from the single iterator that increments
by 1 from 0 to total iteration count in the loop nest, I think that would
be fairly expensive and the chances of the loop body being vectorizable
would be low e.g. because of array indices unlikely to be linear and would
need scatters/gathers.
This patch changes the generated code to vectorize only the innermost
loop which has higher chance of being vectorized.  Below is the list of
tests and function names in which the patch resulted in vectorizing something
that hasn't been vectorized before (ok, the first line is a new test).
I've also found that the vectorizer will not vectorize loops with non-constant
steps, I plan to do something about those incrementally on the omp-expand.c
side (basically, compute number of iterations before the loop and use a 0 to
number_of_iterations step 1 IV as the main one).

I have problem with the composite simd vectorization though.
The point is that each thread (or task etc.) is given only a range of
consecutive iterations, so somewhere earlier it computes total number of iterations
and splits the work between the workers and then the intent is to try to vectorize it.
So, each thread is then given a begin ... end-1 range that it would handle.
This means that from the single begin value I need to compute the individual iteration
vars I should start at and then goto into the loop nest to begin iterating there
(and actually compute how many iterations the innermost loop should do each time
so that it stops before end).
Very roughly the IL I emit is something like:
int t[100][100][100];

void
foo (int a, int b, int c, int d, int e, int f, int g, int h, int u, int v, int w, int x)
{
  int i, j, k;
  int cnt;
  if (x)
    {
      i = u; j = v; k = w; goto doit;
    }
  for (i = a; i < b; i += c)
    for (j = d; j < e; j += f)
      {
        k = g;
        doit:
        for (; k < h; k++)
          t[i][j][k] += i + j + k;
      }
}
Unfortunately, some pass then turns the innermost loop to have more than 2 basic blocks
and it isn't vectorized because of that.

Also, I have disabled (for now) SIMTization of collapsed simd loops, because for SIMT
it would be using a single thread anyway and I didn't want to bother with checking
SIMT on all places I've been changing.  If SIMT support is added for some or all
collapsed loops, that omp-low.c change needs to be reverted.

Here is that list of what hasn't been vectorized before and is now:

gcc/testsuite/gcc.dg/vect/vect-simd-17.c doit
gcc/testsuite/gfortran.dg/gomp/openmp-simd-6.f90 bar
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-10.c f28_taskloop_simd_normal._omp_fn.0
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-10.c _Z24f28_taskloop_simd_normalv._omp_fn.0
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-11.c f25_t_simd_normal._omp_fn.0
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-11.c f26_t_simd_normal._omp_fn.0
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-11.c f27_t_simd_normal._omp_fn.0
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-11.c f28_tpf_simd_guided32._omp_fn.1
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-11.c f28_tpf_simd_runtime._omp_fn.1
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-11.c _Z17f25_t_simd_normaliiiiiii._omp_fn.0
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-11.c _Z17f26_t_simd_normaliiiixxi._omp_fn.0
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-11.c _Z17f27_t_simd_normalv._omp_fn.0
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-11.c _Z20f28_tpf_simd_runtimev._omp_fn.1
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-11.c _Z21f28_tpf_simd_guided32v._omp_fn.1
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-2.c f7_simd_normal
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-2.c f7_simd_normal
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-2.c f8_f_simd_guided32
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-2.c f8_f_simd_guided32
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-2.c f8_f_simd_runtime
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-2.c f8_f_simd_runtime
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-2.c f8_pf_simd_guided32._omp_fn.0
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-2.c f8_pf_simd_runtime._omp_fn.0
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-2.c _Z18f8_pf_simd_runtimev._omp_fn.0
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-2.c _Z19f8_pf_simd_guided32v._omp_fn.0
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-4.c f8_taskloop_simd_normal._omp_fn.0
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-4.c _Z23f8_taskloop_simd_normalv._omp_fn.0
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-5.c f7_t_simd_normal._omp_fn.0
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-5.c f8_tpf_simd_guided32._omp_fn.1
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-5.c f8_tpf_simd_runtime._omp_fn.1
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-5.c _Z16f7_t_simd_normalv._omp_fn.0
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-5.c _Z19f8_tpf_simd_runtimev._omp_fn.1
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-5.c _Z20f8_tpf_simd_guided32v._omp_fn.1
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-8.c f25_simd_normal
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-8.c f25_simd_normal
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-8.c f26_simd_normal
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-8.c f26_simd_normal
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-8.c f27_simd_normal
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-8.c f27_simd_normal
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-8.c f28_f_simd_guided32
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-8.c f28_f_simd_guided32
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-8.c f28_f_simd_runtime
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-8.c f28_f_simd_runtime
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-8.c f28_pf_simd_guided32._omp_fn.0
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/for-8.c f28_pf_simd_runtime._omp_fn.0
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-8.c _Z19f28_pf_simd_runtimev._omp_fn.0
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/for-8.c _Z20f28_pf_simd_guided32v._omp_fn.0
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/master-combined-1.c main._omp_fn.9
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/master-combined-1.c main._omp_fn.9
libgomp/testsuite/libgomp.c++/../libgomp.c-c++-common/simd-1.c f2
libgomp/testsuite/libgomp.c/../libgomp.c-c++-common/simd-1.c f2
libgomp/testsuite/libgomp.c/pr70680-2.c f1._omp_fn.0
libgomp/testsuite/libgomp.c/pr70680-2.c f2._omp_fn.0
libgomp/testsuite/libgomp.c/pr70680-2.c f3._omp_fn.0
libgomp/testsuite/libgomp.c/pr70680-2.c f4._omp_fn.0
libgomp/testsuite/libgomp.c/simd-8.c foo
libgomp/testsuite/libgomp.c/simd-9.c bar
libgomp/testsuite/libgomp.c/simd-9.c foo

2020-09-25  Jakub Jelinek  <jakub@redhat.com>

gcc/
	* omp-low.c (scan_omp_1_stmt): Don't call scan_omp_simd for
	collapse > 1 loops as simt doesn't support collapsed loops yet.
	* omp-expand.c (expand_omp_for_init_counts, expand_omp_for_init_vars):
	Small tweaks to function comment.
	(expand_omp_simd): Rewritten collapse > 1 support to only attempt
	to vectorize the innermost loop and emit set of outer loops around it.
	For non-composite simd with collapse > 1 without broken loop don't
	even try to compute number of iterations first.  Add support for
	non-rectangular simd loops.
	(expand_omp_for): Don't sorry_at on non-rectangular simd loops.
gcc/testsuite/
	* gcc.dg/vect/vect-simd-17.c: New test.
libgomp/
	* testsuite/libgomp.c/loop-25.c: New test.
2020-09-25 10:43:37 +02:00
Martin Liska
b2784a9698 Add cgraph_edge::debug function.
gcc/ChangeLog:

	* cgraph.c (cgraph_edge::debug): New.
	* cgraph.h (cgraph_edge::debug): New.
2020-09-25 10:13:13 +02:00
Martin Liska
e9e2953ced Fix spacing in cgraph_node::dump.
gcc/ChangeLog:

	* cgraph.c (cgraph_node::dump): Always print space at the end
	of a message.  Remove one extra space.
2020-09-25 10:11:27 +02:00
Tom de Vries
7ac25ab398 [testsuite] Add missing require-effective-target alloca
Add missing require-effect-target alloca directives.

Tested on nvptx.

gcc/testsuite/ChangeLog:

2020-09-25  Tom de Vries  <tdevries@suse.de>

	* gcc.dg/analyzer/pr93355-localealias.c: Require effective target
	alloca.
2020-09-25 09:06:16 +02:00
Tom de Vries
fa91ca7f50 [testsuite] Add effective target ident_directive
On nvptx we run into:
...
FAIL: c-c++-common/ident-1b.c  -Wc++-compat   scan-assembler GCC:
FAIL: c-c++-common/ident-2b.c  -Wc++-compat   scan-assembler GCC:
...

Using a scan-assembler directive adds -fno-indent to the compile options.
The test c-c++-common/ident-1b.c adds dg-options "-fident", and intends to
check that the -fident overrides the -fno-indent, by means of the
scan-assembler.  But for nvptx, there's no .ident directive, both with -fident
and -fno-ident.

Fix this by adding an effective target ident_directive, and requiring
it in both test-cases.

Tested on nvptx and x86_64.

gcc/testsuite/ChangeLog:

2020-09-24  Tom de Vries  <tdevries@suse.de>

	* lib/target-supports.exp (check_effective_target_ident_directive): New proc.
	* c-c++-common/ident-1b.c: Require effective target ident_directive.
	* c-c++-common/ident-2b.c: Same.
2020-09-25 09:06:12 +02:00
GCC Administrator
a2b7397b50 Daily bump. 2020-09-25 00:16:27 +00:00
Mark Wielaard
942ab9e9d4 libiberty: Add get_DW_UT_name and update include/dwarf2.{def,h}
This adds a get_DW_UT_name function to dwarfnames using dwarf2.def
for use in binutils readelf to show the unit types in a DWARF5 header.

Also remove DW_CIE_VERSION which was already removed in binutils/gdb
and is not used in gcc.

include/ChangeLog:

	* dwarf2.def: Add DWARF5 Unit type header encoding macros
	DW_UT_FIRST, DW_UT and DW_UT_END.
	* dwarf2.h (enum dwarf_unit_type): Removed and define using
	DW_UT_FIRST, DW_UT and DW_UT_END macros.
	(DW_CIE_VERSION): Removed.
	(get_DW_UT_name): New function declaration.

libiberty/ChangeLog:

	* dwarfnames.c (get_DW_UT_name): Define using DW_UT_FIRST, DW_UT
	and DW_UT_END.
2020-09-24 22:37:10 +02:00
Nathan Sidwell
d13c0ae859 c++: Cleanup some decl pushing apis
In cleaning up local decl handling, here's an initial patch that takes
advantage of C++'s default args for the is_friend parm of pushdecl,
duplicate_decls and push_template_decl_real and the scope & tpl_header
parms of xref_tag.  Then many of the calls simply not mention these.
I also rename push_template_decl_real to push_template_decl, deleting
the original forwarding function.  This'll make my later patches
changing their types less intrusive.  There are 2 functional changes:

1) push_template_decl requires is_friend to be correct, it doesn't go
checking for a friend function (an assert is added).

2) debug_overload prints out Hidden and Using markers for the overload set.

	gcc/cp/
	* cp-tree.h (duplicate_decls): Default is_friend to false.
	(xref_tag): Default tag_scope & tpl_header_p to ts_current & false.
	(push_template_decl_real): Default is_friend to false.  Rename to
	...
	(push_template_decl): ... here.  Delete original decl.
	* name-lookup.h (pushdecl_namespace_level): Default is_friend to
	false.
	(pushtag): Default tag_scope to ts_current.
	* coroutines.cc (morph_fn_to_coro): Drop default args to xref_tag.
	* decl.c (start_decl): Drop default args to duplicate_decls.
	(start_enum): Drop default arg to pushtag & xref_tag.
	(start_preparsed_function): Pass DECL_FRIEND_P to
	push_template_decl.
	(grokmethod): Likewise.
	* friend.c (do_friend): Rename push_template_decl_real calls.
	* lambda.c (begin_lamnbda_type): Drop default args to xref_tag.
	(vla_capture_type): Likewise.
	* name-lookup.c (maybe_process_template_type_declaration): Rename
	push_template_decl_real call.
	(pushdecl_top_level_and_finish): Drop default arg to
	pushdecl_namespace_level.
	* pt.c (push_template_decl_real): Assert no surprising friend
	functions.  Rename to ...
	(push_template_decl): ... here.  Delete original function.
	(lookup_template_class_1): Drop default args from pushtag.
	(instantiate_class_template_1): Likewise.
	* ptree.c (debug_overload): Print hidden and using markers.
	* rtti.c (init_rtti_processing): Drop refault args from xref_tag.
	(build_dynamic_cast_1, tinfo_base_init): Likewise.
	* semantics.c (begin_class_definition): Drop default args to
	pushtag.
	gcc/objcp/
	* objcp-decl.c (objcp_start_struct): Drop default args to
	xref_tag.
	(objcp_xref_tag): Likewise.
	libcc1/
	* libcp1plugin.cc (supplement_binding): Drop default args to
	duplicate_decls.
	(safe_pushtag): Drop scope parm.  Drop default args to pushtag.
	(safe_pushdecl_maybe_friend): Rename to ...
	(safe_pushdecl): ... here. Drop is_friend parm.  Drop default args
	to pushdecl.
	(plugin_build_decl): Adjust safe_pushdecl & safe_pushtag calls.
	(plugin_build_constant): Adjust safe_pushdecl call.
2020-09-24 12:56:59 -07:00
Nathan Sidwell
6b6c89b37b c++: add testcase [PR97177]
Pr97177 is the local-var duplicate of pr97171.  So just adding the testcase.

	gcc/testsuite/
	* g++.dg/template/local-var1.C: New.
2020-09-24 12:13:28 -07:00
Nathan Sidwell
d482c07b34 c++: restrict test to c++>=11 [pr97171]
I'd missed an important restriction on use of noexcept.  Fixed thusly

	gcc/testsuite/
	* g++.dg/template/local-fn4.C: Add target c++11
2020-09-24 11:35:59 -07:00
Clément Chigot
1b8a23fc97 runtime: remove __go_ptrace on AIX
AIX ptrace syscalls doesn't have the same semantic than the glibc one.
The syscall package is already handling it correctly so disable the new
__go_ptrace C function for AIX.

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/256777
2020-09-24 11:31:12 -07:00
Antony Polukhin
c1fc9f6e10 libstdc++: assert that type traits are not misused with incomplete types [PR 71579]
libstdc++-v3/ChangeLog:

	PR libstdc++/71579
	* include/std/type_traits (invoke_result, is_invocable)
	(is_invocable_r, is_nothrow_invocable, is_nothrow_invocable_r):
	Add static_asserts to make sure that the arguments of the type
	traits are not misused with incomplete types.
	* testsuite/20_util/invoke_result/incomplete_args_neg.cc: New test.
	* testsuite/20_util/is_invocable/incomplete_args_neg.cc: New test.
	* testsuite/20_util/is_invocable/incomplete_neg.cc: New test.
	* testsuite/20_util/is_nothrow_invocable/incomplete_args_neg.cc:
	New test.
	* testsuite/20_util/is_nothrow_invocable/incomplete_neg.cc: Check
	for error on incomplete type usage in trait.
2020-09-24 18:51:37 +01:00
Patrick Palka
42907ca9a4 libstdc++: Specialize ranges::__detail::__box for semiregular types
The class template semiregular-box<T> defined in [range.semi.wrap] is
used by a number of views to accomodate non-semiregular subobjects
while ensuring that the overall view remains semiregular.  It provides
a stand-in default constructor, copy assignment operator and move
assignment operator whenever the underlying type lacks them.  The
wrapper derives from std::optional<T> to support default construction
when T is not default constructible.

It would be nice for this wrapper to essentially be a no-op when the
underlying type is already semiregular, but this is currently not the
case due to its use of std::optional<T>, which incurs space overhead
compared to storing just T.

To that end, this patch specializes the semiregular wrapper for
semiregular T.  Compared to the primary template, this specialization
uses less space, and it allows [[no_unique_address]] to optimize away
wrapped data members whose underlying type is empty and semiregular
(e.g. a non-capturing lambda).  This patch also applies
[[no_unique_address]] to the five data members that use the wrapper.

libstdc++-v3/ChangeLog:

	* include/std/ranges (__detail::__boxable): Split out the
	associated constraints of __box into here.
	(__detail::__box): Use the __boxable concept.  Define a leaner
	partial specialization for semiregular types.
	(single_view::_M_value): Give it [[no_unique_address]].
	(filter_view::_M_pred): Likewise.
	(transform_view::_M_fun): Likewise.
	(take_while_view::_M_pred): Likewise.
	(drop_while_view::_M_pred):: Likewise.
	* testsuite/std/ranges/adaptors/detail/semiregular_box.cc: New
	test.
2020-09-24 12:58:39 -04:00
Jonathan Wakely
61f7995398 libstdc++: Fix misnamed configure option in manual
libstdc++-v3/ChangeLog:

	* doc/xml/manual/configure.xml: Correct name of option.
	* doc/html/*: Regenerate.
2020-09-24 17:35:02 +01:00
Alex Coplan
637ad78cdf arm: Add support for Neoverse N2 CPU
This adds support for Arm's Neoverse N2 CPU to the AArch32 backend.
Neoverse N2 builds AArch32 at EL0 and therefore needs support in AArch32
GCC.

gcc/ChangeLog:

	* config/arm/arm-cpus.in (neoverse-n2): New.
	* config/arm/arm-tables.opt: Regenerate.
	* config/arm/arm-tune.md: Regenerate.
	* doc/invoke.texi: Document support for Neoverse N2.
2020-09-24 17:22:44 +01:00
Alex Coplan
50d9db203b aarch64: Add support for Neoverse N2 CPU
This patch adds support for Arm's Neoverse N2 CPU to the AArch64
backend.

gcc/ChangeLog:

	* config/aarch64/aarch64-cores.def: Add Neoverse N2.
	* config/aarch64/aarch64-tune.md: Regenerate.
	* doc/invoke.texi: Document AArch64 support for Neoverse N2.
2020-09-24 17:21:47 +01:00
Richard Biener
4b9d61f79c add move CTOR to auto_vec, use auto_vec for get_loop_exit_edges
This adds a move CTOR to auto_vec<T, 0> and makes use of a
auto_vec<edge> return value for get_loop_exit_edges denoting
that lifetime management of the vector is handed to the caller.

The move CTOR prompted the hash_table change because it appearantly
makes the copy CTOR implicitely deleted (good) and hash-table
expansion of the odr_enum_map which is
hash_map <nofree_string_hash, odr_enum> where odr_enum has an
auto_vec<odr_enum_val, 0> member triggers this.  Not sure if
there's a latent bug there before this (I think we're not
invoking DTORs, but we're invoking copy-CTORs).

2020-08-06  Richard Biener  <rguenther@suse.de>

	* vec.h (auto_vec<T, 0>::auto_vec (auto_vec &&)): New move CTOR.
	(auto_vec<T, 0>::operator=(auto_vec &&)): Delete.
	* hash-table.h (hash_table::expand): Use std::move when expanding.
	* cfgloop.h (get_loop_exit_edges): Return auto_vec<edge>.
	* cfgloop.c (get_loop_exit_edges): Adjust.
	* cfgloopmanip.c (fix_loop_placement): Likewise.
	* ipa-fnsummary.c (analyze_function_body): Likewise.
	* ira-build.c (create_loop_tree_nodes): Likewise.
	(create_loop_tree_node_allocnos): Likewise.
	(loop_with_complex_edge_p): Likewise.
	* ira-color.c (ira_loop_edge_freq): Likewise.
	* loop-unroll.c (analyze_insns_in_loop): Likewise.
	* predict.c (predict_loops): Likewise.
	* tree-predcom.c (last_always_executed_block): Likewise.
	* tree-ssa-loop-ch.c (ch_base::copy_headers): Likewise.
	* tree-ssa-loop-im.c (store_motion_loop): Likewise.
	* tree-ssa-loop-ivcanon.c (loop_edge_to_cancel): Likewise.
	(canonicalize_loop_induction_variables): Likewise.
	* tree-ssa-loop-manip.c (get_loops_exits): Likewise.
	* tree-ssa-loop-niter.c (find_loop_niter): Likewise.
	(finite_loop_p): Likewise.
	(find_loop_niter_by_eval): Likewise.
	(estimate_numbers_of_iterations): Likewise.
	* tree-ssa-loop-prefetch.c (emit_mfence_after_loop): Likewise.
	(may_use_storent_in_loop_p): Likewise.
2020-09-24 15:59:19 +02:00
Nathan Sidwell
2e66e53b1e c++: local-decls are never member fns [PR97186]
This fixes an ICE in noexcept instantiation.  It was presuming
functions always have template_info, but that changed with my
DECL_LOCAL_DECL_P changes.  Fortunately DECL_LOCAL_DECL_P fns are
never member fns, so we don't need to go fishing out a this pointer.

Also I realized I'd misnamed local10.C, so renaming it local-fn3.C,
and while there adding the effective-target lto that David E pointed
out was missing.

	PR c++/97186
	gcc/cp/
	* pt.c (maybe_instantiate_noexcept): Local externs are never
	member fns.
	gcc/testsuite/
	* g++.dg/template/local10.C: Rename ...
	* g++.dg/template/local-fn3.C: .. here.  Require lto.
	* g++.dg/template/local-fn4.C: New.
2020-09-24 06:21:54 -07:00
Jan Hubicka
9de8fa8052 Add modref testcase
* gcc.dg/tree-ssa/modref-1.c: New test.
2020-09-24 15:10:04 +02:00
Jan Hubicka
c33f474239 Add access through parameter derference tracking to modref
re-add tracking of accesses which was unfinished in David's patch.
At the moment I only implemented tracking of the fact that access is based on
derefernece of the parameter (so we track THIS pointers).
Patch does not implement IPA propagation since it needs bit more work which
I will post shortly: ipa-fnsummary needs to track when parameter points to
local memory, summaries needs to be merged when function is inlined (because
jump functions are) and propagation needs to be turned into iterative dataflow
on SCC components.

Patch also adds documentation of -fipa-modref and params that was left uncommited
in my branch :(.

Even without this change it does lead to nice increase of disambiguations
for cc1plus build.

Alias oracle query stats:
  refs_may_alias_p: 62758323 disambiguations, 72935683 queries
  ref_maybe_used_by_call_p: 139511 disambiguations, 63654045 queries
  call_may_clobber_ref_p: 23502 disambiguations, 29242 queries
  nonoverlapping_component_refs_p: 0 disambiguations, 37654 queries
  nonoverlapping_refs_since_match_p: 19417 disambiguations, 55555 must overlaps, 75721 queries
  aliasing_component_refs_p: 54665 disambiguations, 752449 queries
  TBAA oracle: 21917926 disambiguations 53054678 queries
               15763411 are in alias set 0
               10162238 queries asked about the same object
               124 queries asked about the same alias set
               0 access volatile
               3681593 are dependent in the DAG
               1529386 are aritificially in conflict with void *

Modref stats:
  modref use: 8311 disambiguations, 32527 queries
  modref clobber: 742126 disambiguations, 1036986 queries
  1987054 tbaa queries (1.916182 per modref query)
  125479 base compares (0.121004 per modref query)

PTA query stats:
  pt_solution_includes: 968314 disambiguations, 13609584 queries
  pt_solutions_intersect: 1019136 disambiguations, 13147139 queries

So compared to
https://gcc.gnu.org/pipermail/gcc-patches/2020-September/554605.html
we get 41% more use disambiguations (with similar number of queries) and 8% more
clobber disambiguations.

For tramp3d:
Alias oracle query stats:
  refs_may_alias_p: 2052256 disambiguations, 2312703 queries
  ref_maybe_used_by_call_p: 7122 disambiguations, 2089118 queries
  call_may_clobber_ref_p: 234 disambiguations, 234 queries
  nonoverlapping_component_refs_p: 0 disambiguations, 4299 queries
  nonoverlapping_refs_since_match_p: 329 disambiguations, 10200 must overlaps, 10616 queries
  aliasing_component_refs_p: 857 disambiguations, 34555 queries
  TBAA oracle: 885546 disambiguations 1677080 queries
               132105 are in alias set 0
               469030 queries asked about the same object
               0 queries asked about the same alias set
               0 access volatile
               190084 are dependent in the DAG
               315 are aritificially in conflict with void *

Modref stats:
  modref use: 426 disambiguations, 1881 queries
  modref clobber: 10042 disambiguations, 16202 queries
  19405 tbaa queries (1.197692 per modref query)
  2775 base compares (0.171275 per modref query)

PTA query stats:
  pt_solution_includes: 313908 disambiguations, 526183 queries
  pt_solutions_intersect: 130510 disambiguations, 416084 queries

Here uses decrease by 4 disambiguations and clobber improve by 3.5%.  I think
the difference is caused by fact that gcc has much more alias set 0 accesses
originating from gimple and tree unions as I mentioned in original mail.

After pushing out the IPA propagation I will re-add code to track offsets and
sizes that further improve disambiguation. On tramp3d it enables a lot of DSE
for structure fields not acessed by uninlined function.

gcc/

	* doc/invoke.texi: Document -fipa-modref, ipa-modref-max-bases,
	ipa-modref-max-refs, ipa-modref-max-accesses, ipa-modref-max-tests.
	* ipa-modref-tree.c (test_insert_search_collapse): Update.
	(test_merge): Update.
	(gt_ggc_mx): New function.
	* ipa-modref-tree.h (struct modref_access_node): New structure.
	(struct modref_ref_node): Add every_access and accesses array.
	(modref_ref_node::modref_ref_node): Update ctor.
	(modref_ref_node::search): New member function.
	(modref_ref_node::collapse): New member function.
	(modref_ref_node::insert_access): New member function.
	(modref_base_node::insert_ref): Do not collapse base if ref is 0.
	(modref_base_node::collapse): Copllapse also refs.
	(modref_tree): Add accesses.
	(modref_tree::modref_tree): Initialize max_accesses.
	(modref_tree::insert): Add access parameter.
	(modref_tree::cleanup): New member function.
	(modref_tree::merge): Add parm_map; merge accesses.
	(modref_tree::copy_from): New member function.
	(modref_tree::create_ggc): Add max_accesses.
	* ipa-modref.c (dump_access): New function.
	(dump_records): Dump accesses.
	(dump_lto_records): Dump accesses.
	(get_access): New function.
	(record_access): Record access.
	(record_access_lto): Record access.
	(analyze_call): Compute parm_map.
	(analyze_function): Update construction of modref records.
	(modref_summaries::duplicate): Likewise; use copy_from.
	(write_modref_records): Stream accesses.
	(read_modref_records): Sream accesses.
	(pass_ipa_modref::execute): Update call of merge.
	* params.opt (-param=modref-max-accesses): New.
	* tree-ssa-alias.c (alias_stats): Add modref_baseptr_tests.
	(dump_alias_stats): Update.
	(base_may_alias_with_dereference_p): New function.
	(modref_may_conflict): Check accesses.
	(ref_maybe_used_by_call_p_1): Update call to modref_may_conflict.
	(call_may_clobber_ref_p_1): Update call to modref_may_conflict.
2020-09-24 15:09:17 +02:00
Tom de Vries
329851416e [testsuite, nvptx] Fix gcc.dg/tls/thr-cse-1.c
With nvptx, we run into:
...
FAIL: gcc.dg/tls/thr-cse-1.c scan-assembler-not \
  emutls_get_address.*emutls_get_address.*
...
because the nvptx assembly looks like:
...
  call (%value_in), __emutls_get_address, (%out_arg1);
  ...
// BEGIN GLOBAL FUNCTION DECL: __emutls_get_address
.extern .func (.param.u64 %value_out) __emutls_get_address (.param.u64 %in_ar0);
...

Fix this by checking the slim final dump instead, where we have just:
...
   12: r35:DI=call [`__emutls_get_address'] argc:0
...

gcc/testsuite/ChangeLog:

2020-09-24  Tom de Vries  <tdevries@suse.de>

	* gcc.dg/tls/thr-cse-1.c: Scan final dump instead of assembly for
	nvptx.
2020-09-24 14:30:14 +02:00
Tom de Vries
c4d283b142 [testsuite] Scan final instead of asm in independent-cloneids-1.c
When running test-case gcc.dg/independent-cloneids-1.c for nvptx, we get:
...
FAIL: scan-assembler-times (?n)^_*bar[.$_]constprop[.$_]0: 1
FAIL: scan-assembler-times (?n)^_*bar[.$_]constprop[.$_]1: 1
FAIL: scan-assembler-times (?n)^_*bar[.$_]constprop[.$_]2: 1
FAIL: scan-assembler-times (?n)^_*foo[.$_]constprop[.$_]0: 1
FAIL: scan-assembler-times (?n)^_*foo[.$_]constprop[.$_]1: 1
FAIL: scan-assembler-times (?n)^_*foo[.$_]constprop[.$_]2: 1
...

The test expects to find something like:
...
bar.constprop.0:
...
but instead on nvptx we have:
...
.func (.param.u32 %value_out) bar$constprop$0
...

Fix this by rewriting the scans to use the final dump instead.

Tested on x86_64.

gcc/testsuite/ChangeLog:

2020-09-24  Tom de Vries  <tdevries@suse.de>

	* gcc.dg/independent-cloneids-1.c: Use scan-rtl-dump instead of
	scan-assembler.
2020-09-24 13:40:15 +02:00
Richard Biener
a8d5c28233 target/97192 - new testcase for fixed PR
This adds another testcase for the PR97085 fix.

2020-09-24  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/97085
	* gcc.dg/pr97192.c: New testcase.
2020-09-24 13:29:05 +02:00
Paul Thomas
e86a02f87d This patch fixes PR96495 - frees result components outside loop.
2020-24-09  Paul Thomas  <pault@gcc.gnu.org>

gcc/fortran
	PR fortran/96495
	* trans-expr.c (gfc_conv_procedure_call): Take the deallocation
	of allocatable result components of a scalar result outside the
	scalarization loop. Find and use the stored result.

gcc/testsuite/
	PR fortran/96495
	* gfortran.dg/alloc_comp_result_2.f90 : New test.
2020-09-24 11:52:30 +01:00
Tom de Vries
fe28d34079 [testsuite, nvptx] Fix string matching in gcc.dg/pr87314-1.c
with nvptx we run into:
...
FAIL: gcc.dg/pr87314-1.c scan-assembler hellooo
...

The required string is part of the assembly, just in a different format than
expected:
...
        .const .align 1 .u8 $LC0[12] =
	  { 104, 101, 108, 108, 111, 111, 111, 111, 98, 121, 101, 0 };
...

Fix this by adding an nvptx-specific scan-assembler directive.

Tested on nvptx and x86_64.

gcc/testsuite/ChangeLog:

2020-09-24  Tom de Vries  <tdevries@suse.de>

	* gcc.dg/pr87314-1.c: Add nvptx-specific scan-assembler directive.
2020-09-24 12:41:55 +02:00
Richard Sandiford
59c8329389 arm: Add a couple of extra stack-protector tests
These tests were inspired by corresponding aarch64 ones.
They already pass.

gcc/testsuite/
	* gcc.target/arm/stack-protector-5.c: New test.
	* gcc.target/arm/stack-protector-6.c: Likewise.
2020-09-24 10:06:11 +01:00
Richard Sandiford
e94797250b arm: Fix canary address calculation for non-PIC
For non-PIC, the stack protector patterns did:

	  rtx mem = XEXP (force_const_mem (SImode, operands[1]), 0);
	  emit_move_insn (operands[2], mem);

Here, operands[1] is the address of the canary (&__stack_chk_guard)
and operands[2] is the register that we want to move that address into.
However, the code above instead sets operands[2] to the address of a
constant pool entry that contains &__stack_chk_guard, rather than to
&__stack_chk_guard itself.  The sequence therefore does one less
pointer indirection than it should.

The net effect was to use &__stack_chk_guard for stack-smash detection,
instead of using __stack_chk_guard itself.

gcc/
	* config/arm/arm.md (*stack_protect_combined_set_insn): For non-PIC,
	load the address of the canary rather than the address of the
	constant pool entry that points to it.
	(*stack_protect_combined_test_insn): Likewise.

gcc/testsuite/
	* gcc.target/arm/stack-protector-3.c: New test.
	* gcc.target/arm/stack-protector-4.c: Likewise.
2020-09-24 10:06:11 +01:00
Richard Biener
10843f8303 tree-optimization/97085 - fold some trivial bool vector ?:
The following aovids the ICE in the testcase by doing some additional
simplification of VEC_COND_EXPRs for VECTOR_BOOLEAN_TYPE_P which
we don't really expect, esp. when they are not classical vectors,
thus AVX512 or SVE masks.

2020-09-24  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/97085
	* match.pd (mask ? { false,..} : { true, ..} -> ~mask): New.

	* gcc.dg/vect/pr97085.c: New testcase.
2020-09-24 10:20:41 +02:00
Tom de Vries
7e43716200 [testsuite] Require non_strict_align in pr94600-{1,3}.c
With the nvptx target, we run into:
...
FAIL: gcc.dg/pr94600-1.c scan-rtl-dump-times final "\\(mem/v" 6
FAIL: gcc.dg/pr94600-1.c scan-rtl-dump-times final "\\(set \\(mem/v" 6
FAIL: gcc.dg/pr94600-3.c scan-rtl-dump-times final "\\(mem/v" 1
FAIL: gcc.dg/pr94600-3.c scan-rtl-dump-times final "\\(set \\(mem/v" 1
...
The scans attempt to check for volatile stores, but on nvptx we have memcpy
instead.

This is due to nvptx being a STRICT_ALIGNMENT target, which has the effect
that the TYPE_MODE for the store target is set to BKLmode in
compute_record_mode.

Fix the FAILs by requiring effective target non_strict_align.

Tested on nvptx.

gcc/testsuite/ChangeLog:

2020-09-24  Tom de Vries  <tdevries@suse.de>

	* gcc.dg/pr94600-1.c: Require effective target non_strict_align for
	scan-rtl-dump-times.
	* gcc.dg/pr94600-3.c: Same.
2020-09-24 10:15:37 +02:00
Jan Hubicka
c9da53d698 Fix memory allocations in ipa-modref.
Pair ggc_delete with ggc_alloc_no_dtor.  I copy same scheme as used by Martin
in ipa-fnsummary, that is creating a static member function create_ggc hidding
the ugly bits and using it in ipa-modref.c.

I also noticed that modref-tree leaks memory on destruction/collapse method and
fixed that.

Bootstrapped/regtested x86_64-linux.

gcc/ChangeLog:

2020-09-24  Jan Hubicka  <hubicka@ucw.cz>

	* ipa-modref-tree.h (modref_base::collapse): Release memory.
	(modref_tree::create_ggc): New member function.
	(modref_tree::colapse): Release memory.
	(modref_tree::~modref_tree): New destructor.
	* ipa-modref.c (modref_summaries::create_ggc): New function.
	(analyze_function): Use create_ggc.
	(modref_summaries::duplicate): Likewise.
	(read_modref_records): Likewise.
	(modref_read): Likewise.
2020-09-24 08:28:09 +02:00
Tom de Vries
2d5fb576bd [testsuite] Check target alias in builtin-has-attribute-3.c
When running test-case c-c++-common/builtin-has-attribute-3.c on nvptx, I get:
...
FAIL: c-c++-common/builtin-has-attribute-3.c  -Wc++-compat \
  (test for excess errors)
Excess errors:
src/gcc/testsuite/c-c++-common/builtin-has-attribute-3.c:33:33: error: \
  alias definitions not supported in this configuration
...

Fix this by adding -DSKIP_ALIAS to the compilation options for effective
target ! alias.

Tested on nvptx.

gcc/testsuite/ChangeLog:

	* c-c++-common/builtin-has-attribute-3.c: Compile with -DSKIP_ALIAS
	for effective target ! alias.
2020-09-24 08:26:35 +02:00
Kewen Lin
5427bd4d57 test: Adjust case p9-vec-length-full-6.c [PR97075]
The commit r11-3230 brings a nice improvement to use full
vectors instead of partial vectors when available.  This
patch is to fix the test failures on p9-vec-length-full-6.c,
where 64bit/32bit pairs are able to use full vector instead.

Bootstrapped/regtested on powerpc64le-linux-gnu P9.

gcc/testsuite/ChangeLog:

	PR tree-optimization/97075
	* gcc.target/powerpc/p9-vec-length-full-6.c: Adjust.
2020-09-24 00:45:07 -05:00
Alan Modra
fff56af642 Re: [RS6000] Power10 libffi fixes
Adding a nop broke ffi_closure_LINUX64!

	* src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Correct
	location of .Lret.
2020-09-24 15:02:19 +09:30
Alan Modra
34cd848904 [RS6000] rs6000_rtx_costs for PLUS/MINUS constant
These functions do behave a little differently for SImode, so the
mode should be passed.

	* config/rs6000/rs6000.c (rs6000_rtx_costs): Pass mode to
	reg_or_add_cint_operand and reg_or_sub_cint_operand.
2020-09-24 12:52:23 +09:30
Alan Modra
0075cea0fd [RS6000] Count rldimi constant insns
rldimi is generated by rs6000_emit_set_long_const when the high and
low 32 bits of a 64-bit constant are equal.

	PR target/93012
	* config/rs6000/rs6000.c (num_insns_constant_gpr): Count rldimi
	constants correctly.
2020-09-24 12:52:02 +09:30
Alan Modra
08cd8d5929 [RS6000] Power10 libffi fixes
Power10 pc-relative code doesn't use or preserve r2 as a TOC pointer.
That means calling between pc-relative and TOC using code can't be
done without intervening linker stubs, and a call from TOC code to
pc-relative code must have a nop after the bl in order to restore r2.

Now the PowerPC libffi assembly code doesn't use r2 except for the
implicit use when making calls back to C, ffi_closure_helper_LINUX64
and ffi_prep_args64.  So changing the assembly to interoperate with
pc-relative code without stubs is easily done.

	* src/powerpc/linux64.S (ffi_call_LINUX64): Don't emit global
	entry when __PCREL__.  Call using @notoc.  Add nops.
	* src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Likewise.
	(ffi_go_closure_linux64): Likewise.
2020-09-24 12:44:08 +09:30
Alan Modra
677b9150f5 [RS6000] Built-in __PCREL__ define
Useful in assembly to know details of power10 function calls.

	* config/rs6000/rs6000-c.c (rs6000_target_modify_macros):
	Conditionally define __PCREL__.
2020-09-24 11:40:02 +09:30
Alan Modra
199baa71f7 [RS6000] PR97107, libgo fails to build for power10
Calls from split-stack code to non-split-stack code need to expand
mapped stack memory via __morestack.  Even tail calls.

__morestack is quite a surprising function on powerpc in that it calls
back to its caller, and a tail call will continue running in the
context of extra mapped stack.

	PR target/97107
	* config/rs6000/rs6000-internal.h (struct rs6000_stack): Improve
	calls_p comment.
	* config/rs6000/rs6000-logue.c (rs6000_stack_info): Likewise.
	(rs6000_expand_split_stack_prologue): Emit the prologue for
	functions that make a sibling call.
2020-09-24 11:40:02 +09:30
David Malcolm
6b828f6951 analyzer: add testcases for PR 93355 (intl/localealias.c leak)
PR analyzer/93355 reports a missing diagnostic about a FILE leak in
intl/localealias.c.  This appears to be due to a issue in the
feasibility-checking code, though there is also a state explosion.

This patch adds test cases that I've been using when investigating this,
two of them currently requiring -fno-analyzer-feasibility, and one
currently requiring -Wno-analyzer-too-complex.

gcc/testsuite/ChangeLog:
	PR analyzer/93355
	* gcc.dg/analyzer/pr93355-localealias-feasibility.c: New test.
	* gcc.dg/analyzer/pr93355-localealias-simplified.c: New test.
	* gcc.dg/analyzer/pr93355-localealias.c: New test.
2020-09-23 21:25:51 -04:00
David Malcolm
84fb354666 analyzer: add -fno-analyzer-feasibility
This patch provides a new option "-fno-analyzer-feasibility" as a way
to disable feasibility-checking of the constraints along the control
flow paths for -fanalyzer diagnostics.  I'm adding this in the hope of
making it easier to debug issues involving the feasibility-checking
logic.

The patch adds a new rejected_constraint object which is captured if
exploded_path::feasible_p fails, and adds logic that uses this to emit
an additional custom_event within the checker_path for the diagnostic,
showing where in the control flow path the diagnostic would have been
rejected, and giving details of why.

gcc/analyzer/ChangeLog:
	* analyzer.h (struct rejected_constraint): New decl.
	* analyzer.opt (fanalyzer-feasibility): New option.
	* diagnostic-manager.cc (path_builder::path_builder): Add
	"problem" param and use it to initialize new field.
	(path_builder::get_feasibility_problem): New accessor.
	(path_builder::m_feasibility_problem): New field.
	(dedupe_winners::add): Remove inversion of logic in "if" clause,
	swapping if/else suites.  In the !feasible_p suite, inspect
	flag_analyzer_feasibility and add code to handle when this
	is off, accepting the infeasible path, but recording the
	feasibility_problem.
	(diagnostic_manager::emit_saved_diagnostic): Pass the
	feasibility_problem to the path_builder.
	(diagnostic_manager::add_events_for_eedge): If we have
	a feasibility_problem at this edge, use it to add a custom event.
	* engine.cc (exploded_path::feasible_p): Pass a
	rejected_constraint ** to model.maybe_update_for_edge and transfer
	ownership of any created instance to any feasibility_problem.
	(feasibility_problem::dump_to_pp): New.
	* exploded-graph.h (feasibility_problem::feasibility_problem):
	Drop "model" param; add rejected_constraint * param.
	(feasibility_problem::~feasibility_problem): New.
	(feasibility_problem::dump_to_pp): New decl.
	(feasibility_problem::m_model): Drop field.
	(feasibility_problem::m_rc): New field.
	* program-point.cc (function_point::get_location): Handle
	PK_BEFORE_SUPERNODE and PK_AFTER_SUPERNODE.
	* program-state.cc (program_state::on_edge): Pass NULL to new
	param of region_model::maybe_update_for_edge.
	* region-model.cc (region_model::add_constraint): New overload
	adding a rejected_constraint ** param.
	(region_model::maybe_update_for_edge): Add rejected_constraint **
	param and pass it to the various apply_constraints_for_ calls.
	(region_model::apply_constraints_for_gcond): Add
	rejected_constraint ** param and pass it to add_constraint calls.
	(region_model::apply_constraints_for_gswitch): Likewise.
	(region_model::apply_constraints_for_exception): Likewise.
	(rejected_constraint::dump_to_pp): New.
	* region-model.h (region_model::maybe_update_for_edge):
	Add rejected_constraint ** param.
	(region_model::add_constraint): New overload adding a
	rejected_constraint ** param.
	(region_model::apply_constraints_for_gcond): Add
	rejected_constraint ** param.
	(region_model::apply_constraints_for_gswitch): Likewise.
	(region_model::apply_constraints_for_exception): Likewise.
	(struct rejected_constraint): New.

gcc/ChangeLog:
	* doc/analyzer.texi (Analyzer Paths): Add note about
	-fno-analyzer-feasibility.
	* doc/invoke.texi (Static Analyzer Options): Add
	-fno-analyzer-feasibility.

gcc/testsuite/ChangeLog:
	* gcc.dg/analyzer/feasibility-2.c: New test.
2020-09-23 21:16:01 -04:00
Ian Lance Taylor
10a83805e0 libgo: update to Go1.15.2 release
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/256618
2020-09-23 17:32:49 -07:00
GCC Administrator
82b77dee75 Daily bump. 2020-09-24 00:16:31 +00:00
Paul A. Clarke
27cdb4de83 rs6000: Add 'd' for doubleword variant of vector insert
When the "Vector Insert" section was added to the documentation,
the doubleword ('d') variant was omitted.  Add it.

2020-09-23  Paul A. Clarke  <pc@us.ibm.com>

gcc/
	* doc/extend.texi: Add 'd' for doubleword variant of
	vector insert instruction.
2020-09-24 00:01:40 +00:00
Martin Sebor
67aeddb785 Build a zero element array type that reliably renders as T[0] in diagnostcs.
gcc/ChangeLog:

	* gimple-array-bounds.cc (build_zero_elt_array_type): New function.
	(array_bounds_checker::check_mem_ref): Call it.
2020-09-23 15:19:13 -06:00
Martin Sebor
6edc8f5bfe Handle DECLs and EXPRESSIONs consistently (PR middle-end/97175).
gcc/ChangeLog:

	PR middle-end/97175
	* builtins.c (maybe_warn_for_bound): Handle both DECLs and EXPRESSIONs
	in pad->dst.ref, same is pad->src.ref.

gcc/testsuite/ChangeLog:

	PR middle-end/97175
	* gcc.dg/Wstringop-overflow-44.c: New test.
2020-09-23 15:10:20 -06:00