Steven G. Kargl [Mon, 22 Apr 2019 21:00:40 +0000 (21:00 +0000)]
re PR fortran/90166 (Compiler Fails at Assembler)
2019-04-19 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/90166
* decl.c (in_module_or_interface): New function to check that the
current state is in a module, submodule, or interface.
(gfc_match_prefix): Use it.
Jason Merrill [Mon, 22 Apr 2019 19:16:46 +0000 (15:16 -0400)]
PR c++/87366 - wrong error with alias template.
With this testcase the code in template_args_equal to treat aliases as
distinct wasn't sufficient, because it only looked at the top level, whereas
here we have a reference to the alias. So let's also handle treating them
as distinct in structural_comptypes. For GCC 10 I have a more comprehensive
patch, but for GCC 9 let's go with this smaller change.
* typeck.c (structural_comptypes): When comparing_specializations,
aliases are unequal.
(comptypes): When comparing_specializations, do structural
comparison.
Paul Thomas [Mon, 22 Apr 2019 06:50:33 +0000 (06:50 +0000)]
re PR fortran/57284 ([OOP] ICE with find_array_spec for polymorphic arrays)
2019-04-22 Paul Thomas <pault@gcc.gnu.org>
PR fortran/57284
* resolve.c (find_array_spec): If this is a class expression
and the symbol and component array specs are the same, this is
not an error.
*trans-intrinsic.c (gfc_conv_intrinsic_size): If a class symbol
argument, has no namespace, it has come from the interface
mapping and the _data component must be accessed directly.
H.J. Lu [Sun, 21 Apr 2019 18:23:00 +0000 (18:23 +0000)]
LRA: Revert "Remove useless move insns"
Useless move insn removal was added to LRA just to avoid wasting CPU
cycles on such insn processing afterwards. Such insns are removed
anyway later in the pass pipeline. The CPU time savings are tiny but
the removal creates too many problems including PR target/90178.
Vladimir pre-approved the patch to remove the code:
The current implementation of “speculation_barrier”
and “group_end_nop” insns emit hard-wired register
names which causes tests using them to fail on Darwin,
at least, which uses “rNN” instead of “NN”.
The patch makes the register names for these insns use
the operand output mechanism to substitute the
appropriate variant when needed.
gcc/
2019-04-21 Iain Sandoe <iain@sandoe.co.uk>
* config/rs6000/rs6000.md (group_end_nop): Emit insn register
names using operand format, rather than hard-wired.
(speculation_barrier): Likewise.
These earlier Darwin versions have “FP_≈” inside a
comment in architecture/{ppc,i386}/math.h, which is
included by math.h which causes the tests to fail.
The intent of the tests (i.e. to ensure that the
library itself does not emit non-ascii) is covered
by other platforms, including later Darwin editions.
2019-04-21 Iain Sandoe <iain@sandoe.co.uk>
* testsuite/17_intro/headers/c++1998/charset.cc: Skip for Darwin8
to Darwin10.
* testsuite/17_intro/headers/c++2011/charset.cc: Likewise.
* testsuite/17_intro/headers/c++2014/charset.cc: Likewise.
* testsuite/17_intro/headers/c++2017/charset.cc: Likewise.
* testsuite/17_intro/headers/c++2020/charset.cc: Likewise.
d: Use semanticRun to prevent declaration pass from running multiple times.
This shouldn't happen during normal traversal of the AST provided from
the front-end, however as there are some cases where declarations need
to be visited out of order, such as what is being done in PR d/89017, it
then becomes necessary to guard against this.
gcc/d/ChangeLog:
2019-04-21 Iain Buclaw <ibuclaw@gdcproject.org>
* decl.cc (DeclVisitor::visit(Import)): Set semanticRun after
completion, guard against being called more than once.
(DeclVisitor::visit(StructDeclaration)): Likewise.
(DeclVisitor::visit(ClassDeclaration)): Likewise.
(DeclVisitor::visit(InterfaceDeclaration)): Likewise.
(DeclVisitor::visit(VarDeclaration)): Likewise.
(DeclVisitor::visit(TypeInfoDeclaration)): Likewise.
d: Ensure all unittests are registered against the original module.
As any unittest functions registered against the testing module when
compiling with -fbuilding-libphobos-tests are ignored during the
generation of the ModuleInfo data.
gcc/d/ChangeLog:
2019-04-21 Iain Buclaw <ibuclaw@gdcproject.org>
* modules.cc (register_module_decl): Don't register unittests against
the ModuleInfo symbol for -fbuilding-libphobos-tests.
Jason Merrill [Sat, 20 Apr 2019 06:18:30 +0000 (02:18 -0400)]
PR c++/90171 - ICE with destroying delete with size_t parm.
The problem here was that "second parm is size_t" is false for a destroying
sized delete. So let's introduce sized_deallocation_fn_p when that's what
we're asking, and reserve second_parm_is_size_t for the specific case of
warning about possible confusion with placement delete.
* call.c (sized_deallocation_fn_p): New. Use it instead of
second_parm_is_size_t in most cases.
(second_parm_is_size_t): Don't check for aligned.
Thomas Rodgers [Fri, 19 Apr 2019 22:44:11 +0000 (22:44 +0000)]
Improve implementation of parallel equal()
* include/pstl/algorithm_impl.h
(__internal::__brick_equal): use "4 iterator" version of
std::equal().
(__internal::__brick_equal): use simd for random access
iterators on unsequenced execution policies.
(__internal::__pattern_equal): add "4 iterator" version
(__internal::__pattern_equal): dispatch to simd __brick_equal
for vector-only execution policies.
(__internal::__pattern_equal): dispatch to __parallel_or for
parallel execution policies.
* include/pstl/glue_algorithm_impl.h
(std::equal): dispatch to "4 iterator" version of
__internal::__pattern_equal().
tree-call-cdce: If !HONOR_NANS do not make code with NaNs (PR88055)
If we don't HONOR_NANS we should not try to use any unordered
comparison results. Best case those will just be optimized away;
realistically, they ICE. For example, the rs6000 backend has some
code that specifically checks we never do this.
PR tree-optimization/88055
* tree-call-cdce.c (comparison_code_if_no_nans): New function.
(gen_one_condition): Use it if !HONOR_NANS.
Jakub Jelinek [Fri, 19 Apr 2019 08:24:05 +0000 (10:24 +0200)]
re PR c++/90108 (ICE: Segmentation fault (in c_tree_chain_next))
PR c++/90108
* c-decl.c (merge_decls): If remove is main variant and
DECL_ORIGINAL_TYPE is some other type, remove a DECL_ORIGINAL_TYPE
variant that has newdecl as TYPE_NAME if any.
* decl.c (duplicate_decls): If remove is main variant and
DECL_ORIGINAL_TYPE is some other type, remove a DECL_ORIGINAL_TYPE
variant that has newdecl as TYPE_NAME if any.
Jason Merrill [Thu, 18 Apr 2019 16:50:10 +0000 (12:50 -0400)]
PR c++/87554 - ICE with extern template and reference member.
The removed code ended up setting DECL_INITIAL to the INIT_EXPR returned by
split_nonconstant_init, which makes no sense. This code was added back in
1996, so any rationale is long lost.
* decl.c (cp_finish_decl): Don't set DECL_INITIAL of external vars.
When testing PR 85164, the baseline bootstrap-ubsan results had
a lot of failures from int_const_binop. This is because with the
new overflow handling we can sometimes do:
poly_res = res;
on an uninitialised res.
2019-04-18 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* fold-const.c (int_const_binop): Return early on failure.
Two fixes for UB when handling very large offsets. The calculation in
force_int_to_mode would have been correct if signed integers used modulo
arithmetic, so just switch to unsigned types. The calculation in
rtx_addr_can_trap_p_1 didn't handle overflow properly, so switch to
known_subrange_p instead (which is supposed to handle all cases).
2019-04-18 Richard Sandiford <richard.sandiford@arm.com>
gcc/
PR middle-end/85164
* combine.c (force_int_to_mode): Cast the argument rather than
the result of known_alignment.
* rtlanal.c (rtx_addr_can_trap_p_1): Use known_subrange_p.
gcc/testsuite/
PR middle-end/85164
* gcc.dg/pr85164-1.c, gcc.dg/pr85164-2.c: New tests.
Ian Lance Taylor [Thu, 18 Apr 2019 04:11:22 +0000 (04:11 +0000)]
re PR go/90110 (libgo fails to build against glibc 2.19)
PR go/90110
compiler: use temporary to avoid early destruction
The code was passing a substr directly to strtol, and then checking
the *end value returned by strtol. But the substr could be destroyed
as soon as strtol returns, making the test of *end invalid.
Also fix an incorrect test of the string index rather than the value.
Jason Merrill [Thu, 18 Apr 2019 03:32:24 +0000 (23:32 -0400)]
PR c++/90047 - ICE with enable_if alias template.
In order to make alias templates useful for SFINAE we instantiate them under
the prevailing 'complain' argument, so an error encountered while
instantiating during SFINAE context is silent. The problem in this PR comes
when we later look up the erroneous instantiation and don't give an error at
that point. Fixed by not adding an erroneous instantiation to the hash
table, so we instantiate it again when needed and get the error. This
required changes to a number of tests, which previously said "substitution
failed:" with no explanation of what the failure was; now we properly
explain.
* pt.c (tsubst_decl) [TYPE_DECL]: Don't put an erroneous decl in the
hash table when we're in SFINAE context.
Jonathan Wakely [Wed, 17 Apr 2019 21:47:20 +0000 (22:47 +0100)]
PR libstdc++/90105 make forward_list::sort stable
While testing the fix I also discovered that operator== assumes the
elements are comparable with operator!= which is not required.
PR libstdc++/90105
* include/bits/forward_list.h (operator==): Do not use operator!= to
compare elements.
(forward_list<T, A>::sort(Comp)): When elements are equal take the one
earlier in the list, so that sort is stable.
* testsuite/23_containers/forward_list/operations/90105.cc: New test.
* testsuite/23_containers/forward_list/comparable.cc: Test with
types that meet the minimum EqualityComparable and LessThanComparable
requirements. Remove irrelevant comment.
Jonathan Wakely [Wed, 17 Apr 2019 19:27:27 +0000 (20:27 +0100)]
Fix condition for std::variant to be copy constructible
The standard says the std::variant copy constructor is defined as
deleted unless all alternative types are copy constructible, but we were
making it also depend on move constructible. Fix the condition and
enhance the tests to check the semantics with pathological copy-only
types (i.e. supporting copying but having deleted moves).
The enhanced tests revealed a regression in copy assignment for
non-trivial alternative types, where the assignment would not be
performed because the condition in the _Copy_assign_base visitor is
false: is_same_v<remove_reference_t<T&>, remove_reference_t<const T&>>.
* include/std/variant (__detail::__variant::_Traits::_S_copy_assign):
Do not depend on whether all alternative types are move constructible.
(__detail::__variant::_Copy_assign_base::operator=): Remove cv-quals
from the operand when deciding whether to perform the assignment.
* testsuite/20_util/variant/compile.cc (DeletedMoves): Define type
with deleted move constructor and deleted move assignment operator.
(default_ctor, copy_ctor, move_ctor, copy_assign, move_assign): Check
behaviour of variants with DeletedMoves as an alternative.
* testsuite/20_util/variant/run.cc (DeletedMoves): Define same type.
(move_ctor, move_assign): Check that moving a variant with a
DeletedMoves alternative falls back to copying instead of moving.
Jonathan Wakely [Wed, 17 Apr 2019 19:27:19 +0000 (20:27 +0100)]
Fix tests for std::variant to match original intention
* testsuite/20_util/variant/compile.cc (MoveCtorOnly): Fix type to
actually match its name.
(MoveCtorAndSwapOnly): Define new type that adds swap to MoveCtorOnly.
(test_swap()): Fix result for MoveCtorOnly and check
MoveCtorAndSwapOnly.
Jakub Jelinek [Wed, 17 Apr 2019 19:23:45 +0000 (21:23 +0200)]
re PR target/90125 (Typo of AVX512 intrinsics)
PR target/90125
* config/i386/avx512fintrin.h (_mm_maskz_fmadd_round_sd,
_mm_maskz_fmadd_round_ss, _mm_maskz_fmsub_round_sd,
_mm_maskz_fmsub_round_ss, _mm_maskz_fnmadd_round_sd,
_mm_maskz_fnmadd_round_ss, _mm_maskz_fnmsub_round_sd,
_mm_maskz_fnmsub_round_ss): Use _maskz builtin instead of _mask3.
PR target/90125
* gcc.target/i386/avx512f-vfmsubXXXss-2.c (avx512f_test): Adjust
constants to ensure precise result even when not using fma.
* gcc.target/i386/avx512f-vfnmaddXXXss-2.c (avx512f_test): Likewise.
* gcc.target/i386/avx512f-vfmaddXXXsd-3.c: New test.
* gcc.target/i386/avx512f-vfmaddXXXss-3.c: New test.
* gcc.target/i386/avx512f-vfmsubXXXsd-3.c: New test.
* gcc.target/i386/avx512f-vfmsubXXXss-3.c: New test.
* gcc.target/i386/avx512f-vfnmaddXXXsd-3.c: New test.
* gcc.target/i386/avx512f-vfnmaddXXXss-3.c: New test.
* gcc.target/i386/avx512f-vfnmsubXXXsd-3.c: New test.
* gcc.target/i386/avx512f-vfnmsubXXXss-3.c: New test.
Peter Bergner [Wed, 17 Apr 2019 19:22:15 +0000 (19:22 +0000)]
ira-conflicts.c (print_allocno_conflicts): Always print something, even for allocno's with no conflicts.
gcc/
* ira-conflicts.c (print_allocno_conflicts): Always print something,
even for allocno's with no conflicts.
(print_conflicts): Print an extra newline.
When auto-inc-dec creates a new mem to compute the cost of doing some
transform, it forgets to copy over the alignment of the original mem.
This gives wrong costs, for example, for rs6000 a floating point load
or store is hugely expensive if unaligned. This patch fixes it.
* auto-inc-dec.c (attempt_change): Set the alignment of the
temporary memory to that of the original.
Jakub Jelinek [Wed, 17 Apr 2019 17:57:02 +0000 (19:57 +0200)]
dg-extract-results.sh: Only handle WARNING: program timed out lines specially in "$MODE" == "sum".
* dg-extract-results.sh: Only handle WARNING: program timed out
lines specially in "$MODE" == "sum". Restore previous behavior
for "$MODE" != "sum". Clear has_timeout and timeout_cnt if in
a different variant or curfile is empty.
* dg-extract-results.py: Fix a typo.
Jonathan Wakely [Wed, 17 Apr 2019 13:13:30 +0000 (14:13 +0100)]
Add constexpr to std::optional::value_or(U&&)&&
In C++1z drafts up to N4606 the constexpr keyword was missing from the
detailed description of this function, despite being shown in the class
synopsis. That was fixed editorially for N4618, but our implementation
was not corrected to match.
rs6000: Improve the load/store-with-update patterns (PR17108)
Many of these patterns only worked in 32-bit mode, and some only worked
in 64-bit mode. This patch makes these use Pmode, fixing the PR. On
the other hand, the stack updates have to use the same mode for the
stack pointer as for the value stored, so let's simplify that a bit.
Many of these patterns pass the wrong mode to
avoiding_indexed_address_p (it should be the mode of the datum
accessed, not the mode of the pointer).
Finally, I merge some patterns into one (using iterators).
PR target/17108
* config/rs6000/rs6000.c (rs6000_split_multireg_move): Adjust pattern
name.
(rs6000_emit_allocate_stack_1): Simplify condition. Adjust pattern
name.
* config/rs6000/rs6000.md (bits): Add entries for SF and DF.
(*movdi_update1): Use Pmode.
(movdi_<mode>_update): Fix argument to avoiding_indexed_address_p.
(movdi_<mode>_update_stack): Rename to ...
(movdi_update_stack): ... this. Fix comment. Change condition. Don't
use Pmode.
(*movsi_update1): Use Pmode.
(*movsi_update2): Use Pmode.
(movsi_update): Rename to ...
(movsi_<mode>_update): ... this. Use Pmode.
(movsi_update_stack): Fix condition.
(*movhi_update1): Use Pmode. Fix argument to
avoiding_indexed_address_p.
(*movhi_update2): Ditto.
(*movhi_update3): Ditto.
(*movhi_update4): Ditto.
(*movqi_update1): Ditto.
(*movqi_update2): Ditto.
(*movqi_update3): Ditto.
(*movsf_update1, *movdf_update1): Merge, rename to...
(*mov<mode>_update1): This. Use Pmode. Fix argument to
avoiding_indexed_address_p. Add "size" attribute.
(*movsf_update2, *movdf_update2): Merge, rename to...
(*mov<mode>_update2): This. Ditto.
(*movsf_update3): Use Pmode. Fix argument to
avoiding_indexed_address_p.
(*movsf_update4): Ditto.
(allocate_stack): Simplify condition. Adjust pattern names.
The test fell back to long long and long when __int128 is not
available, but it assumed sizeof(long) < sizeof(long long) because of
a shift count that would be out of range for a long long if their
widths are the same. Fixed by splitting it up into two shifts.
for gcc/testsuite/ChangeLog
PR rtl-optimization/86438
* gcc.dg/torture/pr86438.c: Split up too-wide shift.
New LRA algorithms require the all the register constraints to be
defined using define_register_constraint keyword. However, Rs5
constraint was not LRA proof. Remove it and replace it by equivalent
Rcd constraint.
* config/arc/arc.c (arc_hard_regno_modes): Add two missing modes
for last two fake registers.
(arc_conditional_register_usage): Make sure fake frame and arg
pointer regs are in general regs class.
(FRAME_POINTER_MASK): Remove.
(RETURN_ADDR_MASK): Remove.
(arc_must_save_register): Use hard frame regnum.
(frame_restore_reg): Use hard_frame_pointer_rtx.
(arc_save_callee_saves): Likewise.
(arc_restore_callee_saves): Likewise.
(arc_save_callee_enter): Likewise.
(arc_restore_callee_leave): Likewise.
(arc_save_callee_milli): Likewise.
(arc_eh_return_address_location): Likewise.
(arc_check_multi): Use hard frame regnum.
(arc_can_eliminate): Likewise.
* config/arc/arc.h (FIXED_REGISTERS): Make FP register available
for register allocator.
(REG_CLASS_CONTENTS): Update GENERAL_REGS.
(REGNO_OK_FOR_BASE_P): Consider FRAME_POINTER_REGNUM.
(FRAME_POINTER_REGNUM): Change it to a fake register.
(HARD_FRAME_POINTER_REGNUM): Defined.
(ARG_POINTER_REGNUM): Change it to a new fake register.
(ELIMINABLE_REGS): Update.
(REGISTER_NAMES): Update names.
* config/arc/arc.md (LP_START): Remove.
(LP_END): Likewise.
(shift_si3_loop): Update pattern.
[ARC] Emit blockage regardless to avoid delay slot scheduling.
1.The delay slot scheduler can reschedule some of the frame related
instructions resulting in having incorect CFI information. This patch
introduces a schedule blockage to avoid this problem.
2.There are cases when an interrupt may happen and not all the current
function stack operations are done, which may result in stack
corruption. Such an example is accessing an returning a local
structure members, which members are allocated on stack. The stack
adjustment and the accessing of the struct member can be reorder as
they may not use both the SP register for the access.
3.Also, do not save/restore SP when in interrupt. The SP is switch by
the core IRQ machinery.
Jakub Jelinek [Tue, 16 Apr 2019 08:40:58 +0000 (10:40 +0200)]
re PR target/90096 (Misleading option hint for AVX intrinsics)
PR target/90096
* config/i386/i386.c (ix86_target_string): Add ADD_ABI_P argument, only
print -m64/-mx32/-m32 if it is true.
(ix86_debug_options, ix86_function_specific_print): Pass true as
ADD_ABI_P to ix86_target_string.
(ix86_expand_builtin): Adjust ix86_target_string caller, pass true as
ADD_ABI_P only if OPTION_MASK_ISA_64BIT is set in bisa and in that case
or into it OPTION_MASK_ISA_ABI_64 or OPTION_MASK_ISA_ABI_X32.
The code that checks if an auto-increment from i0 or i1 is not lost is
a bit shaky. The code to check the same for i2 is non-existent, and
cannot be implemented in a similar way at all. So, this patch counts
all auto-increments, and makes sure we end up with the same number as
we started with. This works because we still have a check that we
will not duplicate any.
We should do this some better way, but not while we are in stage 4.
PR rtl-optimization/89794
* combine.c (count_auto_inc): New function.
(try_combine): Count how many auto_inc expressions there were in the
original instructions. Ensure we have the same number in the new
instructions. Remove the code that tried to ensure auto_inc side
effects on i1 and i0 are not lost.
gcc/testsuite/
PR rtl-optimization/89794
* gcc.dg/torture/pr89794.c: New testcase.
Richard Biener [Mon, 15 Apr 2019 10:09:08 +0000 (10:09 +0000)]
re PR ipa/88936 (-fipa-pta breaks bash (incorrect optimisation of recursive static function))
2019-04-15 Richard Biener <rguenther@suse.de>
PR ipa/88936
* tree.h (auto_var_p): Declare.
* tree.c (auto_var_p): New function, split out from ...
(auto_var_in_fn_p): ... here.
* tree-ssa-structalias.c (struct variable_info): Add shadow_var_uid
member.
(new_var_info): Initialize it.
(set_uids_in_ptset): Also set the shadow variable uid if required.
(ipa_pta_execute): Postprocess points-to solutions assigning
shadow variable uids for locals that may reach their containing
function recursively.
* tree-ssa-ccp.c (fold_builtin_alloca_with_align): Do not
assert but instead check whether the points-to solution is
a singleton.
* gcc.dg/torture/pr88936-1.c: New testcase.
* gcc.dg/torture/pr88936-2.c: Likewise.
* gcc.dg/torture/pr88936-3.c: Likewise.