Commit Graph

176322 Commits

Author SHA1 Message Date
Richard Biener
f9b5db750b ipa/94947 - fix test for externally visible variables for IPA PTA
This fixes lack of an escape point of externally declared variables.

2020-05-05  Richard Biener  <rguenther@suse.de>

	PR ipa/94947
	* tree-ssa-structalias.c (ipa_pta_execute): Use
	varpool_node::externally_visible_p ().
	(refered_from_nonlocal_var): Likewise.

	* gcc.dg/torture/pr94947-1.c: New testcase.
	* gcc.dg/torture/pr94947-2.c: Likewise.
2020-05-05 14:41:15 +02:00
Eric Botcazou
5269b24605 Silence warning in LTO mode on VxWorks
The link phase is always partial (-r) for VxWorks in kernel mode, which
means that it uses incremental LTO linking by default (-flinker-output=rel).
But in this mode the LTO plugin outputs a warning if one of the object files
involved in the link does not contain LTO bytecode, before switching to
nolto-rel mode.  We do not do repeated incremental linking for VxWorks so
silence the warning.

lto-plugin/
	* lto-plugin.c: Document -linker-output-auto-notlo-rel option.
	(linker_output_set): Change type to bool.
	(linker_output_known): Likewise.
	(linker_output_auto_nolto_rel): New variable.
	(all_symbols_read_handler): Take it into account.
	<LDPO_REL>: Do not issue the warning if it is set.
	(process_option): Process -linker-output-auto-notlo-rel.
	(cleanup_handler): Remove unused variable.
	(onload) <LDPT_LINKER_OUTPUT>: Adjust to above type change.
gcc/
	* gcc.c (LTO_PLUGIN_SPEC): Define if not already.
	(LINK_PLUGIN_SPEC): Execute LTO_PLUGIN_SPEC.
	* config/vxworks.h (LTO_PLUGIN_SPEC): Define.
2020-05-05 12:42:22 +02:00
Eric Botcazou
2badc98853 Do not put incomplete CONSTRUCTORs into static memory
The CONSTRUCTOR_NO_CLEARING flag was invented to avoid generating a memset
for  CONSTRUCTORS that lack elements, but it turns out that the gimplifier
can generate a memcpy for them instead, which is worse performance-wise,
so this prevents it from doing that for them.

	* gimplify.c (gimplify_init_constructor): Do not put the constructor
	into static memory if it is not complete.
2020-05-05 12:39:09 +02:00
Richard Biener
0424a5ece5 tree-optimization/94949 - fix load eliding in SM
This fixes the case of not using the multithreaded model when
only conditionally storing to the destination.  We cannot elide
the load in this case.

2020-05-05  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/94949
	* tree-ssa-loop-im.c (execute_sm): Check whether we use
	the multithreaded model or always compute the stored value
	before eliding a load.

	* gcc.dg/torture/pr94949.c: New testcase.
2020-05-05 12:35:05 +02:00
Alex Coplan
1bd3a8af85 aarch64: eliminate redundant zero extend after bitwise negation
The attached patch eliminates a redundant zero extend from the AArch64 backend. Given the following C code:

unsigned long long foo(unsigned a)
{
    return ~a;
}

prior to this patch, AArch64 GCC at -O2 generates:

foo:
        mvn     w0, w0
        uxtw    x0, w0
        ret

but the uxtw is redundant, since the mvn clears the upper half of the x0 register. After applying this patch, GCC at -O2 gives:

foo:
        mvn     w0, w0
        ret

Testing:
    Added regression test which passes after applying the change to aarch64.md.
    Full bootstrap and regression on aarch64-linux with no additional failures.

        * config/aarch64/aarch64.md (*one_cmpl_zero_extend): New.
        * gcc.target/aarch64/mvn_zero_ext.c: New test.
