Right now we generate hash functions for all types, just in case they
are used as map keys. That's a lot of wasted effort and binary size
for types which will never be used as a map key. Instead, generate
hash functions only for types that we know are map keys.
Just doing that is a bit too simple, since maps with an interface type
as a key might have to hash any concrete key type that implements that
interface. So for that case, implement hashing of such types at
runtime (instead of with generated code). It will be slower, but only
for maps with interface types as keys, and maybe only a bit slower as
the aeshash time probably dominates the dispatch time.
Reorg where we keep the equals and hash functions. Move the hash function
from the key type to the map type, saving a field in every non-map type.
That leaves only one function in the alg structure, so get rid of that and
just keep the equal function in the type descriptor itself.
While we're here, reorganize the rtype struct to more closely match
the gc version.
This is the gofrontend version of https://golang.org/cl/191198.
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/212843
From-SVN: r279848
Separate the generation of type equality and hash functions, rather
than doing them in a single operation.
This is almost entirely a pure refactoring in preparation for
generating hash functions only for types that are map keys. The only
change in generated code is that for types that are the size of
numeric types, but not aligned like numeric types, such as [8]byte,
now use standard hash functions. They previously used special-purpose
hash functions because they required special-purpose equal functions.
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/212842
From-SVN: r279847
2020-01-02 Andrew Pinski <apinski@marvell.com>
* gcc.c-torture/execute/bitfld-8.c: New testcase.
* gcc.c-torture/execute/bitfld-9.c: New testcase.
From-SVN: r279846
PR c/90677
* cp-objcp-common.c (identifier_global_tag): Return NULL_TREE if name
has not been found, rather than error_mark_node.
* c-c++-common/pr90677-2.c: New test.
From-SVN: r279840
PR libfortran/90274
* io/format.c (parse_format_list): Implement the E0 exponent
width to provide smallest possible width for exponent fields.
Refactor code for correct parsing and better readability of the
code.
* io/io.h (write_real_w0): Change interface to pass in pointer
to fnode.
* io/transfer.c: Update all calls to write_real_w0 to use the
new interface.
* io/write.c ((write_real_w0): Use the new interface with fnode
to access both the decimal precision and exponent widths used in
build_float_string.
* io/write_float.def (build_float_string): Use the passed in
exponent width to calculate the used width in the case of E0.
From-SVN: r279828
PR target/67834
* config/pa/pa.c (pa_elf_select_rtx_section): New. Put references to
COMDAT group function labels in .data.rel.ro.local section.
* config/pa/pa32-linux.h (TARGET_ASM_SELECT_RTX_SECTION): Define.
From-SVN: r279823
2020-01-01 Andrew Pinski <pinskia@gmail.com>
PR libobjc/93099
* objc/objc-decls.h (objc_EXPORT): Define it to
extern for DLL_EXPORT define case.
From-SVN: r279822
PR target/93111
* config/pa/pa.md (scc): Use ordered_comparison_operator instead of
comparison_operator in B and S integer comparisons. Likewise, use
ordered_comparison_operator instead of cmpib_comparison_operator in
cmpib patterns.
* config/pa/predicates.md (cmpib_comparison_operator): Remove.
From-SVN: r279818
PR tree-optimization/93098
* match.pd (popcount): For shift amounts, use integer_onep
or wi::to_widest () == cst instead of tree_to_uhwi () == cst
tests. Make sure that precision is power of two larger than or equal
to 16. Ensure shift is never negative. Use HOST_WIDE_INT_UC macro
instead of ULL suffixed constants. Formatting fixes.
* gcc.c-torture/compile/pr93098.c: New test.
From-SVN: r279809
This code:
/* Make sure we don't accidentally use the old condition. */
cond_expr = NULL_TREE;
was misplaced, since it triggered even when we needed to force the
original unmodified cond_expr into a mask temporary and then invert it.
2019-12-31 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* tree-vect-stmts.c (vectorizable_condition): Only nullify cond_expr
if we've created a new condition. Don't nullify it if we've decided
to keep it and then invert the result.
gcc/testsuite/
* gcc.dg/vect/vect-cond-reduc-6.c: New test.
From-SVN: r279804
This patch fixes an awkward corner case in which:
(a) we apply if-conversion to a loop;
(b) the original scalar loop doesn't have a vdef, and thus doesn't
need a virtual phi;
(c) the vectorised main loop does need a vdef and a virtual phi (see below);
(d) we also vectorise the epilogue; and
(e) the vectorised epilogue still needs a scalar epilogue
The specific case in which (c) applies is if a read-only loop is
vectorised using IFN_LOAD_LANES, which uses clobber statements to
mark the lifetime of the temporary array.
The vectoriser relies on the SSA renamer to update virtual operands.
All would probably be well if it postponed this update until after
it had vectorised both the main loop and the epilogue loop. However,
when vectorising the epilogue, vect_do_peeling does:
create_lcssa_for_virtual_phi (loop);
update_ssa (TODO_update_ssa_only_virtuals);
(with "loop" in this case being the to-be-vectorised epilogue loop).
So the vectoriser puts the virtual operand into SSA form for the
vectorised main loop as a separate step, during the early stages
of vectorising the epilogue.
I wasn't sure at first why that update_ssa was there. It looked
initially like it was related to create_lcssa_for_virtual_phi,
which seemed strange when create_lcssa_for_virtual_phi keeps the
SSA form up-to-date. But before r241099 it had the following comment,
which AFAICT is still the reason:
/* We might have a queued need to update virtual SSA form. As we
delete the update SSA machinery below after doing a regular
incremental SSA update during loop copying make sure we don't
lose that fact.
??? Needing to update virtual SSA form by renaming is unfortunate
but not all of the vectorizer code inserting new loads / stores
properly assigns virtual operands to those statements. */
The patch restores that comment since IMO it's helpful.
(a), (d) and (e) mean that we copy the original un-if-converted scalar
loop to act as the scalar epilogue. The update_ssa above means that this
copying needs to cope with any new virtual SSA names in the main loop.
The code to do that (reasonably) assumed that one of two things was true:
(1) the scalar loop and the vector loops don't have vdefs, and so no
virtual operand update is needed. The definition that applies
on entry to the loops is the same in all cases.
(2) the scalar loop and the vector loops have virtual phis, and so --
after applying create_lcssa_for_virtual_phi on the to-be-vectorised
epilogue loop -- the virtual operand update can be handled in the
same way as for normal SSA names.
But (b) and (c) together mean that the scalar loop and the
still-to-be-vectorised epilogue loop have no virtual phi that (2)
can use. We'd therefore keep the original vuses when duplicating,
rather than updating them to the definition that applies on exit
from the epilogue loop. (Since the epilogue is still unvectorised
and has no vdefs, the definition that applies on exit is the same
as the one that applies on entry.)
This patch therefore adds a third case: the scalar loop and
to-be-vectorised epilogue have no virtual defs, but the main loop does.
2019-12-31 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* tree-vect-loop-manip.c (create_lcssa_for_virtual_phi): Return
the incoming virtual operand definition.
(vect_do_peeling): When vectorizing an epilogue loop, handle the
case in which the main loop has a virtual phi and the epilogue
and scalar loops don't. Restore an earlier comment about the
update_ssa call.
gcc/testsuite/
* gcc.dg/vect/vect-epilogues-2.c: New test.
From-SVN: r279802
gcc/testsuite/gcc.dg/cpp/ucs.c #include <limits.h>
and then crafts a definition of WCHAR_MAX depending
on __WCHAR_TYPE__.
The test fails in VxWorks configurations because WCHAR_MAX
is already exposed by the system limits.h.
The patch simply guards the tentative definition
by a check verifying if the macro is defined already, so
we're using the value exposed by limits.h in this case.
2019-12-30 Olivier Hainque <hainque@adacore.com>
* testsuite/gcc.dg/cpp/ucs.c: Prevent redefinition
of WCHAR_MAX if already exposed by limits.h.
From-SVN: r279795
This change adjusts a few scan-tree-dump expressions
to allow '$' as well as '.' when matching symbol names,
This improves results on VxWorks targets configured with:
#undef NO_DOLLAR_IN_LABEL
#define NO_DOT_IN_LABEL
2019-12-20 Olivier Hainque <hainque@adacore.com>
Jerome Lambourg <lambourg@adacore.com>
* c-c++-common/pr56493.c: Allow '$' in addition to '.'
scan-tree-dump expressions matching symbol names.
* gcc.dg/tree-ssa/sra-17.c: Likewise.
* gcc.dg/tree-ssa/sra-18.c: Likewise.
Co-Authored-By: Jerome Lambourg <lambourg@adacore.com>
From-SVN: r279794
This change reworks the VxWorks specific os_defines.h internal
lisbstdc++ header to help fix build and runtime failures of various
kinds in environments from 6.4/6.9 to 7 SR640, based on experiments
and observations conducted against real installs of these OSes for
different CPU architectures.
2019-12-30 Jerome Lambourg <lambourg@adacore.com>
Olivier Hainque <hainque@adacore.com>
libstdc++
* config/os/vxworks/os_defines.h
(NOMINMAX): Always redefine to 1.
(_NO_CPP_INLINES): Likewise.
(_GLIBCXX_USE_WEAK_REF): Define to 1 for RTP on
VxWorks >= 7, to 0 otherwise.
(_GLIBCXX_HAVE_TLS): Define to 1.
For VxWorks >= 7:
(_GLIBCXX_USE_C99_MATH): Define to 1.
(_GLIBCXX_USE_C99_MATH_FP_MACROS_DYNAMIC): Define to 0.
(_HAS_TR1_DECLARATIONS): Redefine to 0.
For VxWorks < 7, RTP:
(_GLIBCXX_INCLUDE_NEXT_C_HEADERS): Define to 1.
(_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC): Redefine to 1.
(__CORRECT_ISO_CPP11_MATH_H_PROTO_FP): Define.
For VxWorks < 7, kernel: #include <vxWorks.h>
Co-Authored-By: Olivier Hainque <hainque@adacore.com>
From-SVN: r279792
On Vxworks 7, includers of stdint.h (which we currently "provide")
need yvals.h to have been included ahead.
Instead of altering the common stdint-gcc.h with unpleasant
vxworks specific bits to do that, we arrange to provide stdint-gcc.h
on its own along with a stdint.h wrapper which preincludes yvals.h
on vx7 then includes stdint-gcc.h.
2019-12-30 Olivier Hainque <hainque@adacore.com>
* config/vxworks/stdint.h: New file. Include _yvals.h
then stdint-gcc.h.
* config/t-vxworks: Arrange to install the stdint.h wrapper.
* config.gcc (*-*-vxworks*): Add stdint-gcc.h to $extra_headers
so it gets copied. Set use_gcc_stdint to request _not_ crafting
stdint.h through the common Makefile rules.
From-SVN: r279791
* config/vxworks/_yvals.h: New file.
* config/vxworks/_yvals-wrapper.h: New file.
* config/vxworks/math.h: Use it to wrap the VxWorks
math.h header.
* config/vxworks/complex.h: Likewise.
* config/vxworks/setjmp.h: Likewise.
* config/vxworks/inttypes.h: Likewise.
From-SVN: r279787
Starting from VxWorks 7, the system comes with a Dinkumware
environment which requires the inclusion of "yvals.h" before other
system headers. We provide wrapped versions of a few headers to
accommodate such constraints.
2019-12-30 Jerome Lambourg <lambourg@adaccore.com>
Olivier Hainque <hainque@adacore.com>
gcc/
* config/vxworks/_yvals.h: New file.
* config/vxworks/_yvals-wrapper.h: New file.
* gcc/config/vxworks/math.h: Use it to wrap the VxWorks
math.h header.
* gcc/config/vxworks/complex.h: Likewise.
* gcc/config/vxworks/setjmp.h: Likewise.
* gcc/config/vxworks/inttypes.h: Likewise.
* config.gcc (*-*-vxworks*): Add system header wrappers
to extra_headers.
(powerpc-*-vxworks*): Reuse the common extra_headers.
From-SVN: r279784
This changes introduces an internal API for VxWorks version checks
within runtime files, a prerequisite to a few fixes coming up for libstdc++
builds on more recent versions of the OS.
2019-12-30 Olivier Hainque <hainque@adacore.com>
gcc/
* config/vxworks/_vxworks-versions.h: New file.
* config.gcc (*-*-vxworks*): Add it to extra_headers.
libgcc/
* config/gthr-vxworks.h: Use _vxworks-versions.h.
* config/gthr-vxworks-tls.c: Likewise.
From-SVN: r279783
This patch modifies the C & C++ VxWorks compiler to predefine
the __STDC_ macros verified by gcc.dg/c99-predef-1.c in the testsuite.
2019-12-13 Joel Brobecker <brobecker@adacore.com>
* config.gcc <*-*-vxworks*>: Add vxworks-c.o to c_target_objs
and cxx_target_objs. Set target_has_targetcm to "yes". Add
vxworks-predef.h to extra_headers.
* config/t-vxworks (vxworks-c.o): New target.
* config/vxworks-c.c: New file.
* config/vxworks/vxworks-predef.h: New file.
From-SVN: r279781
This change refines the VxWorks macro definitions configuring
wchar_t to accommodate the VxWorks7 environment, where wchar_t
is now typically a 32bit type.
We also ensure that the definitions for wint_t are always based
on those for wchar_t, so the two remain in sync in environments
where WCHAR_TYPE is redefined for a specific CPU architecture.
2019-12-30 Alexandre Oliva <oliva@adacore.com>
Olivier Hainque <hainque@adacore.com>
* config/vx-common.h (WCHAR_TYPE_SIZE): 32 on VxWorks 7.
(WCHAR_TYPE): Pick accordingly.
(WINT_TYPE_SIZE): Define in terms of WCHAR_TYPE_SIZE.
(WINT_TYPE): Define in terms of WCHAR_TYPE.
Co-Authored-By: Olivier Hainque <hainque@adacore.com>
From-SVN: r279780
2019-12-30 Olivier Hainque <hainque@adacore.com>
Jerome Lambourg <labourg@adacore.com>
* config/t-vxworks: Arrange to alter/restore glimits.h
before/after stmp-int-hdrs, so it uses a different macro
name to protect itself against recursive inclusions.
Co-Authored-By: Jerome Lambourg <lambourg@adacore.com>
From-SVN: r279777