1. 12 Jun, 2019 5 commits
    • re PR target/90811 ([nvptx] ptxas error on OpenMP offloaded code) · 26d7a5e6
      	PR target/90811
      	* cfgexpand.c (align_local_variable): Add really_expand argument,
      	don't SET_DECL_ALIGN if it is false.
      	(add_stack_var): Add really_expand argument, pass it through to
      	align_local_variable.
      	(expand_one_stack_var_1): Pass true as really_expand to
      	align_local_variable.
      	(expand_one_ssa_partition): Pass true as really_expand to
      	add_stack_var.
      	(expand_one_var): Pass really_expand through to add_stack_var.
      
      From-SVN: r272181
      Jakub Jelinek committed
    • [arm] Implement usadv16qi and ssadv16qi standard names · 84ae7213
      
      This patch implements the usadv16qi and ssadv16qi standard names for arm.
      
      The V16QImode variant is important as it is the most commonly used pattern:
      reducing vectors of bytes into an int.
      The midend expects the optab to compute the absolute differences of operands 1
      and 2 and reduce them while widening along the way up to SImode. So the inputs
      are V16QImode and the output is V4SImode.
      
      I've based my solution on Aarch64 usadv16qi and ssadv16qi standard names
      current implementation (r260437). This solution emits below sequence of
      instructions:
      
              VABDL.u8        tmp, op1, op2   # op1, op2 lowpart
              VABAL.u8        tmp, op1, op2   # op1, op2 highpart
              VPADAL.u16      op3, tmp
      
      So, for the code:
      
      $ arm-none-linux-gnueabihf-gcc -S -O3 -march=armv8-a+simd -mfpu=auto -mfloat-abi=hard usadv16qi.c -dp
      
      #define N 1024
      unsigned char pix1[N];
      unsigned char pix2[N];
      
      int
      foo (void)
      {
        int i_sum = 0;
        int i;
        for (i = 0; i < N; i++)
          i_sum += __builtin_abs (pix1[i] - pix2[i]);
        return i_sum;
      }
      
      we now generate on arm:
      foo:
              movw    r3, #:lower16:pix2      @ 57    [c=4 l=4]  *arm_movsi_vfp/3
              movt    r3, #:upper16:pix2      @ 58    [c=4 l=4]  *arm_movt/0
              vmov.i32        q9, #0  @ v4si  @ 3     [c=4 l=4]  *neon_movv4si/2
              movw    r2, #:lower16:pix1      @ 59    [c=4 l=4]  *arm_movsi_vfp/3
              movt    r2, #:upper16:pix1      @ 60    [c=4 l=4]  *arm_movt/0
              add     r1, r3, #1024   @ 8     [c=4 l=4]  *arm_addsi3/4
      .L2:
              vld1.8  {q11}, [r3]!    @ 11    [c=8 l=4]  *movmisalignv16qi_neon_load
              vld1.8  {q10}, [r2]!    @ 10    [c=8 l=4]  *movmisalignv16qi_neon_load
              cmp     r1, r3  @ 21    [c=4 l=4]  *arm_cmpsi_insn/2
              vabdl.u8        q8, d20, d22    @ 12    [c=8 l=4]  neon_vabdluv8qi
              vabal.u8        q8, d21, d23    @ 15    [c=88 l=4]  neon_vabaluv8qi
              vpadal.u16      q9, q8  @ 16    [c=8 l=4]  neon_vpadaluv8hi
              bne     .L2             @ 22    [c=16 l=4]  arm_cond_branch
              vadd.i32        d18, d18, d19   @ 24    [c=120 l=4]  quad_halves_plusv4si
              vpadd.i32       d18, d18, d18   @ 25    [c=8 l=4]  neon_vpadd_internalv2si
              vmov.32 r0, d18[0]      @ 30    [c=12 l=4]  vec_extractv2sisi/1
      
      instead of:
      foo:
              @ args = 0, pretend = 0, frame = 0
              @ frame_needed = 0, uses_anonymous_args = 0
              @ link register save eliminated.
              movw    r3, #:lower16:pix1
              movt    r3, #:upper16:pix1
              vmov.i32        q9, #0  @ v4si
              movw    r2, #:lower16:pix2
              movt    r2, #:upper16:pix2
              add     r1, r3, #1024
      .L2:
              vld1.8  {q8}, [r3]!
              vld1.8  {q11}, [r2]!
              vmovl.u8 q10, d16
              cmp     r1, r3
              vmovl.u8 q8, d17
              vmovl.u8 q12, d22
              vmovl.u8 q11, d23
              vsub.i16        q10, q10, q12
              vsub.i16        q8, q8, q11
              vabs.s16        q10, q10
              vabs.s16        q8, q8
              vaddw.s16       q9, q9, d20
              vaddw.s16       q9, q9, d21
              vaddw.s16       q9, q9, d16
              vaddw.s16       q9, q9, d17
              bne     .L2
              vadd.i32        d18, d18, d19
              vpadd.i32       d18, d18, d18
              vmov.32 r0, d18[0]
      
      2019-06-12  Przemyslaw Wirkus  <przemyslaw.wirkus@arm.com>
      
              * config/arm/iterators.md (VABAL): New int iterator.
              * config/arm/neon.md (<sup>sadv16qi): New define_expand.
              * config/arm/unspecs.md ("unspec"): Define UNSPEC_VABAL_S, UNSPEC_VABAL_U
              values.
      
              * gcc.target/arm/ssadv16qi.c: New test.
              * gcc.target/arm/usadv16qi.c: Likewise.
      
      From-SVN: r272180
      Przemyslaw Wirkus committed
    • Remove wrong assert about single value profiler. · d134323b
      2019-06-12  Martin Liska  <mliska@suse.cz>
      
      	* value-prof.c (stream_out_histogram_value): Only first value
      	can't be negative.
      
      From-SVN: r272179
      Martin Liska committed
    • re PR c/90760 (ICE on attributes section and alias in set_section, at symtab.c:1573) · f3139680
      	PR c/90760
      	* symtab.c (symtab_node::set_section): Allow being called on aliases
      	as long as they aren't analyzed yet.
      
      	* gcc.dg/pr90760.c: New test.
      
      From-SVN: r272178
      Jakub Jelinek committed
    • Daily bump. · bfde1e21
      From-SVN: r272177
      GCC Administrator committed
  2. 11 Jun, 2019 19 commits
  3. 10 Jun, 2019 16 commits
    • compiler: support inlining functions that use index expressions · e898243c
          
          Also move the determine_types pass on an inlined function body to one
          place, rather than doing it ad hoc as needed.
          
          This adds 79 new inlinable functions in the standard library, such as
          bytes.HasPrefix and bytes.LastIndexByte.
          
          Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/181261
      
      From-SVN: r272133
      Ian Lance Taylor committed
    • compiler: make heap expression's write barrier conditional · 35c19de6
          
          Heap_expression::do_get_backend emits an unconditional write
          barrier if the type has pointers and it is not a stack allocation.
          This CL changes it to use a write barrier for the assignment only
          when write barriers are enabled. While here, also change it to
          call gcWriteBarrier instead of typedmemmove for pointer-shaped
          types.
          
          For this to work, Function::build needs to be adjusted so that
          Heap_expression::do_get_backend is called when there is a parent
          block.
          
          Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/181540
      
      From-SVN: r272132
      Ian Lance Taylor committed
    • compiler: permit inlining functions with labels and goto statements · fc917b42
          
          This permits inlining functions with for loops and some switches, as
          they are lowered to if and goto statements before exporting them.
          
          This by itself only adds three new inlinable functions in the standard
          library: sort.Search, context.(*emptyCtx).String, and
          cmd/go/internal/work.(*Builder).disableBuildID.
          
          Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/181197
      
      From-SVN: r272131
      Ian Lance Taylor committed
    • compiler: use gcWriteBarrier for pointer-shaped struct/array · d480455f
          
          If a struct/array is pointer-shaped (i.e. having a single field
          that is pointer-shaped), we can use gcWriteBarrier instead of
          typedmemmove for the write barrier.
          
          Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/181539
      
      From-SVN: r272130
      Ian Lance Taylor committed
    • re PR c++/87250 (Internal compiler error with -Os -fsyntax-only) · fa237d91
      	PR c++/87250
      	* g++.dg/cpp0x/pr87250.C: New test.
      
      From-SVN: r272129
      Matthew Beliveau committed
    • constexpr.c (free_constructor): New. · 620adbec
      	* constexpr.c (free_constructor): New.
      
      	(cxx_eval_call_expression): Free parameter value CONSTRUCTORs.
      
      From-SVN: r272127
      Jason Merrill committed
    • Reduce unsharing in constexpr call evaluation. · 9b9eb42a
      	* constexpr.c (unshare_constructor): Only unshare if T is itself a
      	CONSTRUCTOR.
      	(cxx_eval_call_expression): Don't call it on the result here.
      
      From-SVN: r272126
      Jason Merrill committed
    • Reduce constexpr_call memory consumption. · 3c961dc7
      	* constexpr.c (cxx_bind_parameters_in_call): Use TREE_VEC rather
      	than TREE_LIST.
      	(constexpr_call_hasher::equal, cxx_bind_parameters_in_call)
      	(cxx_eval_call_expression): Adjust.
      
      From-SVN: r272125
      Jason Merrill committed
    • compiler: make escape analysis work with imported inlineable functions · c2f879e1
          
          The escape analysis was written before we import inlineable
          function bodies, and in some places it skipped functions that are
          not in the local package. Now that there are imported function
          bodies, make the escape analysis work with them.
          
          Note that it is necessary for the escape analysis to run on
          imported function bodies, even if they are already tagged. The
          tags only have the information of the parameters (receiver,
          results), but not the internal nodes, e.g. local variables. We
          still need to do the analysis to get all the information. (In the
          future maybe we could export/import escape info for internal
          nodes also, then we don't need to redo the analysis.)
          
          Also add assertions to ensure that if we analyze the same
          function in multiple places, they'd better agree with each other.
          
          Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/181537
      
      From-SVN: r272124
      Ian Lance Taylor committed
    • i386-protos.h (ix86_split_fp_absneg_operator): New prototype. · f359611b
      	* config/i386/i386-protos.h (ix86_split_fp_absneg_operator):
      	New prototype.
      	* config/i386/i386-expand.c (ix86_expand_fp_absneg_operator):
      	Emit clobber also for non-sse operations.
      	(ix86_split_fp_absneg_operator): New function.
      	* config/i386/i386.md (SSEMODEF): New mode iterator.
      	(ssevecmodef): New mode attribute.
      	(<code>tf2): Use absneg code iterator.
      	(*<code>tf2_1): Rename from *absnegtf3_sse. Use absneg code iterator.
      	Add three-operand AVX alternatives.
      	(*<code><mode>2_i387_1): Rename from *absnegxf2_i387.
      	Use absneg code iterator and X87MODEF mode iterator.
      	(absneg fp_reg non-sse splitter): Call absneg code iterator
      	and X87MODEF mode iterator.
      	(absneg general_reg non-sse splitter): Use absneg code iterator
      	and X87MODEF mode iterator.  Use ix86_split_fp_absneg_operator.
      	(*<code><mode>2_1): Rename from *absneg<mode>2.  Use absneg
      	code iterator.  Add three-operand AVX alternative.
      	(absneg sse_reg splitter): Use absneg code iterator
      	and SSEMODEF mode iterator.  Handle AVX operands.
      	(absneg fp_reg splitter): Use absneg code iterator
      	and MODEF mode iterator.
      	(absneg general_reg splitter): Merge splitters using MODEF mode
      	iterator.  Use absneg code iterator.  Call
      	ix86_split_fp_absneg_operator.
      	(*<code><mode>2_i387): Rename from *<code><mode>2_1.
      	Do not enable for non-sse modes before reload.
      	(CSGNMODE): Remove.
      	(CSGNVMODE): Ditto.
      	(copysing<mode>3): Use SSEMODEF instead of CSGNMODE and
      	ssevecmodef mode attribute instaed of CSGNVMODE.
      	(copysign<mode>3_const): Ditto.
      	(copysign<mode>3_var): Ditto.
      	* config/i386/i386.md (*<code><mode>2): Rename from *absneg<mode>2.
      	Use absneg code iterator.  Simplify code using std::swap.
      	* config/i386/predicates.md (absneg_operator): Remove.
      
      From-SVN: r272123
      Uros Bizjak committed
    • re PR testsuite/90772 (g++.dg/cpp1y/feat-cxx14.C and several others fails starting with r272011) · f2ee751d
      	PR testsuite/90772
      	* g++.dg/cpp1y/feat-cxx14.C: Use std::size_t instead of size_t.
      	* g++.dg/cpp1z/feat-cxx1z.C: Likewise.
      	* g++.dg/cpp2a/feat-cxx2a.C: Likewise.
      	* g++.dg/cpp1z/pr85569.C: Include <functional>.
      	* g++.dg/tree-ssa/pr80293.C: Include <cstdint>.
      	* g++.dg/tree-ssa/pr69336.C: Include <stdexcept>.
      
      From-SVN: r272122
      Jakub Jelinek committed
    • PR other/90695 reduce testcase to remove library dependency · 39d1184b
      This reproduces the original ICE fixed by r178857 (tested at r178852 and
      r178860), without depending on a libstdc++ header that keeps changing.
      
      The number of errors differs between C++14 and C++17 modes, so the fixed
      test uses dg-excess-errors to match any number of them. The precise
      errors aren't what's being tested for here anyway, the point of the test
      is to verify the ICE in PR 50391 is fixed.
      
      	PR other/90695
      	* g++.dg/cpp0x/noexcept15.C: Remove dependency on library header.
      
      From-SVN: r272121
      Jonathan Wakely committed
    • gimple-fold.c (get_range_strlen): Update comment that didn't make it into… · 97623b52
      gimple-fold.c (get_range_strlen): Update comment that didn't make it into r267503 or related commits.
      
      
      gcc/ChangeLog:
      
      	* gimple-fold.c (get_range_strlen): Update comment that didn't
      	make it into r267503 or related commits.
      
      From-SVN: r272120
      Martin Sebor committed
    • gcov-tool: Mark {merge,rewrite}_usage with noreturn attribute · c31783fd
      2019-06-10  Vladislav Ivanishin  <vlad@ispras.ru>
      
      	* gcov-tool.c (merge_usage, rewrite_usage): Mark with
      	ATTRIBUTE_NORETURN thus making consistent with overlap_usage.
      
      From-SVN: r272119
      Vladislav Ivanishin committed
    • tree.def (OMP_SCAN): New tree code. · bf38f7e9
      	* tree.def (OMP_SCAN): New tree code.
      	* tree-core.h (enum omp_clause_code): Add OMP_CLAUSE_INCLUSIVE and
      	OMP_CLAUSE_EXCLUSIVE.
      	* tree.h (OMP_CLAUSES): Use OMP_SCAN instead of OMP_TASKGROUP.
      	(OMP_SCAN_BODY, OMP_SCAN_CLAUSES): Define.
      	* tree.c (omp_clause_num_ops, omp_clause_code_name): Add entries for
      	OMP_CLAUSE_{IN,EX}CLUSIVE.
      	(walk_tree_1): Handle OMP_CLAUSE_{IN,EX}CLUSIVE.
      	* tree-nested.c (convert_nonlocal_reference_stmt,
      	convert_local_reference_stmt, convert_gimple_call): Handle
      	GIMPLE_OMP_SCAN.
      	* tree-pretty-print.c (dump_omp_clause): Handle
      	OMP_CLAUSE_{IN,EX}CLUSIVE.
      	(dump_generic_node): Handle OMP_SCAN.
      	* gimple.def (GIMPLE_OMP_SCAN): New gimple code.
      	* gimple.h (gomp_scan): New type.
      	(is_a_helper <gomp_scan *>::test,
      	is_a_helper <const gomp_scan *>::test): New templates.
      	(gimple_build_omp_scan): Declare.
      	(gimple_omp_scan_clauses, gimple_omp_scan_clauses_ptr,
      	gimple_omp_scan_set_clauses): New inline functions.
      	(CASE_GIMPLE_OMP): Add case GIMPLE_OMP_SCAN:.
      	* gimple.c (gimple_build_omp_scan): New function.
      	(gimple_copy): Handle GIMPLE_OMP_SCAN.
      	* gimple-walk.c (walk_gimple_op, walk_gimple_stmt): Likewise.
      	* gimple-pretty-print.c (dump_gimple_omp_block): Don't handle
      	GIMPLE_OMP_TASKGROUP.
      	(dump_gimple_omp_scan): New function.
      	(pp_gimple_stmt_1): Handle GIMPLE_OMP_SCAN.
      	* gimple-low.c (lower_stmt): Handle GIMPLE_OMP_SCAN.
      	* tree-inline.c (remap_gimple_stmt, estimate_num_insns): Likewise.
      	* gimplify.c (enum gimplify_omp_var_data): Add GOVD_REDUCTION_INSCAN.
      	(is_gimple_stmt): Handle OMP_SCAN.
      	(gimplify_scan_omp_clauses): Reject inscan reductions on constructs
      	other than OMP_FOR or OMP_SIMD.  Handle OMP_CLAUSE_{IN,EX}CLUSIVE.
      	(gimplify_adjust_omp_clauses): Diagnose inscan reductions not
      	mentioned in nested #pragma omp scan.  Handle
      	OMP_CLAUSE_{IN,EX}CLUSIVE.
      	(gimplify_expr): Handle OMP_SCAN.
      	* omp-low.c (check_omp_nesting_restrictions): For parent context,
      	look through GIMPLE_OMP_SCAN context.  Allow #pragma omp scan in
      	simd constructs.
      	(scan_omp_1_stmt, lower_omp_1, diagnose_sb_1, diagnose_sb_2): Handle
      	GIMPLE_OMP_SCAN.
      c-family/
      	* c-pragma.h (enum pragma_kind): Add PRAGMA_OMP_SCAN.
      	* c-pragma.c (omp_pragmas_simd): Add #pragma omp scan.
      	* c-omp.c (c_omp_split_clauses): Diagnose inscan reductions on
      	combined/composite constructs where it is not allowed.  Copy over
      	OMP_CLAUSE_REDUCTION_INSCAN.
      c/
      	* c-parser.c (c_parser_pragma): Reject PRAGMA_OMP_SCAN.
      	(c_parser_omp_clause_reduction): Don't sorry_at on inscan reductions.
      	(c_parser_omp_scan_loop_body): New function.
      	(c_parser_omp_for_loop): Call c_parser_omp_scan_loop_body if there are
      	inscan reduction clauses.
      	* c-typeck.c (c_finish_omp_clauses): Reject mixing inscan with
      	non-inscan reductions on the same construct, or inscan reductions with
      	ordered or schedule clauses, or inscan array reductions.
      cp/
      	* parser.c (cp_parser_omp_clause_reduction): Don't sorry_at on inscan
      	reductions.
      	(cp_parser_omp_scan_loop_body): New function.
      	(cp_parser_omp_for_loop): Call cp_parser_omp_scan_loop_body if there
      	are inscan reduction clauses.
      	(cp_parser_pragma): Reject PRAGMA_OMP_SCAN.
      	* semantics.c (finish_omp_clauses): Reject mixing inscan with
      	non-inscan reductions on the same construct, or inscan reductions with
      	ordered or schedule clauses, or inscan array reductions.
      	* pt.c (tsubst_omp_clauses): Handle OMP_CLAUSE_{IN,EX}CLUSIVE.
      	(tsubst_expr): Handle OMP_SCAN.
      testsuite/
      	* c-c++-common/gomp/scan-1.c: New test.
      	* c-c++-common/gomp/scan-2.c: New test.
      	* c-c++-common/gomp/scan-3.c: New test.
      	* c-c++-common/gomp/scan-4.c: New test.
      
      From-SVN: r272117
      Jakub Jelinek committed