2020-05-05 10:40:24 +01:00
Jakub Jelinek
144aee70b8 match.pd: Canonicalize (x + (x << cst)) into (x * cst2) [PR94800]
The popcount* testcases show yet another creative way to write popcount,
but rather than adjusting the popcount matcher to deal with it, I think
we just should canonicalize those (X + (X << C) to X * (1 + (1 << C))
and (X << C1) + (X << C2) to X * ((1 << C1) + (1 << C2)), because for
multiplication we already have simplification rules that can handle nested
multiplication (X * CST1 * CST2), while the the shifts and adds we have
nothing like that.  And user could have written the multiplication anyway,
so if we don't emit the fastest or smallest code for the multiplication by
constant, we should improve that.  At least on the testcases seems the
emitted code is reasonable according to cost, except that perhaps we could
in some cases try to improve expansion of vector multiplication by
uniform constant.

2020-05-05  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/94800
	* match.pd (X + (X << C) to X * (1 + (1 << C)),
	(X << C1) + (X << C2) to X * ((1 << C1) + (1 << C2))): New
	canonicalizations.

	* gcc.dg/tree-ssa/pr94800.c: New test.
	* gcc.dg/tree-ssa/popcount5.c: New test.
	* gcc.dg/tree-ssa/popcount5l.c: New test.
	* gcc.dg/tree-ssa/popcount5ll.c: New test.
2020-05-05 11:36:47 +02:00
Jakub Jelinek
7f916201ac x86: Fix *vec_dupv4hi constraints [PR94942]
This insn and split splits into HI->V?HImode broadcast for avx2 and later,
but either the operands need to be %xmm0-%xmm15 (i.e. VEX encoded insn), or
the insn needs both AVX512BW and AVX512VL.
Now, Yv constraint is v for AVX512VL and x otherwise, so for -mavx512vl -mno-avx512bw
we ICE if we end up with a %xmm16+ register from RA.
Yw constraint is v for AVX512VL and AVX512BW and nothing otherwise, so
in this pattern we actually need xYw.

2020-05-05  Jakub Jelinek  <jakub@redhat.com>

	PR target/94942
	* config/i386/mmx.md (*vec_dupv4hi): Use xYw constraints instead of Yv.

	* gcc.target/i386/pr94942.c: New test.
2020-05-05 11:34:45 +02:00
Jakub Jelinek
6d938a5d77 match.pd: Optimize (((type)A * B) >> prec) != 0 into __imag__ .MUL_OVERFLOW [PR94914]
On x86 (the only target with umulv4_optab) one can use mull; seto to check
for overflow instead of performing wider multiplication and performing
comparison on the high bits.

2020-05-05  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/94914
	* match.pd ((((type)A * B) >> prec) != 0 to .MUL_OVERFLOW(A, B) != 0):
	New simplification.

	* gcc.target/i386/pr94914.c: New test.
2020-05-05 11:34:45 +02:00
Uros Bizjak
59e4474a22 i386: Use int_nonimmediate_operand more
Pattern explosing and manual mode checks can be avoided by using
int_nonimmediate_operand special predicate.

While there, rewrite *x86_mov<SWI48:mode>cc_0_m1_neg_leu<SWI:mode>
to a combine pass splitter.

	* config/i386/i386.md (*testqi_ext_3): Use
	int_nonimmediate_operand instead of manual mode checks.
	(*x86_mov<SWI48:mode>cc_0_m1_neg_leu<SWI:mode>):
	Use int_nonimmediate_operand predicate.  Rewrite
	define_insn_and_split pattern to a combine pass splitter.
2020-05-05 11:33:55 +02:00
Richard Biener
cfbbceed1d fix build of targets not implementing add_stmt_cost
C++ makes mismatched prototype and implementation OK.

2020-05-05  Richard Biener  <rguenther@suse.de>

	* targhooks.h (default_add_stmt_cost): Add vec_info * parameter.
2020-05-05 11:30:06 +02:00
Rainer Orth
700d457295 build: Fix 32-bit TLS detection with 64-bit-default gas on Solaris/x86
I've recently tested i386-pc-solaris2.11 bootstrap on Solaris 11/x86
with only the bundled tools (using /usr/gnu/bin/as from binutils 2.30 in
this case).  It failed compiling libgo/runtime/proc.c, creating invalid
assembly:

proc.s: Assembler messages:
proc.s:2092: Error: junk at end of line, first unrecognized character is `*'

        .globl  __emutls_v.*runtime.g

and several more errors.  This is completely unexpected since Solaris
does support TLS.  It turned out that 32-bit TLS detection in
gcc/configure had failed:

configure:25145: checking assembler for thread-local storage support
configure:25158: /usr/gnu/bin/as   --fatal-warnings -o conftest.o conftest.s >&5
conftest.s: Assembler messages:
conftest.s:6: Error: relocated field and relocation type differ in signedness
conftest.s:7: Error: @TLSLDM reloc is not supported with 64-bit output format
conftest.s:7: Error: junk `@tlsldm' after expression

which isn't unexpected given that the bundled gas has been configured
for x86_64-pc-solaris2.11, i.e. 64-bit-default.

This is easily fixed by explicitly passing --32 for the 32-bit case,
matching what is done for the 64-bit test.

Tested on i386-pc-solaris2.11 with 32-bit-default and 64-bit-default gas
as well as with /usr/bin/as, always correctly detecting TLS support.

	* configure.ac <i[34567]86-*-*>: Add --32 to tls_as_opt on Solaris.
	* configure: Regenerate.
2020-05-05 10:42:23 +02:00
Richard Biener
308bc49688 add vec_info * parameters where needed
Soonish we'll get SLP nodes which have no corresponding scalar
stmt and thus not stmt_vec_info and thus no way to get back to
the associated vec_info.  This patch makes the vec_info available
as part of the APIs instead of putting in that back-pointer into
the leaf data structures.

2020-05-05  Richard Biener  <rguenther@suse.de>

	* tree-vectorizer.h (_stmt_vec_info::vinfo): Remove.
	(STMT_VINFO_LOOP_VINFO): Likewise.
	(STMT_VINFO_BB_VINFO): Likewise.
	* tree-vect-data-refs.c: Adjust for the above, adding vec_info *
	parameters and adjusting calls.
	* tree-vect-loop-manip.c: Likewise.
	* tree-vect-loop.c: Likewise.
	* tree-vect-patterns.c: Likewise.
	* tree-vect-slp.c: Likewise.
	* tree-vect-stmts.c: Likewise.
	* tree-vectorizer.c: Likewise.

	* target.def (add_stmt_cost): Add vec_info * parameter.
	* target.h (stmt_in_inner_loop_p): Likewise.
	* targhooks.c (default_add_stmt_cost): Adjust.
	* doc/tm.texi: Re-generate.

	* config/aarch64/aarch64.c (aarch64_extending_load_p): Add
	vec_info * parameter and adjust.
	(aarch64_sve_adjust_stmt_cost): Likewise.
	(aarch64_add_stmt_cost): Likewise.
	* config/arm/arm.c (arm_add_stmt_cost): Likewise.
	* config/i386/i386.c (ix86_add_stmt_cost): Likewise.
	* config/rs6000/rs6000.c (rs6000_add_stmt_cost): Likewise.
2020-05-05 09:48:03 +02:00
Jakub Jelinek
228646a64f i386: Simplify {,v}ph{add,sub{,s}{w,d} insn patterns [PR94460]
As mentioned in the previous PR94460 patch, the RTL patterns look too
large/complicated, we can simplify them by just performing two 2 arg
permutations to move the arguments into the right spots and then just
doing the plus/minus (or signed saturation version thereof).

2020-05-05  Jakub Jelinek  <jakub@redhat.com>

	PR target/94460
	* config/i386/sse.md (avx2_ph<plusminus_mnemonic>wv16hi3,
	ssse3_ph<plusminus_mnemonic>wv8hi3, ssse3_ph<plusminus_mnemonic>wv4hi3,
	avx2_ph<plusminus_mnemonic>dv8si3, ssse3_ph<plusminus_mnemonic>dv4si3,
	ssse3_ph<plusminus_mnemonic>dv2si3): Simplify RTL patterns.
2020-05-05 09:01:37 +02:00
GCC Administrator
ba84e01d81 Daily bump. 2020-05-05 00:16:17 +00:00
Patrick Palka
a700b4a9f1 c++: Avoid unnecessary copying in cp_fold [PR94038]
When folding a CALL_EXPR, we can avoid copying it until folding changes
one of its arguments.  And when folding a TREE_VEC, we can avoid using
an intermediate releasing_vec by copying the TREE_VEC as soon as folding
changes one of its arguments, like we do in the CALL_EXPR case.

Incidentally, the CALL_EXPR change also fixes the testcase in PR94038.
The reason is that the call to maybe_constant_value from cp_fold on
the call 'bar<int>()' now reuses the result of the earlier call to
maybe_constant_value from fold_for_warn, via the cv_cache.  This earlier
call passes uid_sensitive=true, whereas the call from cp_fold passes
uid_sensitive=false, and so by reusing the cached result of the earlier
call we now avoid instantiating bar<int> at all.

gcc/cp/ChangeLog:

	PR c++/94038
	* cp-gimplify.c (cp_fold) <case CALL_EXPR>: Move some variable
	declarations closer to their uses.  Copy the CALL_EXPR only
	when one of its arguments has changed.
	<case TREE_VEC>: Instead of first collecting the folded
	arguments into a releasing_vec, just make a copy of the TREE_VEC
	as soon as folding changes one of its arguments.

gcc/testsuite/ChangeLog:

	PR c++/94038
	* g++.dg/warn/pr94038.C: New test.
2020-05-04 18:30:32 -04:00
Fangrui Song
1405ed4334 libstdc++: Fix the return type of __cxa_finalize
This should return void according to the Itanium C++ ABI.

2020-05-04  Fangrui Song  <maskray@google.com>

	* libsupc++/cxxabi.h (__cxa_finalize): Fix return type.
2020-05-04 23:07:19 +01:00
Jonathan Wakely
ae8a08ff59 libstdc++: Fix broken link to SGI STL FAQ
The previous URL to an entry in the wayback machine now redirects to a
page saying "SGI.com Tech Archive Resources now retired" so use an older
entry from the archive.

	* doc/xml/faq.xml: Use working link for SGI STL FAQ.
	* doc/html/*: Regenerate.
2020-05-04 22:54:25 +01:00
Jonathan Wakely
bb27781b64 libstdc++: Fix incorrect size calculation in PMR resource (PR 94906)
Calculating the size of a chunk being returned to the upstream allocator
was done with a 32-bit type, so it wrapped if the chunk was 4GB or
larger.

I don't know how to test this without allocating 4GB, so there's no test
in the testsuite. It has been tested manually with allocations sizes and
alignments exceeding 4GB.

	PR libstdc++/94906
	* src/c++17/memory_resource.cc
	(monotonic_buffer_resource::_Chunk::release): Use size_t for shift
	operands.
2020-05-04 22:47:30 +01:00
Eric Botcazou
cc7e4de998 Fix Ada bootstrap on Cygwin64
This fixes two compilation errors preventing bootstrap with Ada
on x86_64-pc-cygwin.

2020-05-04  Mikael Pettersson  <mikpelinux@gmail.com>

	PR bootstrap/94918
	* mingw32.h: Prevent windows.h from including emmintrin.h on Cygw64.
	* s-oscons-tmplt.c (Serial_Port_Descriptor): Use System.Win32.HANDLE
	also on Cygwin.
2020-05-04 23:37:33 +02:00
David Edelsohn
5e681acd35 rs6000: AIX long double builtins for 64 bit long double.
When long doubles are 64 bit, the AIX C library overrides the definitions
but GCC builtins point to 128 bit names.  This patch overrides the
builtins for fmodl, frexpl, ldexpl and modfl to refer to the 64 bit symbols.

2020-05-04  Clement Chigot  <clement.chigot@atos.net>
	    David Edelsohn  <dje.gcc@gmail.com>

	* config/rs6000/rs6000-call.c (rs6000_init_builtins): Override explicit
	for fmodl, frexpl, ldexpl and modfl builtins.
2020-05-04 17:10:00 -04:00
Richard Sandiford
3af3bec2e4 internal-fn: Avoid dropping the lhs of some calls [PR94941]
create_output_operand coerces an output operand to the insn's
predicates, using a suggested rtx location if convenient.
But if that rtx location is actually required rather than
optional, the builder of the insn has to emit a move afterwards.

(We could instead add a new interface that does this automatically,
but that's future work.)

This PR shows that we were failing to emit the move for some of the
vector load internal functions.  I think there are other routines in
internal-fn.c that potentially have the same problem, but this patch is
supposed to be a conservative subset suitable for backporting to GCC 10.

2020-05-04  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	PR middle-end/94941
	* internal-fn.c (expand_load_lanes_optab_fn): Emit a move if the
	chosen lhs is different from the gcall lhs.
	(expand_mask_load_optab_fn): Likewise.
	(expand_gather_load_optab_fn): Likewise.

gcc/testsuite/
	PR middle-end/94941
	* gcc.target/aarch64/sve/acle/general/unoptimized_1.c: New test.
2020-05-04 21:21:16 +01:00
Iain Sandoe
0719055a95 coroutines: Mark the gro as artificial.
This corrects an oversight, the coro.gro object is a
a compiler-generated entity and should be marked as
artificial and ignored.

gcc/cp/ChangeLog:

2020-05-04  Iain Sandoe  <iain@sandoe.co.uk>

	* coroutines.cc (morph_fn_to_coro): Mark the coro.gro variable
	as artificial and ignored.
2020-05-04 20:53:14 +01:00
Joseph Myers
3943976371 Update gcc sv.po.
* sv.po: Update.
2020-05-04 19:44:02 +00:00
Nathan Sidwell
e6b31fc717 libstdc++: Avoid negating a size_t [pr 94747]
Although the code here is well formed, it doesn't show intent well.
The reason checkers trigger on this is that it is a cause of real
bugs.  So, negate a ptrdiff_t instead.

	* libsupc++/dyncast.cc (__dynamic_cast): Cast offsetof to
	ptrdiff_t before negation, to show intent more clearly.
2020-05-04 10:08:13 -07:00
Uros Bizjak
bb6ce54220 Added missing ChangeLog entries 2020-05-04 18:56:31 +02:00
Uros Bizjak
9decd08b7b i386: Use SBB more [PR94650]
When returning 0 or -1, "SBB reg,reg" instruction that borrows carry
flag can be used.  Carry flag can be generated by converting compare
with zero to a LTU compare with one, so e.g.

	return -(x == 0)

generates:

        cmpq    $1, %rdi
        sbbq    %rax, %rax

instead of:

        xorl    %eax, %eax
        testq   %rdi, %rdi
        sete    %al
        negq    %rax

A similar conversion can be used for

	return -(x != 0)

where NEG insn can be used instead of compare.  According to x86 ISA,
NEG insn sets carry flag when the source operand is != 0, resulting in:

        negq    %rdi
        sbbq    %rax, %rax

The conversion avoids partial register stall with SETcc instructions.

	PR target/94795
	* config/i386/i386.md (*neg<mode>_ccc): New insn pattern.
	(EQ compare->LTU compare splitter): New splitter.
	(NE compare->NEG splitter): Ditto.

testsuite/ChangeLog:

	PR target/94795
	* gcc.target/i386/pr94795-1.c: New test.
	* gcc.target/i386/pr94795-2.c: New test.
2020-05-04 18:53:30 +02:00
Nathan Sidwell
97268c374a c++: Simplify process_template_parm
Process_template_parm ends up walking the parameter list twice.
There's not need to do this.  Just rember the final node and modify
its CHAIN directly.  Also comment on why end_template_parm_list does a
pop and a push, rather than modifying the header in place.

	pt.c (process_template_parm): Don't walk the template list twice,
	remember the final node instead.
	(end_template_parm_list): Refactor.  Comment on why we do a pop
	and a push.
2020-05-04 09:49:52 -07:00
Nathan Sidwell
f1621d18f5 c++: Don't save parms in nested requirement [pr 94827]
This followup patch just removes some stashing that we never made use of.

	* constraint.cc (tsubst_nested_requirement): TYPE directly holds
	notmalized requirement.
	(finish_nested_requirement): Don't stash current tpl parms into
	the requirement.
	(diagnose_nested_requirement): TYPE directly holds notmalized
	requirement.
2020-05-04 09:44:39 -07:00
Marek Polacek
05be85b649 Revert "tree: Don't reuse types if TYPE_USER_ALIGN differ [PR94775]"
This reverts commit 6318fe7739.

	Revert:
	2020-04-30  Marek Polacek  <polacek@redhat.com>

	PR c++/94775
	* tree.c (check_base_type): Return true only if TYPE_USER_ALIGN match.
	(check_aligned_type): Check if TYPE_USER_ALIGN match.
2020-05-04 10:35:24 -04:00
Richard Biener
367766f40a tree-optimization/93891 - improve same-store disambiguation
We need a reference to assess alignment, fall back to the original
reference tree if available.

2020-05-04  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/93891
	* tree-ssa-sccvn.c (vn_reference_lookup_3): Fall back to
	the original reference tree for assessing access alignment.
2020-05-04 15:37:26 +02:00
Jonathan Wakely
ec40967f13 libstdc++: Make pmr::synchronized_pool_resource work without libpthread (PR 94936)
I implicitly assumed that programs using pmr::synchronized_pool_resource
would also be using multiple threads, and so the weak symbols in
gthr-posix.h would be resolved by linking to libpthread. If that isn't
true then it crashes when trying to use pthread_key_create.

This commit makes the pool resource check __gthread_active_p() before
using thread-specific data, and just use a single set of memory pools
when there's only a single thread.

	PR libstdc++/94936
	* src/c++17/memory_resource.cc (synchronized_pool_resource::_TPools):
	Add comment about single-threaded behaviour.
	(synchronized_pool_resource::_TPools::move_nonempty_chunks()): Hoist
	class member access out of loop.
	(synchronized_pool_resource::synchronized_pool_resource())
	(synchronized_pool_resource::~synchronized_pool_resource())
	(synchronized_pool_resource::release()): Check __gthread_active_p
	before creating and/or deleting the thread-specific data key.
	(synchronized_pool_resource::_M_thread_specific_pools()): Adjust
	assertions.
	(synchronized_pool_resource::do_allocate(size_t, size_t)): Add fast
	path for single-threaded case.
	(synchronized_pool_resource::do_deallocate(void*, size_t, size_t)):
	Likewise. Return if unable to find a pool that owns the allocation.
	* testsuite/20_util/synchronized_pool_resource/allocate_single.cc:
	New test.
	* testsuite/20_util/synchronized_pool_resource/cons_single.cc: New
	test.
	* testsuite/20_util/synchronized_pool_resource/release_single.cc: New
	test.
2020-05-04 13:37:31 +01:00
Richard Biener
f9e1ea10e6 tree-optimization/39612 - avoid issueing loads in SM when possible
Currently store-motion emits a load of the value in the loop
preheader even when the original loop does not contain any read
of the reference.  This avoids doing this.  In the conditional
store-motion case we need to mark the sunk stores with no-warning
since the control dependence is too tricky to figure out for
the uninit warning.

2020-05-04  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/39612
	* tree-ssa-loop-im.c (im_mem_ref::loaded): New member.
	(set_ref_loaded_in_loop): New.
	(mark_ref_loaded): Likewise.
	(gather_mem_refs_stmt): Call mark_ref_loaded for loads.
	(execute_sm): Avoid issueing a load when it was not there.
	(execute_sm_if_changed): Avoid issueing warnings for the
	conditional store.

	* gcc.dg/tree-ssa/pr39612.c: New testcase.
2020-05-04 14:14:36 +02:00
Martin Jambor
375a77925c tree-inline: Simplify IPA-CP type conversion (PR 93385)
when callers and callees do not quite agree on the type of a
parameter, usually with ill-defined K&R or with smilarly wrong LTO
input, IPA-CP can attempt to try and substitute a wrong type for a
parameter (see e.g. gcc.dg/torture/pr48063.c).  Function
tree_function_versioning attempts to handle this in order not to
create invalid gimple but it then creates the mapping using
setup_one_parameter which also handles the same situation to avoid
similar problems when inlining and in more defined way.

So this patch simply removes the conversion attempts in
tree_function_versioning itself.  It is helpful for my upcoming fix of
PR 93385 because then I do not need to teach
ipa_param_body_adjustments to distinguish between successful and
unsuccessful mappings - setup_one_parameter uses force_value_to_type
for conversions which simly maps the worst cases to zero.

2020-05-04  Martin Jambor  <mjambor@suse.cz>

	PR ipa/93385
	* tree-inline.c (tree_function_versioning): Leave any type conversion
	of replacements to setup_one_parameter and its friend
	force_value_to_type.
2020-05-04 13:53:54 +02:00
Uros Bizjak
8ea03e9016 i386: Use SHR to compare with large power-of-two constants [PR94650]
Convert unsigned compares where

	m >= LARGE_POWER_OF_TWO

and LARGE_POWER_OF_TWO represent an immediate where bit 33+ is set to use
a SHR instruction and compare the result to 0.  This avoids loading a
large immediate with MOVABS insn.

        movabsq $1099511627775, %rax
        cmpq    %rax, %rdi
        ja      .L5

gets converted to:

	shrq	$40, %rdi
	jne	.L5

	PR target/94650
	* config/i386/predicates.md (shr_comparison_operator): New predicate.
	* config/i386/i386.md (compare->shr splitter): New splitters.

testsuite/ChangeLog:

	PR target/94650
	* gcc.targeti/i386/pr94650.c: New test.
2020-05-04 13:49:14 +02:00
Jakub Jelinek
6b5c7ee0df match.pd: Optimize (x < 0) != (y < 0) into (x ^ y) < 0 [PR94718]
The following patch (on top of the two other PR94718 patches) performs the
actual optimization requested in the PR.

2020-05-04  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/94718
	* match.pd ((X < 0) != (Y < 0) into (X ^ Y) < 0): New simplification.

	* gcc.dg/tree-ssa/pr94718-4.c: New test.
	* gcc.dg/tree-ssa/pr94718-5.c: New test.
2020-05-04 11:03:32 +02:00
Jakub Jelinek
496f4f8847 match.pd: Decrease number of nop conversions around bitwise ops [PR94718]
On the following testcase, there are in *.optimized dump 14 nop conversions
(from signed to unsigned and back), while this patch decreases that number
to just 4; for bitwise ops it really doesn't matter if they are performed in
signed or unsigned, so the patch (in GIMPLE only, there are some comments
about it being undesirable during GENERIC earlier), if it sees both
bitop operands nop converted from the same types performs the bitop in their
non-converted type and converts the result (i.e. 2 conversions into 1),
similarly, if a bitop has one operand nop converted from something, the
other not and the result is converted back to the type of the nop converted
operand before conversion, it is possible to replace those 2 conversions
with just a single conversion of the other operand.

2020-05-04  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/94718
	* match.pd (bitop (convert @0) (convert? @1)): For GIMPLE, if we can,
	replace two nop conversions on bit_{and,ior,xor} argument
	and result with just one conversion on the result or another argument.

	* gcc.dg/tree-ssa/pr94718-3.c: New test.
2020-05-04 11:01:08 +02:00
Jakub Jelinek
73a8043481 match.pd: Move (X & C) eqne (Y & C) -> -> (X ^ Y) & C eqne 0 opt to match.pd [PR94718]
This patch moves this optimization from fold-const.c to match.pd where it
is actually much shorter to do and lets optimize even code not seen together
in a single expression in the source, as the first step towards fixing the
PR.

2020-05-04  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/94718
	* fold-const.c (fold_binary_loc): Move (X & C) eqne (Y & C)
	-> (X ^ Y) & C eqne 0 optimization to ...
	* match.pd ((X & C) op (Y & C) into (X ^ Y) & C op 0): ... here.

	* gcc.dg/tree-ssa/pr94718-1.c: New test.
	* gcc.dg/tree-ssa/pr94718-2.c: New test.
2020-05-04 10:57:46 +02:00
Jakub Jelinek
efaffc6997 diagnostics: get_option_html_page fixes
While testing the --with-documentation-root-url= changes, I run into
[Wreturn-type] URL pointing to gfortran documentation where it obviously
isn't documented.  The following patch updates the list of options to match
reality (on the other side -Wconversion-extra is gfortran only option
documented in gfortran.texi).

Or, perhaps better use the attached patch instead, which doesn't have a
hardcoded list and instead uses the flags?  I went through options.c
and the updated list of options matches exactly the cases where CL_Fortran
is set for "-W*" options together with CL_C and/or CL_CXX (ok, there is also
-Wall and -Wextra, but hopefully we don't emit [Wall] or [Wextra] for
anything).

2020-05-04  Jakub Jelinek  <jakub@redhat.com>

	* opts.c (get_option_html_page): Instead of hardcoding a list of
	options common between C/C++ and Fortran only use gfortran/
	documentation for warnings that have CL_Fortran set but not
	CL_C or CL_CXX.
2020-05-04 09:31:27 +02:00
GCC Administrator
cb8274155a Daily bump. 2020-05-04 00:16:16 +00:00
Uros Bizjak
c3185b6452 i386: Use plus_constant instead of gen_rtx_PLUS
Replace gen_rtx_PLUS with a GEN_INT with plus_constant.

2020-05-03  Uroš Bizjak  <ubizjak@gmail.com>

        * config/i386/i386-expand.c (ix86_expand_int_movcc):
	Use plus_constant instead of gen_rtx_PLUS with GEN_INT.
	(emit_memmov): Ditto.
	(emit_memset): Ditto.
	(ix86_expand_strlensi_unroll_1): Ditto.
	(release_scratch_register_on_entry): Ditto.
	(gen_frame_set): Ditto.
	(ix86_emit_restore_reg_using_pop): Ditto.
	(ix86_emit_outlined_ms2sysv_restore): Ditto.
	(ix86_expand_epilogue): Ditto.
	(ix86_expand_split_stack_prologue): Ditto.
	* config/i386/i386.md (push immediate splitter): Ditto.
	(strmov): Ditto.
	(strset): Ditto.
2020-05-03 20:52:06 +02:00
Jonathan Wakely
22b6b5d6cf libstdc++: Make byte-sized std::fill_n a constant expression (PR 94933)
The overload for byte types uses memset and isn't constexpr. This adds
the specifier and uses std::is_constant_evaluated() to provide a
compile-time alternative.

	PR libstdc++/94933
	* include/bits/stl_algobase.h (__fill_a1): Make overload for byte types
	usable in constant expressions.
	* testsuite/25_algorithms/fill_n/constexpr.cc: Test with bytes and
	non-scalars.
2020-05-03 13:33:15 +01:00
Eric Botcazou
18a6e4130f Fix incorrect use of 'Unrestricted_Access in testcase 2020-05-03 11:24:11 +02:00
GCC Administrator
77f45a962f Daily bump. 2020-05-03 00:16:16 +00:00
H.J. Lu
6abe1c3084 gfortran: Get asan library from TEST_ALWAYS_FLAGS
Update gfortran_target_compile to get the newly built asan library from
TEST_ALWAYS_FLAGS to avoid:

/usr/bin/ld: cannot find libasan_preinit.o: No such file or directory
/usr/bin/ld: cannot find -lasan
collect2: error: ld returned 1 exit status
compiler exited with status 1
FAIL: gfortran.dg/asan/pointer_assign_16.f90 -fsanitize=address  -O0  (test for excess errors)

	PR fortran/94788
	* lib/gfortran.exp (gfortran_target_compile): Get asan library
	from TEST_ALWAYS_FLAGS.
2020-05-02 12:46:55 -07:00
Iain Sandoe
7df4578990 Darwin: Fix a diagnostic spelling [PR93861]
Add a missing '-' to a diagnostic.

gcc/ChangeLog:

2020-05-02  Iain Sandoe  <iain@sandoe.co.uk>

	PR translation/93861
	* config/darwin-driver.c (darwin_driver_init): Adjust spelling in
	a warning.
2020-05-02 19:26:28 +01:00
Thomas Koenig
116784bbde Add asan subdirectory for gfortran.dg.
Because the test case for PR 94788 requires -fsanitize=address to expose
the double free, I have created a subdirectory under gfortran.dg
where such test cases can go.

I have tested this with

make check-fortran RUNTESTFLAGS="asan.exp=*"

and it works; with a compiler that introduces the double free bug
	into the test case, the result is as expected

2020-05-02  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR fortran/94788
	* gfortran.dg/asan: New directory.
	* gfortran.dg/asan/asan.exp: New file.
	* gfortran.dg/asan/pointer_assign_16.f90: New test case.
2020-05-02 17:33:30 +02:00
Jakub Jelinek
dcbf228e4a tilegx: Unbreak build
../../gcc/config/tilegx/tilegx.md:4109:1: ambiguous attribute 'n'; could be '1' (via 'I124MODE:n') or '4' (via 'I48MODE:n')
../../gcc/config/tilegx/tilegx.md:4109:1: ambiguous attribute 'n'; could be '1' (via 'I124MODE:n') or '' (via 'I48MODE:n')
../../gcc/config/tilegx/tilegx.md:4109:1: ambiguous attribute 'n'; could be '2' (via 'I124MODE:n') or '4' (via 'I48MODE:n')
../../gcc/config/tilegx/tilegx.md:4109:1: ambiguous attribute 'n'; could be '2' (via 'I124MODE:n') or '' (via 'I48MODE:n')
../../gcc/config/tilegx/tilegx.md:4109:1: ambiguous attribute 'n'; could be '4' (via 'I124MODE:n') or '' (via 'I48MODE:n')

The insn name already uses <I124MODE:n> explicitly, just the preparation
stmts don't, and as it creates a I124MODE lowpart subreg of a word mode
register, <I124MODE:n> seems obviously correct.

2020-05-02  Jakub Jelinek  <jakub@redhat.com>

	* config/tilegx/tilegx.md
	(insn_stnt<I124MODE:n>_add<I48MODE:bitsuffix>): Use <I124MODE:n>
	rather than just <n>.
2020-05-02 12:09:04 +02:00
H.J. Lu
6607bdd999 Add patch_area_size and patch_area_entry to crtl
Currently patchable area is at the wrong place.  It is placed immediately
after function label and before .cfi_startproc.  A backend should be able
to add a pseudo patchable area instruction durectly into RTL.  This patch
adds patch_area_size and patch_area_entry to crtl so that the patchable
area info is available in RTL passes.

It also limits patch_area_size and patch_area_entry to 65535, which is
a reasonable maximum size for patchable area.

gcc/

	PR target/93492
	* cfgexpand.c (pass_expand::execute): Set crtl->patch_area_size
	and crtl->patch_area_entry.
	* emit-rtl.h (rtl_data): Add patch_area_size and patch_area_entry.
	* opts.c (common_handle_option): Limit
	function_entry_patch_area_size and function_entry_patch_area_start
	to USHRT_MAX.  Fix a typo in error message.
	* varasm.c (assemble_start_function): Use crtl->patch_area_size
	and crtl->patch_area_entry.
	* doc/invoke.texi: Document the maximum value for
	-fpatchable-function-entry.

gcc/c-family/

	PR target/93492
	* c-attribs.c (handle_patchable_function_entry_attribute): Limit
	value to USHRT_MAX (65535).

gcc/testsuite/

	PR target/93492
	* c-c++-common/patchable_function_entry-error-1.c: New test.
	* c-c++-common/patchable_function_entry-error-2.c: Likewise.
	* c-c++-common/patchable_function_entry-error-3.c: Likewise.
2020-05-01 21:04:01 -07:00
GCC Administrator
23c42a01bc Daily bump. 2020-05-02 00:16:18 +00:00
Patrick Palka
4f6c1ca287 c++: Missing SFINAE with inaccessible static data member [PR90880]
This is a missing SFINAE issue when verifying the accessibility of a
static data member.

The cause is that check_accessibility_of_qualified_id unconditionally
passes tf_warning_or_error to perform_or_defer_access_check, even when
called from tsubst_qualified_id(..., complain=tf_none).

This patch fixes this by plumbing 'complain' from tsubst_qualified_id
through check_accessibility_of_qualified_id to reach
perform_or_defer_access_check, and by giving
check_accessibility_of_qualified_id the appropriate return value.

gcc/cp/ChangeLog:

	PR c++/90880
	* cp-tree.h (check_accessibility_of_qualified_id): Add
	tsubst_flags_t parameter and change return type to bool.
	* parser.c (cp_parser_lookup_name): Pass tf_warning_to_error to
	check_accessibility_of_qualified_id.
	* pt.c (tsubst_qualified_id): Return error_mark_node if
	check_accessibility_of_qualified_id returns false.
	* semantics.c (check_accessibility_of_qualified_id): Add
	complain parameter.  Pass complain instead of
	tf_warning_or_error to perform_or_defer_access_check.  Return
	true unless perform_or_defer_access_check returns false.

gcc/testsuite/ChangeLog:

	PR c++/90880
	* g++.dg/template/sfinae29.C: New test.
2020-05-01 16:37:57 -04:00