1. 28 Jan, 2020 35 commits
    • Fix for PR93272 - LRA: EH reg allocated to hold local variable · 5c8a1211
      2020-01-28  Vladimir Makarov  <vmakarov@redhat.com>
      
      	PR rtl-optimization/93272
      	* ira-lives.c (process_out_of_region_eh_regs): New function.
      	(process_bb_node_lives): Call it.
      Vladimir N. Makarov committed
    • diagnostics: make error message lowercase. · 32387f76
      	* coverage.c (read_counts_file): Make error message lowercase.
      Jan Hubicka committed
    • ipa: fix handling of multiple speculations (PR93318) · 40d24031
      This patch started as work to resole Richard's comment on quadratic lookups
      in resolve_speculation. While doing it I however noticed multiple problems
      in the new speuclative call code which made the patch quite big. In
      particular:
       1) Before applying speculation we consider only targets with at lest
          probability 1/2.
          If profile is sane at most two targets can have probability greater or
          equal to 1/2. So the new multi-target speculation code got enabled only
          in very special scenario when there ae precisely two target with precise
          probability 1/2 (which is tested by the single testcase).
      
          As a conseuqence the multiple target logic got minimal test coverage and
          this made us to miss several ICEs.
       2) Profile updating in profile merging, tree-inline and indirect call
          expansion was wrong which led to inconsistent profiles (as already seen
          on the testcase).
       3) Code responsible to turn speculative call to direct call was broken for
          anything with more than one target.
       4) There were multiple cases where call_site_hash went out of sync which
          eventually leads to an ICE..
       5) Some code expects that all speculative call targets forms a sequence in
          the callee linked list but there is no code to maintain that invariant
          nor a verifier.
      Fixing this it became obvious that the current API of speculative_call_info is
      not useful because it really builds on fact tht there are precisely three
      components (direct call, ref and indirect call) in every speculative call
      sequence.  I ended up replacing it with iterator API for direct call
      (first_speculative_call_target, next_speculative_call_target) and accessors for
      the other coponents updating comment in cgraph.h.
      
      Finally I made the work with call site hash more effetive by updating edge
      manipulation to keep them in sequence. So first one can be looked up from the
      hash and then they can be iterated by callee.
      
      There are other things that can be improved (for example the speculation should
      start with most common target first), but I will try to keep that for next
      stage1. This patch is mostly about getting rid of ICE and profile corruption
      which is a regression from GCC 9.
      
      Honza
      
      gcc/ChangeLog:
      
      2020-01-28  Jan Hubicka  <hubicka@ucw.cz>
      
      	PR lto/93318
      	* cgraph.c (cgraph_add_edge_to_call_site_hash): Update call site
      	hash only when edge is first within the sequence.
      	(cgraph_edge::set_call_stmt): Update handling of speculative calls.
      	(symbol_table::create_edge): Do not set target_prob.
      	(cgraph_edge::remove_caller): Watch for speculative calls when updating
      	the call site hash.
      	(cgraph_edge::make_speculative): Drop target_prob parameter.
      	(cgraph_edge::speculative_call_info): Remove.
      	(cgraph_edge::first_speculative_call_target): New member function.
      	(update_call_stmt_hash_for_removing_direct_edge): New function.
      	(cgraph_edge::resolve_speculation): Rewrite to new API.
      	(cgraph_edge::speculative_call_for_target): New member function.
      	(cgraph_edge::make_direct): Rewrite to new API; fix handling of
      	multiple speculation targets.
      	(cgraph_edge::redirect_call_stmt_to_callee): Likewise; fix updating
      	of profile.
      	(verify_speculative_call): Verify that targets form an interval.
      	* cgraph.h (cgraph_edge::speculative_call_info): Remove.
      	(cgraph_edge::first_speculative_call_target): New member function.
      	(cgraph_edge::next_speculative_call_target): New member function.
      	(cgraph_edge::speculative_call_target_ref): New member function.
      	(cgraph_edge;:speculative_call_indirect_edge): New member funtion.
      	(cgraph_edge): Remove target_prob.
      	* cgraphclones.c (cgraph_node::set_call_stmt_including_clones):
      	Fix handling of speculative calls.
      	* ipa-devirt.c (ipa_devirt): Fix handling of speculative cals.
      	* ipa-fnsummary.c (analyze_function_body): Likewise.
      	* ipa-inline.c (speculation_useful_p): Use new speculative call API.
      	* ipa-profile.c (dump_histogram): Fix formating.
      	(ipa_profile_generate_summary): Watch for overflows.
      	(ipa_profile): Do not require probablity to be 1/2; update to new API.
      	* ipa-prop.c (ipa_make_edge_direct_to_target): Update to new API.
      	(update_indirect_edges_after_inlining): Update to new API.
      	* ipa-utils.c (ipa_merge_profiles): Rewrite merging of speculative call
      	profiles.
      	* profile-count.h: (profile_probability::adjusted): New.
      	* tree-inline.c (copy_bb): Update to new speculative call API; fix
      	updating of profile.
      	* value-prof.c (gimple_ic_transform): Rename to ...
      	(dump_ic_profile): ... this one; update dumping.
      	(stream_in_histogram_value): Fix formating.
      	(gimple_value_profile_transformations): Update.
      
      gcc/testsuite/ChangeLog:
      
      2020-01-28  Jan Hubicka  <hubicka@ucw.cz>
      
      	* g++.dg/tree-prof/indir-call-prof.C: Update template.
      	* gcc.dg/tree-prof/crossmodule-indircall-1.c: Add more targets.
      	* gcc.dg/tree-prof/crossmodule-indircall-1a.c: Add more targets.
      	* gcc.dg/tree-prof/indir-call-prof.c: Update template.
      Jan Hubicka committed
    • c++: Allow template rvalue-ref conv to bind to lvalue ref. · 14e320db
      When I implemented the [over.match.ref] rule that a reference conversion
      function needs to match l/rvalue of the target reference type it changed our
      handling of this testcase.  It seems to me that our current behavior is what
      the standard says, but it doesn't seem desirable, and all the other
      compilers have our old behavior.  So let's limit the change to non-templates
      until there's some clarification from the committee.
      
      	PR c++/90546
      	* call.c (build_user_type_conversion_1): Allow a template conversion
      	returning an rvalue reference to bind directly to an lvalue.
      Jason Merrill committed
    • ipa: fix handling of multiple speculations (PR93318) · 845bb366
      This patch started as work to resole Richard's comment on quadratic lookups
      in resolve_speculation. While doing it I however noticed multiple problems
      in the new speuclative call code which made the patch quite big. In
      particular:
       1) Before applying speculation we consider only targets with at lest
          probability 1/2.
          If profile is sane at most two targets can have probability greater or
          equal to 1/2. So the new multi-target speculation code got enabled only
          in very special scenario when there ae precisely two target with precise
          probability 1/2 (which is tested by the single testcase).
      
          As a conseuqence the multiple target logic got minimal test coverage and
          this made us to miss several ICEs.
       2) Profile updating in profile merging, tree-inline and indirect call
          expansion was wrong which led to inconsistent profiles (as already seen
          on the testcase).
       3) Code responsible to turn speculative call to direct call was broken for
          anything with more than one target.
       4) There were multiple cases where call_site_hash went out of sync which
          eventually leads to an ICE..
       5) Some code expects that all speculative call targets forms a sequence in
          the callee linked list but there is no code to maintain that invariant
          nor a verifier.
      Fixing this it became obvious that the current API of speculative_call_info is
      not useful because it really builds on fact tht there are precisely three
      components (direct call, ref and indirect call) in every speculative call
      sequence.  I ended up replacing it with iterator API for direct call
      (first_speculative_call_target, next_speculative_call_target) and accessors for
      the other coponents updating comment in cgraph.h.
      
      Finally I made the work with call site hash more effetive by updating edge
      manipulation to keep them in sequence. So first one can be looked up from the
      hash and then they can be iterated by callee.
      
      There are other things that can be improved (for example the speculation should
      start with most common target first), but I will try to keep that for next
      stage1. This patch is mostly about getting rid of ICE and profile corruption
      which is a regression from GCC 9.
      
      gcc/ChangeLog:
      
      	PR lto/93318
      	* cgraph.c (cgraph_add_edge_to_call_site_hash): Update call site
      	hash only when edge is first within the sequence.
      	(cgraph_edge::set_call_stmt): Update handling of speculative calls.
      	(symbol_table::create_edge): Do not set target_prob.
      	(cgraph_edge::remove_caller): Watch for speculative calls when updating
      	the call site hash.
      	(cgraph_edge::make_speculative): Drop target_prob parameter.
      	(cgraph_edge::speculative_call_info): Remove.
      	(cgraph_edge::first_speculative_call_target): New member function.
      	(update_call_stmt_hash_for_removing_direct_edge): New function.
      	(cgraph_edge::resolve_speculation): Rewrite to new API.
      	(cgraph_edge::speculative_call_for_target): New member function.
      	(cgraph_edge::make_direct): Rewrite to new API; fix handling of
      	multiple speculation targets.
      	(cgraph_edge::redirect_call_stmt_to_callee): Likewise; fix updating
      	of profile.
      	(verify_speculative_call): Verify that targets form an interval.
      	* cgraph.h (cgraph_edge::speculative_call_info): Remove.
      	(cgraph_edge::first_speculative_call_target): New member function.
      	(cgraph_edge::next_speculative_call_target): New member function.
      	(cgraph_edge::speculative_call_target_ref): New member function.
      	(cgraph_edge;:speculative_call_indirect_edge): New member funtion.
      	(cgraph_edge): Remove target_prob.
      	* cgraphclones.c (cgraph_node::set_call_stmt_including_clones):
      	Fix handling of speculative calls.
      	* ipa-devirt.c (ipa_devirt): Fix handling of speculative cals.
      	* ipa-fnsummary.c (analyze_function_body): Likewise.
      	* ipa-inline.c (speculation_useful_p): Use new speculative call API.
      	* ipa-profile.c (dump_histogram): Fix formating.
      	(ipa_profile_generate_summary): Watch for overflows.
      	(ipa_profile): Do not require probablity to be 1/2; update to new API.
      	* ipa-prop.c (ipa_make_edge_direct_to_target): Update to new API.
      	(update_indirect_edges_after_inlining): Update to new API.
      	* ipa-utils.c (ipa_merge_profiles): Rewrite merging of speculative call
      	profiles.
      	* profile-count.h: (profile_probability::adjusted): New.
      	* tree-inline.c (copy_bb): Update to new speculative call API; fix
      	updating of profile.
      	* value-prof.c (gimple_ic_transform): Rename to ...
      	(dump_ic_profile): ... this one; update dumping.
      	(stream_in_histogram_value): Fix formating.
      	(gimple_value_profile_transformations): Update.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/tree-prof/indir-call-prof.C: Update template.
      	* gcc.dg/tree-prof/crossmodule-indircall-1.c: Add more targets.
      	* gcc.dg/tree-prof/crossmodule-indircall-1a.c: Add more targets.
      	* gcc.dg/tree-prof/indir-call-prof.c: Update template.
      Jan Hubicka committed
    • i386: Prefer TARGET_AVX over TARGET_SSE_TYPELESS_STORES · dd9b529f
      movaps/movups is one byte shorter than movdqa/movdqu.  But it isn't the
      case for AVX nor AVX512.  This patch prefers TARGET_AVX over
      TARGET_SSE_TYPELESS_STORES and adjust vmovups checks in assembly ouputs.
      
      gcc/
      
      	PR target/91461
      	* config/i386/i386.md (*movoi_internal_avx): Remove
      	TARGET_SSE_TYPELESS_STORES check.
      	(*movti_internal): Prefer TARGET_AVX over
      	TARGET_SSE_TYPELESS_STORES.
      	(*movtf_internal): Likewise.
      	* config/i386/sse.md (mov<mode>_internal): Prefer TARGET_AVX over
      	TARGET_SSE_TYPELESS_STORES.  Remove "<MODE_SIZE> == 16" check
      	from TARGET_SSE_TYPELESS_STORES.
      
      gcc/testsuite/
      
      	PR target/91461
      	* gcc.target/i386/avx256-unaligned-store-2.c: Don't check
      	vmovups.
      	* gcc.target/i386/avx256-unaligned-store-3.c: Likewise.
      	* gcc.target/i386/pieces-memcpy-4.c: Likewise.
      	* gcc.target/i386/pieces-memcpy-5.c: Likewise.
      	* gcc.target/i386/pieces-memcpy-6.c: Likewise.
      	* gcc.target/i386/pieces-strcpy-2.c: Likewise.
      	* gcc.target/i386/pr90980-1.c: Likewise.
      	* gcc.target/i386/pr87317-4.c: Check "\tvmovd\t" instead of
      	"vmovd" to avoid matching "vmovdqu".
      	* gcc.target/i386/pr87317-5.c: Likewise.
      	* gcc.target/i386/pr87317-7.c: Likewise.
      	* gcc.target/i386/pr91461-1.c: New test.
      	* gcc.target/i386/pr91461-2.c: Likewise.
      	* gcc.target/i386/pr91461-3.c: Likewise.
      	* gcc.target/i386/pr91461-4.c: Likewise.
      	* gcc.target/i386/pr91461-5.c: Likewise.
      H.J. Lu committed
    • diagnostic_metadata: unbreak xgettext (v2) · 6c8e5844
      Changed in v2:
      - rename from warning_with_metadata_at to warning_meta
      - fix test plugins
      
      While C++ can have overloads, xgettext can't deal with overloads that have
      different argument positions, leading to two failures in "make gcc.pot":
      
      emit_diagnostic_valist used incompatibly as both
      --keyword=emit_diagnostic_valist:4
      --flag=emit_diagnostic_valist:4:gcc-internal-format and
      --keyword=emit_diagnostic_valist:5
      --flag=emit_diagnostic_valist:5:gcc-internal-format
      
      warning_at used incompatibly as both
      --keyword=warning_at:3 --flag=warning_at:3:gcc-internal-format and
      --keyword=warning_at:4 --flag=warning_at:4:gcc-internal-format
      
      The emit_diagnostic_valist overload isn't used anywhere (I think it's
      a leftover from an earlier iteration of the analyzer patch kit).
      
      The warning_at overload is used throughout the analyzer but nowhere else.
      
      Ideally I'd like to consolidate this argument with something
      constructable in various ways:
      - from a metadata and an int or
      - from an int (or, better an "enum opt_code"),
      so that the overload happens when implicitly choosing the ctor, but
      that feels like stage 1 material.
      
      In the meantime, fix xgettext by deleting the unused overload and
      renaming the used one.
      
      gcc/analyzer/ChangeLog:
      	* region-model.cc (poisoned_value_diagnostic::emit): Update for
      	renaming of warning_at overload to warning_meta.
      	* sm-file.cc (file_leak::emit): Likewise.
      	* sm-malloc.cc (double_free::emit): Likewise.
      	(possible_null_deref::emit): Likewise.
      	(possible_null_arg::emit): Likewise.
      	(null_deref::emit): Likewise.
      	(null_arg::emit): Likewise.
      	(use_after_free::emit): Likewise.
      	(malloc_leak::emit): Likewise.
      	(free_of_non_heap::emit): Likewise.
      	* sm-sensitive.cc (exposure_through_output_file::emit): Likewise.
      	* sm-signal.cc (signal_unsafe_call::emit): Likewise.
      	* sm-taint.cc (tainted_array_index::emit): Likewise.
      
      gcc/ChangeLog:
      	* diagnostic-core.h (warning_at): Rename overload to...
      	(warning_meta): ...this.
      	(emit_diagnostic_valist): Delete decl of overload taking
      	diagnostic_metadata.
      	* diagnostic.c (emit_diagnostic_valist): Likewise for defn.
      	(warning_at): Rename overload taking diagnostic_metadata to...
      	(warning_meta): ...this.
      
      gcc/testsuite/ChangeLog:
      	* gcc.dg/plugin/diagnostic_plugin_test_metadata.c: Update for
      	renaming of warning_at overload to warning_meta.
      	* gcc.dg/plugin/diagnostic_plugin_test_paths.c: Likewise.
      David Malcolm committed
    • Increase GFC_MAX_MANGLED_SYMBOL_LEN to handle submodule names. · ad690d79
              PR fortran/93461
              * trans.h: Increase GFC_MAX_MANGLED_SYMBOL_LEN to
              GFC_MAX_SYMBOL_LEN*3+5 to allow for inclusion of submodule name,
              plus the "." between module and submodule names.
              * gfortran.dg/pr93461.f90: New test.
      Andrew Benson committed
    • Allow concatenated module+submodule names. · a83b5cc5
      Increase length of char variables "parent1" and "parent2" in
      set_syms_host_assoc() to allow them to hold concatenated module +
      submodule names.
      
              PR fortran/93473
              * parse.c: Increase length of char variables to allow them to hold
              a concatenated module + submodule name.
              * gfortran.dg/pr93473.f90: New test.
      Andrew Benson committed
    • preprocessor: Make __has_include a builtin macro [PR93452] · 3d056cbf
      The clever hack of '#define __has_include __has_include' breaks -dD
      and -fdirectives-only, because that emits definitions.  This turns
      __has_include into a proper builtin macro.  Thus it's never emitted
      via -dD, and because use outside of directive processing is undefined,
      we can just expand it anywhere.
      
      	PR preprocessor/93452
      	* internal.h (struct spec_nodes): Drop n__has_include{,_next}.
      	* directives.c (lex_macro_node): Don't check __has_include redef.
      	* expr.c (eval_token): Drop __has_include eval.
      	(parse_has_include): Move to ...
      	* macro.c (builtin_has_include): ... here.
      	(_cpp_builtin_macro_text): Eval __has_include{,_next}.
      	* include/cpplib.h (enum cpp_builtin_type): Add BT_HAS_INCLUDE{,_NEXT}.
      	* init.c (builtin_array): Add them.
      	(cpp_init_builtins): Drop __has_include{,_next} init here ...
      	* pch.c (cpp_read_state): ... and here.
      	* traditional.c (enum ls): Drop has_include states ...
      	(_cpp_scan_out_logical_line): ... and here.
      Nathan Sidwell committed
    • libstdc++: Fix order of changelog entries · a5d81aaa
      Rebasing my last two commits put the changelog entries at the wrong
      place in the file. Fixed by this change.
      Jonathan Wakely committed
    • c++: Function declared with typedef with eh-specification. · 0968f7da
      We just need to handle the exception specification like other properties of
      a function typedef.
      
      	PR c++/90731
      	* decl.c (grokdeclarator): Propagate eh spec from typedef.
      Jason Merrill committed
    • Check array contiguity for OpenACC/Fortran · a5ed4958
      	PR fortran/93025
      
      	gcc/fortran/
      	* openmp.c (resolve_omp_clauses): Check array references for contiguity.
      
      	gcc/testsuite/
      	* gfortran.dg/goacc/mapping-tests-2.f90: New test.
      	* gfortran.dg/goacc/subarrays.f95: Expect rejection of non-contiguous
      	array.
      Julian Brown committed
    • Don't allow mixed component and non-component accesses for OpenACC/Fortran · 278c3214
      	gcc/fortran/
      	* gfortran.h (gfc_symbol): Add comp_mark bitfield.
      	* openmp.c (resolve_omp_clauses): Disallow mixed component and
      	full-derived-type accesses to the same variable within a single
      	directive.
      
      	libgomp/
      	* testsuite/libgomp.oacc-fortran/deep-copy-2.f90: Remove test from here.
      	* testsuite/libgomp.oacc-fortran/deep-copy-3.f90: Don't use mixed
      	component/non-component variable refs in a single directive.
      	* testsuite/libgomp.oacc-fortran/classtypes-1.f95: Likewise.
      
      	gcc/testsuite/
      	* gfortran.dg/goacc/deep-copy-2.f90: Move test here (from libgomp
      	testsuite). Make a compilation test, and expect rejection of mixed
      	component/non-component accesses.
      	* gfortran.dg/goacc/mapping-tests-1.f90: New test.
      Julian Brown committed
    • Add OpenACC test for sub-references being pointer or allocatable variables · 99b9f5b4
      	gcc/testsuite/
      	* gfortran.dg/goacc/strided-alloc-ptr.f90: New test.
      Julian Brown committed
    • libstdc++: Avoid using sizeof with function types (PR 93470) · 72a9fd20
      	PR libstdc++/93470
      	* include/bits/refwrap.h (reference_wrapper::operator()): Restrict
      	static assertion to object types.
      Jonathan Wakely committed
    • libstdc++: Replace glibc-specific check for clock_gettime (PR 93325) · 759812fd
      It's wrong to assume that clock_gettime is unavailable on any *-*-linux*
      target that doesn't have glibc 2.17 or later. Use a generic test instead
      of using __GLIBC_PREREQ. Only do that test when is_hosted=yes so that we
      don't get an error for cross targets without a working linker.
      
      This ensures that C library's clock_gettime will be used on non-glibc
      targets, instead of an incorrect syscall to SYS_clock_gettime.
      
      	PR libstdc++/93325
      	* acinclude.m4 (GLIBCXX_ENABLE_LIBSTDCXX_TIME): Use AC_SEARCH_LIBS for
      	clock_gettime instead of explicit glibc version check.
      	* configure: Regenerate.
      Jonathan Wakely committed
    • tree-optimization/93439 move clique bookkeeping to OMP expansion · 6c42e27c
      Autopar was doing clique bookkeeping too early when creating destination
      functions but then later introducing new cliques via versioning loops.
      The following moves the bookkeeping to the actual outlining process.
      
      2020-01-28  Richard Biener  <rguenther@suse.de>
      
      	PR tree-optimization/93439
      	* tree-parloops.c (create_loop_fn): Move clique bookkeeping...
      	* tree-cfg.c (move_sese_region_to_fn): ... here.
      	(verify_types_in_gimple_reference): Verify used cliques are
      	tracked.
      
      	* gfortran.dg/graphite/pr93439.f90: New testcase.
      Richard Biener committed
    • i386: Don't use ix86_tune_ctrl_string in parse_mtune_ctrl_str · 1e964774
      There are
      
      static void
      parse_mtune_ctrl_str (bool dump)
      {
        if (!ix86_tune_ctrl_string)
          return;
      
      parse_mtune_ctrl_str is only called from set_ix86_tune_features, which
      is only called from ix86_function_specific_restore and
      ix86_option_override_internal.  parse_mtune_ctrl_str shouldn't use
      ix86_tune_ctrl_string which is defined with global_options.  Instead,
      opts should be passed to parse_mtune_ctrl_str.
      
      	PR target/91399
      	* config/i386/i386-options.c (set_ix86_tune_features): Add an
      	argument of a pointer to struct gcc_options and pass it to
      	parse_mtune_ctrl_str.
      	(ix86_function_specific_restore): Pass opts to
      	set_ix86_tune_features.
      	(ix86_option_override_internal): Likewise.
      	(parse_mtune_ctrl_str): Add an argument of a pointer to struct
      	gcc_options and use it for x_ix86_tune_ctrl_string.
      H.J. Lu committed
    • [ARC] Pass along -mcode-density flag to the assembler. · 92860593
      This change makes sure that if the driver is invoked with
      "-mcode-density" flag, then the assembler will receive it too.
      
      Note Claudiu Zissulescu:
      This is an old patch of which I forgot to add the test.
      
      testsuite/
      2019-09-03  Sahahb Vahedi  <shahab@synopsys.com>
      
              * gcc.target/arc/code-density-flag.c: New test.
      Claudiu Zissulescu committed
    • simplify-rtx: Extend (truncate (*extract ...)) fold [PR87763] · 465c7c89
      In the gcc.target/aarch64/lsl_asr_sbfiz.c part of this PR, we have:
      
      Failed to match this instruction:
      (set (reg:SI 95)
          (ashift:SI (subreg:SI (sign_extract:DI (subreg:DI (reg:SI 97) 0)
                      (const_int 3 [0x3])
                      (const_int 0 [0])) 0)
              (const_int 19 [0x13])))
      
      If we perform the natural simplification to:
      
      (set (reg:SI 95)
          (ashift:SI (sign_extract:SI (reg:SI 97)
                      (const_int 3 [0x3])
                      (const_int 0 [0])) 0)
              (const_int 19 [0x13])))
      
      then the pattern matches.  And it turns out that we do have a
      simplification like that already, but it would only kick in for
      extractions from a reg, not a subreg.  E.g.:
      
      (set (reg:SI 95)
          (ashift:SI (subreg:SI (sign_extract:DI (reg:DI X)
                      (const_int 3 [0x3])
                      (const_int 0 [0])) 0)
              (const_int 19 [0x13])))
      
      would simplify to:
      
      (set (reg:SI 95)
          (ashift:SI (sign_extract:SI (subreg:SI (reg:DI X) 0)
                      (const_int 3 [0x3])
                      (const_int 0 [0])) 0)
              (const_int 19 [0x13])))
      
      IMO the subreg case is even more obviously a simplification
      than the bare reg case, since the net effect is to remove
      either one or two subregs, rather than simply change the
      position of a subreg/truncation.
      
      However, doing that regressed gcc.dg/tree-ssa/pr64910-2.c
      for -m32 on x86_64-linux-gnu, because we could then simplify
      a :HI zero_extract to a :QI one.  The associated *testqi_ext_3
      pattern did already seem to want to handle QImode extractions:
      
        "ix86_match_ccmode (insn, CCNOmode)
         && ((TARGET_64BIT && GET_MODE (operands[2]) == DImode)
             || GET_MODE (operands[2]) == SImode
             || GET_MODE (operands[2]) == HImode
             || GET_MODE (operands[2]) == QImode)
      
      but I'm not sure how often the QI case would trigger in practice,
      since the zero_extract mode was restricted to HI and above.  I checked
      the other x86 patterns and couldn't see any other instances of this.
      
      2020-01-28  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	PR rtl-optimization/87763
      	* simplify-rtx.c (simplify_truncation): Extend sign/zero_extract
      	simplification to handle subregs as well as bare regs.
      	* config/i386/i386.md (*testqi_ext_3): Match QI extracts too.
      Richard Sandiford committed
    • vect: Pattern-matched calls in reduction chains · 1e26ff73
      gcc.dg/pr56350.c started ICEing for SVE in GCC 10 because we
      pattern-matched a division reduction:
      
            a /= 8;
      
      into a signed shift with division semantics:
      
            ... = IFN_SDIV_POW2 (..., 3);
      
      whereas the reduction code expected it still to be a gassign.
      
      One fix would be to check for a reduction in the pattern matcher
      (but current patterns don't generally do that).  Another would be
      to fail gracefully for reductions involving calls.  Since we can't
      vectorise the reduction either way, and probably have a better shot
      with the shift form, this patch goes for the "fail gracefully" approach.
      
      2020-01-28  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vect-loop.c (vectorizable_reduction): Fail gracefully
      	for reduction chains that (now) include a call.
      Richard Sandiford committed
    • [Fortran] avoid ICE in gfc_omp_check_optional_argument (PR93464) · 627d59b6
              PR fortran/93464
              * openmp.c (gfc_omp_check_optional_argument): Avoid ICE when
              DECL_LANG_SPECIFIC and GFC_DESCRIPTOR_TYPE_P but not
              GFC_DECL_SAVED_DESCRIPTOR as for local allocatable character vars.
      
              PR fortran/93464
              * gfortran.dg/goacc/pr93464.f90: New.
      Tobias Burnus committed
    • forwprop: Tweak choice of VEC_PERM_EXPR filler [PR92822] · 1ee3b380
      For the 2s failures in the PR, we have a V4SF VEC_PERM_EXPR in
      which the first two elements are duplicates of one element and
      the other two are don't-care:
      
          v4sf_b = VEC_PERM_EXPR <v4sf_a, v4sf_a, { 1, 1, ?, ? }>;
      
      The heuristic was to extend this with a blend:
      
          v4sf_b = VEC_PERM_EXPR <v4sf_a, v4sf_a, { 1, 1, 2, 3 }>;
      
      but it seems better to extend a partial duplicate to a full duplicate:
      
          v4sf_b = VEC_PERM_EXPR <v4sf_a, v4sf_a, { 1, 1, 1, 1 }>;
      
      Obviously this is still just a heuristic though.
      
      I wondered whether to restrict this to two elements or more
      but couldn't find any examples in which it made a difference.
      Either way should be fine for the purposes of fixing this PR.
      
      2020-01-28  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	PR tree-optimization/92822
      	* tree-ssa-forwprop.c (simplify_vector_constructor): When filling
      	out the don't-care elements of a vector whose significant elements
      	are duplicates, make the don't-care elements duplicates too.
      Richard Sandiford committed
    • predcom: Fix invalid store-store commoning [PR93434] · 6cedf5d8
      predcom has the following code to stop one rogue load from
      interfering with other store-load opportunities:
      
            /* If A is read and B write or vice versa and there is unsuitable
      	 dependence, instead of merging both components into a component
      	 that will certainly not pass suitable_component_p, just put the
      	 read into bad component, perhaps at least the write together with
      	 all the other data refs in it's component will be optimizable.  */
      
      But when store-store commoning was added later, this had the effect
      of ignoring loads that occur between two candidate stores.
      
      There is code further up to handle loads and stores with unknown
      dependences:
      
            /* Don't do store elimination if there is any unknown dependence for
      	 any store data reference.  */
            if ((DR_IS_WRITE (dra) || DR_IS_WRITE (drb))
      	  && (DDR_ARE_DEPENDENT (ddr) == chrec_dont_know
      	      || DDR_NUM_DIST_VECTS (ddr) == 0))
      	eliminate_store_p = false;
      
      But the store-load code above skips loads for *known* dependences
      if (a) the load has already been marked "bad" or (b) the data-ref
      machinery knows the dependence distance, but determine_offsets
      can't handle the combination.
      
      (a) happens to be the problem in the testcase, but a different
      sequence could have given (b) instead.  We have writes to individual
      fields of a structure and reads from the whole structure.  Since
      determine_offsets requires the types to be the same, it returns false
      for each such read/write combination.
      
      This patch records which components have had loads removed and
      prevents store-store commoning for them.  It's a bit too pessimistic,
      since there shouldn't be a problem if a "bad" load dominates all stores
      in a component.  But (a) we can't AFAIK use pcom_stmt_dominates_stmt_p
      here and (b) the handling for that case would probably need to be
      removed again if we handled more exotic cases in future.
      
      2020-01-28  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	PR tree-optimization/93434
      	* tree-predcom.c (split_data_refs_to_components): Record which
      	components have had aliasing loads removed.  Prevent store-store
      	commoning for all such components.
      
      gcc/testsuite/
      	PR tree-optimization/93434
      	* gcc.c-torture/execute/pr93434.c: New test.
      Richard Sandiford committed
    • testsuite: Add -Wpsabi to gcc.dg/torture/pr93170.c [PR93460] · 3aa64a0f
      2020-01-28  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/testsuite/
      	PR testsuite/93460
      	* gcc.dg/torture/pr93170.c: Add -Wpsabi.
      Richard Sandiford committed
    • [Fortran] gfortran.texi - minor style cleanup · 4593f605
              * gfortran.texi (Runtime): Remove tailing '.' in @menu.
      Tobias Burnus committed
    • Add couple of auto_diagnostic_group in redeclare_class_template. · 1d859307
      	PR c++/92440
      	* pt.c (redeclare_class_template): Group couple of
      	errors and inform messages with auto_diagnostic_group.
      Martin Liska committed
    • Replace one error with inform. · d3c00969
      	PR c++/92440
      	* pt.c (redeclare_class_template): Use inform
      	for the second location.
      	PR c++/92440
      	* g++.dg/template/pr92440.C: New test.
      	* g++.dg/cpp0x/vt-34314.C: Update error to note.
      	* g++.dg/template/pr59930-2.C: Likewise.
      	* g++.old-deja/g++.pt/redecl1.C: Likewise.
      Martin Liska committed
    • Fix 2 typos in documentation of libstdc++. · 06d481d0
      	PR libstdc++/93478
      	* include/std/atomic: Fix typo.
      	* include/std/optional: Likewise.
      Martin Liska committed
    • i386: Fix ix86_fold_builtin shift folding [PR93418] · bff948aa
      The following testcase is miscompiled, because the variable shift left
      operand, { -1, -1, -1, -1 } is represented as a VECTOR_CST with
      VECTOR_CST_NPATTERNS 1 and VECTOR_CST_NELTS_PER_PATTERN 1, so when
      we call builder.new_unary_operation, builder.encoded_nelts () will be just 1
      and thus we encode the resulting vector as if all the elements were the
      same.
      For non-masked is_vshift, we could perhaps call builder.new_binary_operation
      (TREE_TYPE (args[0]), args[0], args[1], false), but then there are masked
      shifts, for non-is_vshift we could perhaps call it too but with args[2]
      instead of args[1], but there is no builder.new_ternary_operation.
      All this stuff is primarily for aarch64 anyway, on x86 we don't have any
      variable length vectors, and it is not a big deal to compute all elements
      and just let builder.finalize () find the most efficient VECTOR_CST
      representation of the vector.  So, instead of doing too much, this just
      keeps using new_unary_operation only if only one VECTOR_CST is involved
      (i.e. non-masked shift by constant) and for the rest just compute all elts.
      
      2020-01-28  Jakub Jelinek  <jakub@redhat.com>
      
      	PR target/93418
      	* config/i386/i386.c (ix86_fold_builtin) <do_shift>: If mask is not
      	-1 or is_vshift is true, use new_vector with number of elts npatterns
      	rather than new_unary_operation.
      
      	* gcc.target/i386/avx2-pr93418.c: New test.
      Jakub Jelinek committed
    • gimple-fold: Fix buffer overflow in fold_array_ctor_reference [PR93454] · 3c076c96
      libgcrypt FAILs to build on aarch64-linux with
      *** stack smashing detected ***: terminated
      when gcc is compiled with -D_FORTIFY_SOURCE=2.  The problem is if
      fold_array_ctor_reference is called with size equal to or very close to
      MAX_BITSIZE_MODE_ANY_MODE bits and non-zero inner_offset.
      The first native_encode_expr is called with that inner_offset and bufoff 0,
      the subsequent ones with offset of 0, and bufoff elt_size - inner_offset,
      2 * elt_size - inner_offset etc.  So, e.g. on the testcase where we start
      with inner_offset 1 and size is e.g. 256 bytes and elt_size 4 bytes
      we then call native_encode_expr at bufoff 251 and then 255, but that one
      overwrites 3 bytes beyond the buf array.
      The following patch fixes that.  In addition, it avoids calling
      elt_size.to_uhwi () all the time, and punts if elt_sz would be too large.
      
      2020-01-28  Jakub Jelinek  <jakub@redhat.com>
      
      	PR tree-optimization/93454
      	* gimple-fold.c (fold_array_ctor_reference): Perform
      	elt_size.to_uhwi () just once, instead of calling it in every
      	iteration.  Punt if that value is above size of the temporary
      	buffer.  Decrease third native_encode_expr argument when
      	bufoff + elt_sz is above size of buf.
      
      	* gcc.dg/pr93454.c: New test.
      Jakub Jelinek committed
    • analyzer: fix ICE when canonicalizing NaN (PR 93451) · 8c08c983
      PR analyzer/93451 reports an ICE when canonicalizing the constants
      in a region_model, with a failed qsort_chk when attempting to sort
      the constants within the region_model.
      
      The svalues in the model were:
        sv0: {poisoned: uninit}
        sv1: {type: ‘double’, ‘0.0’}
        sv2: {type: ‘double’, ‘1.0e+0’}
        sv3: {type: ‘double’, ‘ Nan’}
      
      The qsort_chk of the 3 constants fails due to tree_cmp using the
      LT_EXPR ordering of the REAL_CSTs, which doesn't work for NaN.
      
      This patch adjusts tree_cmp to impose an arbitrary ordering during
      canonicalization for UNORDERED_EXPR cases w/o relying on the LT_EXPR
      ordering, fixing the ICE.
      
      gcc/analyzer/ChangeLog:
      	PR analyzer/93451
      	* region-model.cc (tree_cmp): For the REAL_CST case, impose an
      	arbitrary order on NaNs relative to other NaNs and to non-NaNs;
      	const-correctness tweak.
      	(ana::selftests::build_real_cst_from_string): New function.
      	(ana::selftests::append_interesting_constants): New function.
      	(ana::selftests::test_tree_cmp_on_constants): New test.
      	(ana::selftests::test_canonicalization_4): New test.
      	(ana::selftests::analyzer_region_model_cc_tests): Call the new
      	tests.
      
      gcc/testsuite/ChangeLog:
      	PR analyzer/93451
      	* gcc.dg/analyzer/torture/pr93451.c: New test.
      David Malcolm committed
    • Daily bump. · 85d6090e
      GCC Administrator committed
  2. 27 Jan, 2020 5 commits
    • gcc: Add new configure options to allow static libraries to be selected · e7c26e04
      The motivation behind this change is to make it easier for a user to
      link against static libraries on a target where dynamic libraries are
      the default library type (for example GNU/Linux).
      
      Further, my motivation is really for linking libraries into GDB,
      however, the binutils-gdb/config/ directory is a copy of gcc/config/
      so changes for GDB need to be approved by the GCC project first.
      
      After making this change in the gcc/config/ directory I've run
      autoreconf on all of the configure scripts in the GCC tree and a
      couple have been updated, so I'll use one of these to describe what my
      change does.
      
      Consider libcpp, this library links against libiconv.  Currently if
      the user builds on a system with both static and dynamic libiconv
      installed then autotools will pick up the dynamic libiconv by
      default.  This is almost certainly the right thing to do.
      
      However, if the user wants to link against static libiconv then things
      are a little harder, they could remove the dynamic libiconv from their
      system, but this is probably a bad idea (other things might depend on
      that library), or the user can build their own version of libiconv,
      install it into a unique prefix, and then configure gcc using the
      --with-libiconv-prefix=DIR flag.  This works fine, but is somewhat
      annoying, the static library available, I just can't get autotools to
      use it.
      
      My change then adds a new flag --with-libiconv-type=TYPE, where type
      is either auto, static, or shared.  The default auto, ensures we keep
      the existing behaviour unchanged.
      
      If the user configures with --with-libiconv-type=static then the
      configure script will ignore any dynamic libiconv it finds, and will
      only look for a static libiconv, if no static libiconv is found then
      the configure will continue as though there is no libiconv at all
      available.
      
      Similarly a user can specify --with-libiconv-type=shared and force the
      use of shared libiconv, any static libiconv will be ignored.
      
      As I've implemented this change within the AC_LIB_LINKFLAGS_BODY macro
      then only libraries configured using the AC_LIB_LINKFLAGS or
      AC_LIB_HAVE_LINKFLAGS macros will gain the new configure flag.
      
      If this is accepted into GCC then there will be follow on patches for
      binutils and GDB to regenerate some configure scripts in those
      projects.
      
      For GCC only two configure scripts needed updated after this commit,
      libcpp and libstdc++-v3, both of which link against libiconv.
      
      config/ChangeLog:
      
      	* lib-link.m4 (AC_LIB_LINKFLAGS_BODY): Add new
      	--with-libXXX-type=... option.  Use this to guide the selection of
      	either a shared library or a static library.
      
      libcpp/ChangeLog:
      
      	* configure: Regenerate.
      
      libstdc++-v3/ChangeLog:
      
      	* configure: Regenerate.
      Andrew Burgess committed
    • Support gnu_unique_object symbols on MIPS. · 15d55239
      mips_declare_object_name is missing the support for declaring symbols
      as gnu_unique_object that is present in the generic
      ASM_DECLARE_OBJECT_NAME in elfos.h.  I'm not aware of any
      MIPS-specific reason for that support to be absent;
      mips_declare_object_name predates the addition of gnu_unique_object
      support and as far as I can tell this was simply an oversight when
      that support was added.  This patch adds the missing support,
      following the code in elfos.h.
      
      Tested with no regressions with cross to mips-linux-gnu.  In
      particular, this fixes the failure of the recently-added glibc test
      elf/tst-dlopen-nodelete-reloc, which relies on the compiler generating
      such symbols, for MIPS.
      
      	* config/mips/mips.c (mips_declare_object_name)
      	[USE_GNU_UNIQUE_OBJECT]: Support use of gnu_unique_object.
      Joseph Myers committed
    • compiler: cleanups permitted by GCC requirement of MPFR 3.1.0 · 2f195832
      For MPFR functions, change from GMP_RND* to MPFR_RND*.
      Also change mp_exp_t to mpfr_expt_t.
      
      Fixes PR go/92463
      
      Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/216417
      Ian Lance Taylor committed
    • c++: Fix array of char typedef in template (PR90966). · 8f25c39c
      Since Martin Sebor's patch for PR 71625 to change braced array initializers
      to STRING_CST in some cases, we need to be ready for STRING_CST with types
      that are changed by tsubst.  fold_convert doesn't know how to deal with
      STRING_CST, which is reasonable; we really shouldn't expect it to here.  So
      let's handle STRING_CST separately.
      
      	PR c++/90966
      	* pt.c (tsubst_copy) [STRING_CST]: Don't use fold_convert.
      Jason Merrill committed
    • coroutines: Ensure the ramp return object is checked (PR93443). · 1f2e8423
      As the PR shows, there is a pathway through the code where the
      no_warning value is not set, which corresponds to a missing check
      of the ramp return when it was constructed from the 'get return
      object'  Fixed by ensuring that the check of the return value is
      carried out for both return cases.
      
      gcc/cp/ChangeLog:
      
      2020-01-27  Iain Sandoe  <iain@sandoe.co.uk>
      
      	PR c++/93443
      	* coroutines.cc (morph_fn_to_coro): Check the ramp return
      	value when it is constructed from the 'get return object'.
      Iain Sandoe committed