1. 14 Aug, 2019 31 commits
    • [AArch64] Make more use of SVE conditional constant moves · d29f7dd5
      This patch extends the SVE UNSPEC_SEL patterns so that they can use:
      
      (1) MOV /M of a duplicated integer constant
      (2) MOV /M of a duplicated floating-point constant bitcast to an integer,
          accepting the same constants as (1)
      (3) FMOV /M of a duplicated floating-point constant
      (4) MOV /Z of a duplicated integer constant
      (5) MOV /Z of a duplicated floating-point constant bitcast to an integer,
          accepting the same constants as (4)
      (6) MOVPRFXed FMOV /M of a duplicated floating-point constant
      
      We already handled (4) with a special pattern; the rest are new.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      	    Kugan Vivekanandarajah  <kugan.vivekanandarajah@linaro.org>
      
      gcc/
      	* config/aarch64/aarch64.c (aarch64_bit_representation): New function.
      	(aarch64_print_vector_float_operand): Also handle 8-bit floats.
      	(aarch64_print_operand): Add support for %I.
      	(aarch64_sve_dup_immediate_p): Handle scalars as well as vectors.
      	Bitcast floating-point constants to the corresponding integer constant.
      	(aarch64_float_const_representable_p): Handle vectors as well
      	as scalars.
      	(aarch64_expand_sve_vcond): Make sure that the operands are valid
      	for the new vcond_mask_<mode><vpred> expander.
      	* config/aarch64/predicates.md (aarch64_sve_dup_immediate): Also
      	test aarch64_float_const_representable_p.
      	(aarch64_sve_reg_or_dup_imm): New predicate.
      	* config/aarch64/aarch64-sve.md (vec_extract<vpred><Vel>): Use
      	gen_vcond_mask_<mode><vpred> instead of
      	gen_aarch64_sve_dup<mode>_const.
      	(vcond_mask_<mode><vpred>): Turn into a define_expand that
      	accepts aarch64_sve_reg_or_dup_imm and aarch64_simd_reg_or_zero
      	for operands 1 and 2 respectively.  Force operand 2 into a
      	register if operand 1 is a register.  Fold old define_insn...
      	(aarch64_sve_dup<mode>_const): ...and this define_insn...
      	(*vcond_mask_<mode><vpred>): ...into this new pattern.  Handle
      	floating-point constants that can be moved as integers.  Add
      	alternatives for MOV /M and FMOV /M.
      	(vcond<mode><v_int_equiv>, vcondu<mode><v_int_equiv>)
      	(vcond<mode><v_fp_equiv>): Accept nonmemory_operand for operands
      	1 and 2 respectively.
      	* config/aarch64/constraints.md (Ufc): Handle vectors as well
      	as scalars.
      	(vss): New constraint.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/vcond_18.c: New test.
      	* gcc.target/aarch64/sve/vcond_18_run.c: Likewise.
      	* gcc.target/aarch64/sve/vcond_19.c: Likewise.
      	* gcc.target/aarch64/sve/vcond_19_run.c: Likewise.
      	* gcc.target/aarch64/sve/vcond_20.c: Likewise.
      	* gcc.target/aarch64/sve/vcond_20_run.c: Likewise.
      
      Co-Authored-By: Kugan Vivekanandarajah <kuganv@linaro.org>
      
      From-SVN: r274441
      Richard Sandiford committed
    • [AArch64] Add support for SVE F{MAX,MIN}NM immediate · 75079ddf
      This patch uses the immediate forms of FMAXNM and FMINNM for
      unconditional arithmetic.
      
      The same rules apply to FMAX and FMIN, but we only generate those
      via the ACLE.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/predicates.md (aarch64_sve_float_maxmin_immediate)
      	(aarch64_sve_float_maxmin_operand): New predicates.
      	* config/aarch64/constraints.md (vsB): New constraint.
      	(vsM): Fix typo.
      	* config/aarch64/iterators.md (sve_pred_fp_rhs2_operand): Use
      	aarch64_sve_float_maxmin_operand for UNSPEC_COND_FMAXNM and
      	UNSPEC_COND_FMINNM.
      	* config/aarch64/aarch64-sve.md (<maxmin_uns><SVE_F:mode>3):
      	Use aarch64_sve_float_maxmin_operand for operand 2.
      	(*<SVE_COND_FP_MAXMIN_PUBLIC:optab><SVE_F:mode>3): Likewise.
      	Add alternatives for the constant forms.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/fmaxnm_1.c: New test.
      	* gcc.target/aarch64/sve/fminnm_1.c: Likewise.
      
      From-SVN: r274440
      Richard Sandiford committed
    • [AArch64] Add support for SVE [SU]{MAX,MIN} immediate · f8c22a8b
      This patch adds support for the immediate forms of SVE SMAX, SMIN, UMAX
      and UMIN.  SMAX and SMIN take the same range as MUL, so the patch
      basically just moves and generalises the existing MUL patterns.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/constraints.md (vsb): New constraint.
      	(vsm): Generalize description.
      	* config/aarch64/iterators.md (SVE_INT_BINARY_IMM): New code
      	iterator.
      	(sve_imm_con): Handle smax, smin, umax and umin.
      	(sve_imm_prefix): New code attribute.
      	* config/aarch64/predicates.md (aarch64_sve_vsb_immediate)
      	(aarch64_sve_vsb_operand): New predicates.
      	(aarch64_sve_mul_immediate): Rename to...
      	(aarch64_sve_vsm_immediate): ...this.
      	(aarch64_sve_mul_operand): Rename to...
      	(aarch64_sve_vsm_operand): ...this.
      	* config/aarch64/aarch64-sve.md (mul<mode>3): Generalize to...
      	(<SVE_INT_BINARY_IMM:optab><SVE_I:mode>3): ...this.
      	(*mul<mode>3, *post_ra_mul<mode>3): Generalize to...
      	(*<SVE_INT_BINARY_IMM:optab><SVE_I:mode>3)
      	(*post_ra_<SVE_INT_BINARY_IMM:optab><SVE_I:mode>3): ...these and
      	add movprfx support for the immediate alternatives.
      	(<su><maxmin><mode>3, *<su><maxmin><mode>3): Delete in favor
      	of the above.
      	(*<SVE_INT_BINARY_SD:optab><SVE_SDI:mode>3): Fix incorrect predicate
      	for operand 3.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/smax_1.c: New test.
      	* gcc.target/aarch64/sve/smin_1.c: Likewise.
      	* gcc.target/aarch64/sve/umax_1.c: Likewise.
      	* gcc.target/aarch64/sve/umin_1.c: Likewise.
      
      From-SVN: r274439
      Richard Sandiford committed
    • [AArch64] Add support for SVE CNOT · e0a0be93
      This patch adds support for predicated and unpredicated CNOT
      (logical NOT on integers).  In RTL terms, this is a select between
      1 and 0 in which the predicate is fed by a comparison with zero.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/predicates.md (aarch64_simd_imm_one): New predicate.
      	* config/aarch64/aarch64-sve.md (*cnot<mode>): New pattern.
      	(*cond_cnot<mode>_2, *cond_cnot<mode>_any): Likewise.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/cnot_1.c: New test.
      	* gcc.target/aarch64/sve/cond_cnot_1.c: Likewise.
      	* gcc.target/aarch64/sve/cond_cnot_1_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_cnot_2.c: Likewise.
      	* gcc.target/aarch64/sve/cond_cnot_2_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_cnot_3.c: Likewise.
      	* gcc.target/aarch64/sve/cond_cnot_3_run.c: Likewise.
      
      From-SVN: r274438
      Richard Sandiford committed
    • [AArch64] Add support for SVE CLS and CLZ · bca5a997
      This patch adds support for unpredicated SVE CLS and CLZ.  A later patch
      will add support for predicated unary integer arithmetic.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/iterators.md (SVE_INT_UNARY): Add clrsb and clz.
      	(optab, sve_int_op): Handle them.
      	* config/aarch64/aarch64-sve.md: Expand comment.
      
      gcc/testsuite/
      	* gcc.target/aarch64/vect-clz.c: Force SVE off.
      	* gcc.target/aarch64/sve/clrsb_1.c: New test.
      	* gcc.target/aarch64/sve/clrsb_1_run.c: Likewise.
      	* gcc.target/aarch64/sve/clz_1.c: Likewise.
      	* gcc.target/aarch64/sve/clz_1_run.c: Likewise.
      
      From-SVN: r274437
      Richard Sandiford committed
    • [AArch64] Use SVE ADR to optimise shift-add sequences · a229966c
      This patch uses SVE ADR to optimise shift-and-add and uxtw-and-add
      sequences.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/predicates.md (const_1_to_3_operand): New predicate.
      	* config/aarch64/aarch64-sve.md (*aarch64_adr_uxtw)
      	(*aarch64_adr<mode>_shift, *aarch64_adr_shift_uxtw): New patterns.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/adr_1.c: New test.
      	* gcc.target/aarch64/sve/adr_1_run.c: Likewise.
      	* gcc.target/aarch64/sve/adr_2.c: Likewise.
      	* gcc.target/aarch64/sve/adr_2_run.c: Likewise.
      	* gcc.target/aarch64/sve/adr_3.c: Likewise.
      	* gcc.target/aarch64/sve/adr_3_run.c: Likewise.
      	* gcc.target/aarch64/sve/adr_4.c: Likewise.
      	* gcc.target/aarch64/sve/adr_4_run.c: Likewise.
      	* gcc.target/aarch64/sve/adr_5.c: Likewise.
      	* gcc.target/aarch64/sve/adr_5_run.c: Likewise.
      
      From-SVN: r274436
      Richard Sandiford committed
    • decl.c (grokdeclarator): Use id_loc and EXPR_LOCATION in a few error messages. · 917d611c
      /cp
      2019-08-08  Paolo Carlini  <paolo.carlini@oracle.com>
      
      	* decl.c (grokdeclarator): Use id_loc and EXPR_LOCATION in
      	a few error messages.
      
      /testsuite
      2019-08-08  Paolo Carlini  <paolo.carlini@oracle.com>
      
      	* g++.dg/cpp0x/enum20.C: Test location(s) too.
      	* g++.dg/other/friend3.C: Likewise.
      	* g++.dg/parse/dtor5.C: Likewise.
      	* g++.dg/parse/friend7.C: Likewise.
      	* g++.dg/template/error22.C: Likewise.
      	* g++.old-deja/g++.brendan/err-msg5.C: Likewise.
      
      From-SVN: r274435
      Paolo Carlini committed
    • [AArch64] Handle more SVE predicate constants · 2803bc3b
      This patch handles more predicate constants by using TRN1, TRN2
      and EOR.  For now, only one operation is allowed before we fall
      back to loading from memory or doing an integer move and a compare.
      The EOR support includes the important special case of an inverted
      predicate.
      
      The real motivating case for this is the ACLE svdupq function,
      which allows a repeating 16-bit predicate to be built from
      individual scalar booleans.  It's not easy to test properly
      before that support is merged.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/aarch64.c (aarch64_expand_sve_const_pred_eor)
      	(aarch64_expand_sve_const_pred_trn): New functions.
      	(aarch64_expand_sve_const_pred_1): Add a recurse_p parameter and
      	use the above functions when the parameter is true.
      	(aarch64_expand_sve_const_pred): Update call accordingly.
      	* config/aarch64/aarch64-sve.md (*aarch64_sve_<perm_insn><mode>):
      	Rename to...
      	(@aarch64_sve_<perm_insn><mode>): ...this.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/peel_ind_1.c: Look for an inverted .B VL1.
      	* gcc.target/aarch64/sve/peel_ind_2.c: Likewise .S VL7.
      
      From-SVN: r274434
      Richard Sandiford committed
    • decl.c (grokdeclarator): Check here for typedef a function definition or a… · df4ac85f
      decl.c (grokdeclarator): Check here for typedef a function definition or a member function definition.
      
      /cp
      2019-08-14  Paolo Carlini  <paolo.carlini@oracle.com>
      
      	* decl.c (grokdeclarator): Check here for typedef a function
      	definition or a member function definition.
      	(start_function): Adjust.
      	(grokmethod): Likewise.
      
      /testsuite
      2019-08-14  Paolo Carlini  <paolo.carlini@oracle.com>
      
      	* g++.dg/parse/typedef9.C: Test locations too.
      
      From-SVN: r274433
      Paolo Carlini committed
    • decl.c (grokdeclarator): Check here for typedef a function definition or a… · f59d2b42
      decl.c (grokdeclarator): Check here for typedef a function definition or a member function definition.
      
      /cp
      2019-08-14  Paolo Carlini  <paolo.carlini@oracle.com>
      
      	* decl.c (grokdeclarator): Check here for typedef a function
      	definition or a member function definition.
      	(start_function): Adjust.
      	(grokmethod): Likewise.
      
      /testsuite
      2019-08-14  Paolo Carlini  <paolo.carlini@oracle.com>
      
      	* g++.dg/parse/typedef9.C: Test locations too.
      
      From-SVN: r274432
      Paolo Carlini committed
    • decl.c (grokdeclarator): Check here for typedef a function definition or a… · 777e4267
      decl.c (grokdeclarator): Check here for typedef a function definition or a member function definition.
      
      /cp
      2019-08-14  Paolo Carlini  <paolo.carlini@oracle.com>
      
      	* decl.c (grokdeclarator): Check here for typedef a function
      	definition or a member function definition.
      	(start_function): Adjust.
      	(grokmethod): Likewise.
      
      /testsuite
      2019-08-14  Paolo Carlini  <paolo.carlini@oracle.com>
      
      	* g++.dg/parse/typedef9.C: Test locations too.
      
      From-SVN: r274431
      Paolo Carlini committed
    • Refresh LOCAL_PATCHES · e2723123
      2019-08-14  Martin Liska  <mliska@suse.cz>
      
      	* LOCAL_PATCHES: Refresh based on what was committed.
      
      From-SVN: r274430
      Martin Liska committed
    • [AArch64] Rework SVE integer comparisons · 00fa90d9
      The remaining uses of UNSPEC_MERGE_PTRUE were in integer comparison
      patterns.  These aren't actually merging operations but zeroing ones,
      although there's no practical difference when the predicate is a PTRUE.
      
      All comparisons produced by expand are predicated on a PTRUE,
      although we try to pattern-match a compare-and-AND as a predicated
      comparison during combine.
      
      Like previous patches, this one rearranges things in a way that works
      better with the ACLE, where the initial predicate might or might not
      be a PTRUE.  The new patterns use UNSPEC_PRED_Z to represent zeroing
      predication, with a aarch64_sve_ptrue_flag to record whether the
      predicate is all-true (as for UNSPEC_PTEST).
      
      See the block comment in the patch for more details.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/aarch64-protos.h (aarch64_sve_same_pred_for_ptest_p):
      	Declare.
      	* config/aarch64/aarch64.c (aarch64_sve_same_pred_for_ptest_p)
      	(aarch64_sve_emit_int_cmp): New functions.
      	(aarch64_convert_sve_data_to_pred): Use aarch64_sve_emit_int_cmp.
      	(aarch64_sve_cmp_operand_p, aarch64_emit_sve_ptrue_op_cc): Delete.
      	(aarch64_expand_sve_vec_cmp_int): Use aarch64_sve_emit_int_cmp.
      	* config/aarch64/aarch64.md (UNSPEC_MERGE_PTRUE): Delete.
      	(UNSPEC_PRED_Z): New unspec.
      	(set_clobber_cc_nzc): Delete.
      	* config/aarch64/aarch64-sve.md: Add a block comment about
      	UNSPEC_PRED_Z.
      	(*cmp<SVE_INT_CMP:cmp_op><mode>): Rename to...
      	(@aarch64_pred_cmp<SVE_INT_CMP:cmp_op><mode>): ...this, replacing
      	the old pattern with that name.  Use UNSPEC_PRED_Z instead of
      	UNSPEC_MERGE_PTRUE.
      	(*cmp<SVE_INT_CMP:cmp_op><mode>_cc): Use UNSPEC_PRED_Z instead of
      	UNSPEC_MERGE_PTRUE.  Use aarch64_sve_same_pred_for_ptest_p to
      	check for compatible predicates.
      	(*cmp<cmp_op><SVE_INT_CMP:mode>_ptest): Likewise.
      	(*cmp<cmp_op><mode>_and): Match a known-ptrue UNSPEC_PRED_Z instead
      	of UNSPEC_MERGE_PTRUE.  Split into the new form of predicated
      	comparisons above.
      
      From-SVN: r274429
      Richard Sandiford committed
    • Fix a test-case scan pattern. · 052f7399
      2019-08-14  Martin Liska  <mliska@suse.cz>
      
      	* c-c++-common/asan/memcmp-1.c: There's a new function in the
      	stack-trace on the top.  So shift expected output in stack
      	trace.
      
      From-SVN: r274428
      Martin Liska committed
    • Reapply all revisions mentioned in LOCAL_PATCHES. · 47f0255f
      2019-08-14  Martin Liska  <mliska@suse.cz>
      
      	* asan/asan_globals.cpp (CheckODRViolationViaIndicator): Reapply
      	patch from trunk.
      	(CheckODRViolationViaPoisoning): Likewise.
      	(RegisterGlobal): Likewise.
      	* asan/asan_mapping.h: Likewise.
      	* sanitizer_common/sanitizer_linux_libcdep.cpp (defined): Likewise.
      	* sanitizer_common/sanitizer_mac.cpp (defined): Likewise.
      	* sanitizer_common/sanitizer_platform_limits_linux.cpp (defined): Likewise.
      	* sanitizer_common/sanitizer_platform_limits_posix.h (defined): Likewise.
      	* sanitizer_common/sanitizer_stacktrace.cpp (GetCanonicFrame): Likewise.
      	* ubsan/ubsan_handlers.cpp (__ubsan::__ubsan_handle_cfi_bad_icall): Likewise.
      	(__ubsan::__ubsan_handle_cfi_bad_icall_abort): Likewise.
      	* ubsan/ubsan_handlers.h (struct CFIBadIcallData): Likewise.
      	(struct CFICheckFailData): Likewise.
      	(RECOVERABLE): Likewise.
      	* ubsan/ubsan_platform.h: Likewise.
      
      From-SVN: r274427
      Martin Liska committed
    • Libsanitizer merge from trunk r368656. · b667dd70
      2019-08-14  Martin Liska  <mliska@suse.cz>
      
      	PR sanitizer/89832
      	PR sanitizer/91325
      	* All source files: Merge from upstream 368656.
      
      From-SVN: r274426
      Martin Liska committed
    • [AArch64] Use "x" predication for SVE integer arithmetic patterns · 06308276
      The SVE patterns used an UNSPEC_MERGE_PTRUE unspec to attach a predicate
      to an otherwise unpredicated integer arithmetic operation.  As its name
      suggests, this was designed to be a wrapper used for merging instructions
      in which the predicate is known to be a PTRUE.
      
      This unspec dates from the very early days of the port and nothing has
      ever taken advantage of the PTRUE guarantee for arithmetic (as opposed
      to comparisons).  This patch replaces it with the less stringent
      guarantee that:
      
      (a) the values of inactive lanes don't matter and
      (b) it is valid to make extra lanes active if there's a specific benefit
      
      Doing this makes the patterns suitable for the ACLE _x functions, which
      have the above semantics.
      
      See the block comment in the patch for more details.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/aarch64.md (UNSPEC_PRED_X): New unspec.
      	* config/aarch64/aarch64-sve.md: Add a section describing it.
      	(@aarch64_pred_mov<mode>, @aarch64_pred_mov<mode>)
      	(<SVE_INT_UNARY:optab><mode>2, *<SVE_INT_UNARY:optab><mode>2)
      	(aarch64_<su>abd<mode>_3, mul<SVE_I:mode>3, *mul<SVE_I:mode>3)
      	(<su>mul<mode>3_highpart, *<su>mul<mode>3_highpart)
      	(<SVE_INT_BINARY:optab><mode>3, *<SVE_INT_BINARY:optab><mode>3)
      	(*bic<mode>3, v<ASHIFT:optab><mode>3, *v<ASHIFT:optab><mode>3)
      	(<su><maxmin><mode>3, *<su><maxmin><mode>3, *madd<SVE_I:mode>)
      	(*msub<SVE_I:mode>3, *aarch64_sve_rev64<mode>)
      	(*aarch64_sve_rev32<mode>, *aarch64_sve_rev16vnx16qi): Use
      	UNSPEC_PRED_X instead of UNSPEC_MERGE_PTRUE.
      	* config/aarch64/aarch64-sve2.md (<u>avg<mode>3_floor)
      	(<u>avg<mode>3_ceil, *<sur>h<addsub><mode>): Likewise.
      	* config/aarch64/aarch64.c (aarch64_split_sve_subreg_move)
      	(aarch64_evpc_rev_local): Update accordingly.
      
      From-SVN: r274425
      Richard Sandiford committed
    • [AArch64] Rearrange SVE conversion patterns · 95eb5537
      The SVE int<->float conversion patterns need to handle various
      combinations of modes, making sure that the predicate mode is based
      on the widest element size.  We did this using separate patterns for
      conversions involving:
      
      - HF (converting to/from [HSD]I, predicated based on the int operand)
      - SF (converting to/from [SD]I, predicated based on the int operand)
      - DF (converting to/from [SD]I, predicated based on the float operand)
      
      This worked, and meant that there were no redundant patterns.  However,
      the ACLE needs various new predicated patterns too, and having three
      versions of each one seemed excessive.
      
      This patch instead splits the patterns into two groups rather than three.
      For conversions to integers:
      
      - truncating (predicated based on the source type, DF->SI only)
      - non-truncating (predicated based on the destination type)
      
      For conversions from integers:
      
      - extending (predicated based on the destination type, SI->DF only)
      - non-extending (predicated based on the source type)
      
      This means that we still don't create pattern names for the invalid
      combinations DF<->HI and SF<->HI.  The downside is that we need to
      use C conditions to exclude the SI<->DF case from the non-truncating/
      non-extending patterns.  We therefore have two pattern names for SI<->DF,
      but genconditions ensures that the invalid one always has the value
      CODE_FOR_nothing.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/iterators.md (VNx4SI_ONLY, VNx2DF_ONLY): New mode
      	iterators.
      	(SVE_BHSI, SVE_SDI): Tweak comment.
      	(SVE_HSDI): Likewise.  Fix definition.
      	(SVE_SDF): New mode iterator.
      	(elem_bits): New mode attribute.
      	(SVE_COND_FCVT): New int iterator.
      	* config/aarch64/aarch64-sve.md
      	(*<SVE_COND_ICVTF:optab>v16hsf<SVE_HSDI:mode>2)
      	(*<SVE_COND_ICVTF:optab>vnx4sf<SVE_SDI:mode>2)
      	(*<SVE_COND_ICVTF:optab>vnx2df<SVE_SDI:mode>2): Merge into...
      	(*aarch64_sve_<SVE_COND_ICVTF:optab>_nontrunc<SVE_F:mode><SVE_HSDI:mode>)
      	(*aarch64_sve_<SVE_COND_ICVTF:optab>_trunc<VNx2DF_ONLY:mode><VNx4SI_ONLY:mode>):
      	...these new patterns.
      	(*<SVE_COND_FCVTI:optab><SVE_HSDI:mode>vnx8hf2)
      	(*<SVE_COND_FCVTI:optab><SVE_SDI:mode>vnx4sf2)
      	(aarch64_sve_<SVE_COND_FCVTI:optab><SVE_SDI:mode>vnx2df2):
      	Merge into...
      	(*aarch64_sve_<SVE_COND_FCVTI:optab>_nonextend<SVE_HSDI:mode><SVE_F:mode>)
      	(aarch64_sve_<SVE_COND_FCVTI:optab>_extend<VNx4SI_ONLY:mode><VNx2DF_ONLY:mode>):
      	...these new patterns.
      	(vec_unpack<su_optab>_float_<perm_hilo>_vnx4si): Update accordingly.
      	(*trunc<Vwide><SVE_SDF:mode>2): Replace with...
      	(*aarch64_sve_<SVE_COND_FCVT:optab>_trunc<SVE_SDF:mode><SVE_HSF:mode>):
      	...this new pattern.
      	(aarch64_sve_extend<SVE_HSDF:mode><Vwide>2): Replace with...
      	(aarch64_sve_<SVE_COND_FCVT:optab>_nontrunc<SVE_HSF:mode><SVE_SDF:mode>):
      	...this new pattern.
      	(vec_unpacks_<perm_hilo>_<mode>): Update accordingly.
      
      From-SVN: r274424
      Richard Sandiford committed
    • [AArch64] Use unspecs for SVE conversions involving floats · 99361551
      This patch changes the SVE FP<->FP and FP<->INT patterns so that
      they use unspecs rather than rtx codes, continuing the series
      to make the patterns work with predicates that might not be all-true.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/aarch64.md (UNSPEC_FLOAT_CONVERT): Delete.
      	* config/aarch64/iterators.md (UNSPEC_COND_FCVT, UNSPEC_COND_FCVTZS)
      	(UNSPEC_COND_FCVTZU, UNSPEC_COND_SCVTF, UNSPEC_COND_UCVTF): New
      	unspecs.
      	(optab, su): Handle them.
      	(SVE_COND_FCVTI, SVE_COND_ICVTF): New int iterators.
      	* config/aarch64/aarch64-sve.md
      	(<fix_trunc_optab><SVE_F:mode><v_int_equiv>2): Replace with...
      	(<SVE_COND_FCVTI:optab><SVE_F:mode><v_int_equiv>2): ...this.
      	(*<fix_trunc_optab>v16hsf<:SVE_HSDImode>2): Replace with...
      	(*<SVE_COND_FCVTI:optab>v16hsf<SVE_F:mode>2): ...this.
      	(*<fix_trunc_optab>vnx4sf<SVE_SDI:mode>2): Replace with...
      	(*<SVE_COND_FCVTI:optab>vnx4sf<SVE_SDI:mode>2): ...this.
      	(*<fix_trunc_optab>vnx2df<SVE_SDI:mode>2): Replace with...
      	(*<SVE_COND_FCVTI:optab>vnx2df<SVE_SDI:mode>2): ...this.
      	(vec_pack_<su>fix_trunc_vnx2df): Use SVE_COND_FCVTI instead of
      	FIXUORS.
      	(<FLOATUORS:optab><v_int_equiv><SVE_F:mode>2): Replace with...
      	(<SVE_COND_ICVTF:optab><v_int_equiv><SVE_F:mode>2): ...this.
      	(*<FLOATUORS:optab><SVE_HSDI:mode>vnx8hf2): Replace with...
      	(*<SVE_COND_ICVTF:optab><SVE_HSDI:mode>vnx8hf2): ...this.
      	(*<FLOATUORS:optab><SVE_SDI:mode>vnx4sf2): Replace with...
      	(*<SVE_COND_ICVTF:optab><SVE_SDI:mode>vnx4sf2): ...this.
      	(aarch64_sve_<FLOATUORS:optab><SVE_SDI:mode>vnx2df2): Replace with...
      	(aarch64_sve_<SVE_COND_ICVTF:optab><SVE_SDI:mode>vnx2df2): ...this.
      	(vec_unpack<su_optab>_float_<perm_hilo>_vnx4si): Pass a GP strictness
      	operand to aarch64_sve_<SVE_COND_ICVTF:optab><SVE_SDI:mode>vnx2df2.
      	(vec_pack_trunc_<SVE_HSF:Vwide>, *trunc<Vwide><SVE_HSF:mode>2)
      	(aarch64_sve_extend<mode><Vwide>2): Use UNSPEC_COND_FCVT instead
      	of UNSPEC_FLOAT_CONVERT.
      	(vec_unpacks_<perm_hilo>_<mode>): Pass a GP strictness operand to
      	aarch64_sve_extend<mode><Vwide>2.
      
      From-SVN: r274423
      Richard Sandiford committed
    • re PR rtl-optimization/91154 (456.hmmer regression on Haswell caused by r272922) · c6521daa
      2019-08-14  Richard Biener  <rguenther@suse.de>
      
      	PR target/91154
      	* config/i386/i386-features.c
      	(dimode_scalar_chain::compute_convert_gain): Compute and dump
      	individual instruction gain.  Fix reg-reg copy GRP cost.  Use
      	ix86_cost->sse_op for vector instruction costs.
      
      From-SVN: r274422
      Richard Biener committed
    • [AArch64] Rework SVE FP comparisons · 4a942af6
      This patch rewrites the SVE FP comparisons so that they always use
      unspecs and so that they have an additional operand to indicate
      whether the predicate is known to be a PTRUE.  It's part of a series
      that rewrites the SVE FP patterns so that they can cope with non-PTRUE
      predicates.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/iterators.md (UNSPEC_COND_FCMUO): New unspec.
      	(cmp_op): Handle it.
      	(SVE_COND_FP_CMP): Rename to...
      	(SVE_COND_FP_CMP_I0): ...this.
      	(SVE_FP_CMP): Remove.
      	* config/aarch64/aarch64-sve.md
      	(*fcm<SVE_FP_CMP:cmp_op><SVE_F:mode>): Replace with...
      	(*fcm<SVE_COND_FP_CMP_I0:cmp_op><SVE_F:mode>): ...this new pattern,
      	using unspecs to represent the comparison.
      	(*fcmuo<SVE_F:mode>): Use UNSPEC_COND_FCMUO.
      	(*fcm<cmp_op><mode>_and_combine, *fcmuo<mode>_and_combine): Update
      	accordingly.
      	* config/aarch64/aarch64.c (aarch64_emit_sve_ptrue_op): Delete.
      	(aarch64_unspec_cond_code): Move after integer code.  Handle
      	UNORDERED.
      	(aarch64_emit_sve_predicated_cond): Replace with...
      	(aarch64_emit_sve_fp_cond): ...this new function.
      	(aarch64_emit_sve_or_conds): Replace with...
      	(aarch64_emit_sve_or_fp_conds): ...this new function.
      	(aarch64_emit_sve_inverted_cond): Replace with...
      	(aarch64_emit_sve_invert_fp_cond): ...this new function.
      	(aarch64_expand_sve_vec_cmp_float): Update accordingly.
      
      From-SVN: r274421
      Richard Sandiford committed
    • [AArch64] Add support for SVE HF vconds · a70965b1
      We were missing vcond patterns that had HF comparisons and HI or HF data.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/iterators.md (SVE_HSD): New mode iterator.
      	(V_FP_EQUIV, v_fp_equiv): Handle VNx8HI and VNx8HF.
      	* config/aarch64/aarch64-sve.md (vcond<mode><v_fp_equiv>): Use
      	SVE_HSD instead of SVE_SD.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/vcond_17.c: New test.
      	* gcc.target/aarch64/sve/vcond_17_run.c: Likewise.
      
      From-SVN: r274420
      Richard Sandiford committed
    • [AArch64] Commonise some SVE FP patterns · 0254ed79
      This patch uses a single expander for generic FP binary optabs
      that map to predicated SVE instructions.  This makes them consistent
      with the associated conditional optabs, which already work this way.
      
      The patch also generalises the division handling to be one example
      of a register-only predicated FP operation.  The ACLE patches will
      add FMULX to the same category.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      	    Kugan Vivekanandarajah  <kugan.vivekanandarajah@linaro.org>
      
      gcc/
      	* config/aarch64/iterators.md (SVE_COND_FP_BINARY_REG): New int
      	iterator.
      	(sve_pred_fp_rhs1_operand, sve_pred_fp_rhs1_operand): New int
      	attributes.
      	* config/aarch64/aarch64-sve.md (add<SVE_F:mode>3, sub<SVE_F:mode>3)
      	(mul<SVE_F:mode>3, div<SVE_F:mode>3)
      	(<SVE_COND_FP_MAXMIN_PUBLIC:optab><SVE_F:mode>3): Merge into...
      	(<SVE_COND_FP_BINARY:optab><SVE_F:mode>3): ...this new expander.
      	(*div<SVE_F:mode>3): Generalize to...
      	(*<SVE_COND_FP_BINARY:optab><SVE_F:mode>3): ...this.
      
      Co-Authored-By: Kugan Vivekanandarajah <kuganv@linaro.org>
      
      From-SVN: r274419
      Richard Sandiford committed
    • [AArch64] Add a "GP strictness" operand to SVE FP unspecs · c9c5a809
      This patch makes the SVE unary, binary and ternary FP unspecs
      take a new "GP strictness" operand that indicates whether the
      predicate has to be taken literally, or whether it is valid to
      make extra lanes active (up to and including using a PTRUE).
      
      This again is laying the groundwork for the ACLE patterns,
      in which the value can depend on the FP command-line flags.
      
      At the moment it's only needed for addition, subtraction and
      multiplication, which have unpredicated forms that can only
      be used when operating on all lanes is safe.  But in future
      it might be useful for optimising predicate usage.
      
      The strict mode requires extra alternatives for addition,
      subtraction and multiplication, but I've left those for the
      main ACLE patch.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      	    Kugan Vivekanandarajah  <kugan.vivekanandarajah@linaro.org>
      
      gcc/
      	* config/aarch64/aarch64.md (SVE_RELAXED_GP, SVE_STRICT_GP): New
      	constants.
      	* config/aarch64/predicates.md (aarch64_sve_gp_strictness): New
      	predicate.
      	* config/aarch64/aarch64-protos.h (aarch64_sve_pred_dominates_p):
      	Declare.
      	* config/aarch64/aarch64.c (aarch64_sve_pred_dominates_p): New
      	function.
      	* config/aarch64/aarch64-sve.md: Add a block comment about the
      	handling of predicated FP operations.
      	(<SVE_COND_FP_UNARY:optab><SVE_F:mode>2, add<SVE_F:mode>3)
      	(sub<SVE_F:mode>3, mul<SVE_F:mode>3, div<SVE_F:mode>3)
      	(<SVE_COND_FP_MAXMIN_PUBLIC:optab><SVE_F:mode>3)
      	(<SVE_COND_FP_MAXMIN_PUBLIC:maxmin_uns><SVE_F:mode>3)
      	(<SVE_COND_FP_TERNARY:optab><SVE_F:mode>4): Add an SVE_RELAXED_GP
      	operand.
      	(cond_<SVE_COND_FP_BINARY:optab><SVE_F:mode>)
      	(cond_<SVE_COND_FP_TERNARY:optab><SVE_F:mode>): Add an SVE_STRICT_GP
      	operand.
      	(*<SVE_COND_FP_UNARY:optab><SVE_F:mode>2)
      	(*cond_<SVE_COND_FP_BINARY:optab><SVE_F:mode>_2)
      	(*cond_<SVE_COND_FP_BINARY:optab><SVE_F:mode>_3)
      	(*cond_<SVE_COND_FP_BINARY:optab><SVE_F:mode>_any)
      	(*fabd<SVE_F:mode>3, *div<SVE_F:mode>3)
      	(*<SVE_COND_FP_MAXMIN_PUBLIC:optab><SVE_F:mode>3)
      	(*<SVE_COND_FP_TERNARY:optab><SVE_F:mode>4)
      	(*cond_<SVE_COND_FP_TERNARY:optab><SVE_F:mode>_2)
      	(*cond_<SVE_COND_FP_TERNARY:optab><SVE_F:mode>_4)
      	(*cond_<SVE_COND_FP_TERNARY:optab><SVE_F:mode>_any): Match the
      	strictness operands.  Use aarch64_sve_pred_dominates_p to check
      	whether the predicate on the conditional operation is suitable
      	for merging.  Split patterns into the canonical equal-predicate form.
      	(*add<SVE_F:mode>3, *sub<SVE_F:mode>3, *mul<SVE_F:mode>3): Likewise.
      	Restrict the unpredicated alternatives to SVE_RELAXED_GP.
      
      Co-Authored-By: Kugan Vivekanandarajah <kuganv@linaro.org>
      
      From-SVN: r274418
      Richard Sandiford committed
    • [AArch64] Use unspecs for remaining SVE FP binary ops · 6fe679cc
      Another patch in the series to make the SVE FP patterns use unspecs,
      so that they can accurately describe cases in which the predicate
      isn't a PTRUE.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      	    Kugan Vivekanandarajah  <kugan.vivekanandarajah@linaro.org>
      
      gcc/
      	* config/aarch64/aarch64-sve.md (add<mode>3, *add<mode>3)
      	(sub<mode>3, *sub<mode>3, *fabd<mode>3, mul<mode>3, *mul<mode>3)
      	(div<mode>3, *div<mode>3): Use SVE_COND_FP_* unspecs instead of
      	rtx codes.
      	(cond_<optab><mode>, *cond_<optab><mode>_2, *cond_<optab><mode>_3)
      	(*cond_<optab><mode>_any): Add the predicate to the SVE_COND_FP_*
      	unspecs.
      
      Co-Authored-By: Kugan Vivekanandarajah <kuganv@linaro.org>
      
      From-SVN: r274417
      Richard Sandiford committed
    • [AArch64] Don't rely on REG_EQUAL notes to combine SVE BIC · 35d6c591
      This patch generalises the SVE BIC pattern so that it doesn't
      rely on REG_EQUAL notes.  The danger with relying on the notes
      is that an optimisation could for example replace the original
      (not ...) note with an (unspec ... UNSPEC_MERGE_PTRUE) in which
      the predicate is a constant.  That's a legitimate change and
      could even be useful in some situations.
      
      The patch also makes the operand order match the SVE operand order in
      both the vector and predicate BIC patterns, which makes things easier
      for the ACLE.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      	    Kugan Vivekanandarajah  <kugan.vivekanandarajah@linaro.org>
      
      gcc/
      	* config/aarch64/aarch64-sve.md (bic<mode>3): Rename to...
      	(*bic<SVE_I:mode>3): ...this.  Match the form that an SVE inverse
      	actually has, rather than relying on REG_EQUAL notes.
      	Make the insn operand order match the SVE operand order.
      	(*<nlogical><PRED_ALL:mode>3): Make the insn operand order match
      	the SVE operand order.
      
      Co-Authored-By: Kugan Vivekanandarajah <kuganv@linaro.org>
      
      From-SVN: r274416
      Richard Sandiford committed
    • [AArch64] Canonicalise SVE predicate constants · 678faefc
      This patch makes sure that we build all SVE predicate constants as
      VNx16BI before RA, to encourage similar constants to be reused
      between modes.  This is also useful for the ACLE, where the single
      predicate type svbool_t is always a VNx16BI.
      
      Also, and again to encourage reuse, the patch makes us use a .B PTRUE
      for all ptrue-predicated operations, rather than (for example) using
      a .S PTRUE for 32-bit operations and a .D PTRUE for 64-bit operations.
      
      The only current case in which a .H, .S or .D operation needs to be
      predicated by a "strict" .H/.S/.D PTRUE is the PTEST in a conditional
      branch, which an earlier patch fixed to use an appropriate VNx16BI
      constant.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/aarch64.c (aarch64_target_reg): New function.
      	(aarch64_emit_set_immediate): Likewise.
      	(aarch64_ptrue_reg): Build a VNx16BI constant and then bitcast it.
      	(aarch64_pfalse_reg): Likewise.
      	(aarch64_convert_sve_data_to_pred): New function.
      	(aarch64_sve_move_pred_via_while): Take an optional target register
      	and the required register mode.
      	(aarch64_expand_sve_const_pred_1): New function.
      	(aarch64_expand_sve_const_pred): Likewise.
      	(aarch64_expand_mov_immediate): Build an all-true predicate
      	if the significant bits of the immediate are all true.  Use
      	aarch64_expand_sve_const_pred for all compile-time predicate constants.
      	(aarch64_mov_operand_p): Force predicate constants to be VNx16BI
      	before register allocation.
      	* config/aarch64/aarch64-sve.md (*vec_duplicate<mode>_reg): Use
      	a VNx16BI PTRUE when splitting the memory alternative.
      	(vec_duplicate<mode>): Update accordingly.
      	(*pred_cmp<cmp_op><mode>): Rename to...
      	(@aarch64_pred_cmp<cmp_op><mode>): ...this.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/spill_4.c: Expect all ptrues to be .Bs.
      	* gcc.target/aarch64/sve/single_1.c: Likewise.
      	* gcc.target/aarch64/sve/single_2.c: Likewise.
      	* gcc.target/aarch64/sve/single_3.c: Likewise.
      	* gcc.target/aarch64/sve/single_4.c: Likewise.
      
      From-SVN: r274415
      Richard Sandiford committed
    • [AArch64] Rework SVE PTEST patterns · 34467289
      This patch reworks the rtl representation of the SVE PTEST operation
      so that:
      
      - the governing predicate is always VNx16BI (and so all bits are defined)
      
      - it is still possible to pattern-match the governing predicate in the
        mode that it had previously
      
      - a new hint operand says whether the governing predicate is known to be
        all true for the element size of interest, rather than this being part
        of the unspec name.
      
      These changes make it easier to handle more flag-setting instructions
      as part of the ACLE work.
      
      See the comment in aarch64-sve.md for more details.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/aarch64-protos.h (aarch64_ptrue_all): Declare.
      	* config/aarch64/aarch64.c (aarch64_ptrue_all): New function.
      	* config/aarch64/aarch64.md (UNSPEC_PTEST_PTRUE): Delete.
      	(UNSPEC_PTEST): New unspec.
      	(SVE_MAYBE_NOT_PTRUE, SVE_KNOWN_PTRUE): New constants.
      	* config/aarch64/iterators.md (data_bytes): New mode attribute.
      	* config/aarch64/predicates.md (aarch64_sve_ptrue_flag): New predicate.
      	* config/aarch64/aarch64-sve.md: Add a new section describing the
      	handling of UNSPEC_PTEST.
      	(pred_<LOGICAL:optab><PRED_ALL:mode>3): Rename to...
      	(@aarch64_pred_<LOGICAL:optab><PRED_ALL:mode>_z): ...this.
      	(ptest_ptrue<mode>): Replace with...
      	(aarch64_ptest<mode>): ...this new pattern.
      	(cbranch<mode>4): Update after above changes.
      	(*<LOGICAL:optab><PRED_ALL:mode>3_cc): Use UNSPEC_PTEST instead of
      	UNSPEC_PTEST_PTRUE.
      	(*cmp<SVE_INT_CMP:cmp_op><SVE_I:mode>_cc): Likewise.
      	(*cmp<SVE_INT_CMP:cmp_op><SVE_I:mode>_ptest): Likewise.
      	(*while_ult<GPI:mode><PRED_ALL:mode>_cc): Likewise.
      
      From-SVN: r274414
      Richard Sandiford committed
    • re PR fortran/87991 (ICE in gfc_constructor_append_expr, at fortran/constructor.c:135) · ade8fdbb
      2019-08-13  Steven G. Kargl  <kargl@gcc.gnu.org>
      
      	PR fortran/87991
      	* resolve.c (check_data_variable): data-stmt-object with pointer
      	attribute requires a data-stmt-value with the target attribute.
       
      2019-08-13  Steven G. Kargl  <kargl@gcc.gnu.org>
      
      	PR fortran/87991
      	* gfortran.dg/pr87991.f90: New test.
      
      From-SVN: r274412
      Steven G. Kargl committed
    • Enable math functions linking with static library for LTO · 5747e0c0
      In LTO mode, if static library and dynamic library contains same
      function and both libraries are passed as arguments, linker will link
      the function in dynamic library no matter the sequence.  This patch
      will output LTO symbol node as UNDEF if BUILT_IN_NORMAL function FNDECL
      is a math function, then the function in static library will be linked
      first if its sequence is ahead of the dynamic library.
      
      gcc/ChangeLog
      
      2019-08-14  Xiong Hu Luo  <luoxhu@linux.ibm.com>
      
      	PR lto/91287
      	* builtins.c (builtin_with_linkage_p): New function.
      	* builtins.h (builtin_with_linkage_p): New function.
      	* symtab.c (write_symbol): Remove redundant assert.
      	* lto-streamer-out.c (symtab_node::output_to_lto_symbol_table_p):
      	Remove FIXME and use builtin_with_linkage_p.
      
      From-SVN: r274411
      Xiong Hu Luo committed
    • Daily bump. · 37987c39
      From-SVN: r274410
      GCC Administrator committed
  2. 13 Aug, 2019 9 commits
    • Use checking forms of DECL_FUNCTION_CODE (PR 91421) · 4d732405
      We were shoe-horning all built-in enumerations (including frontend
      and target-specific ones) into a field of type built_in_function.  This
      was accessed as either an lvalue or an rvalue using DECL_FUNCTION_CODE.
      
      The obvious danger with this (as was noted by several ??? comments)
      is that the ranges have nothing to do with each other, and targets can
      easily have more built-in functions than generic code.  But my patch to
      make the field bigger was the straw that finally made the problem visible.
      
      This patch therefore:
      
      - replaces the field with a plain unsigned int
      
      - turns DECL_FUNCTION_CODE into an rvalue-only accessor that checks
        that the function really is BUILT_IN_NORMAL
      
      - adds corresponding DECL_MD_FUNCTION_CODE and DECL_FE_FUNCTION_CODE
        accessors for BUILT_IN_MD and BUILT_IN_FRONTEND respectively
      
      - adds DECL_UNCHECKED_FUNCTION_CODE for places that need to access the
        underlying field (should be low-level code only)
      
      - adds new helpers for setting the built-in class and function code
      
      - makes DECL_BUILT_IN_CLASS an rvalue-only accessor too, since all
        assignments should go through the new helpers
      
      2019-08-13  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	PR middle-end/91421
      	* tree-core.h (function_decl::function_code): Change type to
      	unsigned int.
      	* tree.h (DECL_FUNCTION_CODE): Rename old definition to...
      	(DECL_UNCHECKED_FUNCTION_CODE): ...this.
      	(DECL_BUILT_IN_CLASS): Make an rvalue macro only.
      	(DECL_FUNCTION_CODE): New function.  Assert that the built-in class
      	is BUILT_IN_NORMAL.
      	(DECL_MD_FUNCTION_CODE, DECL_FE_FUNCTION_CODE): New functions.
      	(set_decl_built_in_function, copy_decl_built_in_function): Likewise.
      	(fndecl_built_in_p): Change the type of the "name" argument to
      	unsigned int.
      	* builtins.c (expand_builtin): Move DECL_FUNCTION_CODE use
      	after check for DECL_BUILT_IN_CLASS.
      	* cgraphclones.c (build_function_decl_skip_args): Use
      	set_decl_built_in_function.
      	* ipa-param-manipulation.c (ipa_modify_formal_parameters): Likewise.
      	* ipa-split.c (split_function): Likewise.
      	* langhooks.c (add_builtin_function_common): Likewise.
      	* omp-simd-clone.c (simd_clone_create): Likewise.
      	* tree-streamer-in.c (unpack_ts_function_decl_value_fields): Likewise.
      	* config/darwin.c (darwin_init_cfstring_builtins): Likewise.
      	(darwin_fold_builtin): Use DECL_MD_FUNCTION_CODE instead of
      	DECL_FUNCTION_CODE.
      	* fold-const.c (operand_equal_p): Compare DECL_UNCHECKED_FUNCTION_CODE
      	instead of DECL_FUNCTION_CODE.
      	* lto-streamer-out.c (hash_tree): Use DECL_UNCHECKED_FUNCTION_CODE
      	instead of DECL_FUNCTION_CODE.
      	* tree-streamer-out.c (pack_ts_function_decl_value_fields): Likewise.
      	* print-tree.c (print_node): Use DECL_MD_FUNCTION_CODE when
      	printing DECL_BUILT_IN_MD.  Handle DECL_BUILT_IN_FRONTEND.
      	* config/aarch64/aarch64-builtins.c (aarch64_expand_builtin)
      	(aarch64_fold_builtin, aarch64_gimple_fold_builtin): Use
      	DECL_MD_FUNCTION_CODE instead of DECL_FUNCTION_CODE.
      	* config/aarch64/aarch64.c (aarch64_builtin_reciprocal): Likewise.
      	* config/alpha/alpha.c (alpha_expand_builtin, alpha_fold_builtin):
      	(alpha_gimple_fold_builtin): Likewise.
      	* config/arc/arc.c (arc_expand_builtin): Likewise.
      	* config/arm/arm-builtins.c (arm_expand_builtin): Likewise.
      	* config/avr/avr-c.c (avr_resolve_overloaded_builtin): Likewise.
      	* config/avr/avr.c (avr_expand_builtin, avr_fold_builtin): Likewise.
      	* config/bfin/bfin.c (bfin_expand_builtin): Likewise.
      	* config/c6x/c6x.c (c6x_expand_builtin): Likewise.
      	* config/frv/frv.c (frv_expand_builtin): Likewise.
      	* config/gcn/gcn.c (gcn_expand_builtin_1): Likewise.
      	(gcn_expand_builtin): Likewise.
      	* config/i386/i386-builtins.c (ix86_builtin_reciprocal): Likewise.
      	(fold_builtin_cpu): Likewise.
      	* config/i386/i386-expand.c (ix86_expand_builtin): Likewise.
      	* config/i386/i386.c (ix86_fold_builtin): Likewise.
      	(ix86_gimple_fold_builtin): Likewise.
      	* config/ia64/ia64.c (ia64_fold_builtin): Likewise.
      	(ia64_expand_builtin): Likewise.
      	* config/iq2000/iq2000.c (iq2000_expand_builtin): Likewise.
      	* config/mips/mips.c (mips_expand_builtin): Likewise.
      	* config/msp430/msp430.c (msp430_expand_builtin): Likewise.
      	* config/nds32/nds32-intrinsic.c (nds32_expand_builtin_impl): Likewise.
      	* config/nios2/nios2.c (nios2_expand_builtin): Likewise.
      	* config/nvptx/nvptx.c (nvptx_expand_builtin): Likewise.
      	* config/pa/pa.c (pa_expand_builtin): Likewise.
      	* config/pru/pru.c (pru_expand_builtin): Likewise.
      	* config/riscv/riscv-builtins.c (riscv_expand_builtin): Likewise.
      	* config/rs6000/rs6000-c.c (altivec_resolve_overloaded_builtin):
      	Likewise.
      	* config/rs6000/rs6000-call.c (htm_expand_builtin): Likewise.
      	(altivec_expand_dst_builtin, altivec_expand_builtin): Likewise.
      	(rs6000_gimple_fold_builtin, rs6000_expand_builtin): Likewise.
      	* config/rs6000/rs6000.c (rs6000_builtin_md_vectorized_function)
      	(rs6000_builtin_reciprocal): Likewise.
      	* config/rx/rx.c (rx_expand_builtin): Likewise.
      	* config/s390/s390-c.c (s390_resolve_overloaded_builtin): Likewise.
      	* config/s390/s390.c (s390_expand_builtin): Likewise.
      	* config/sh/sh.c (sh_expand_builtin): Likewise.
      	* config/sparc/sparc.c (sparc_expand_builtin): Likewise.
      	(sparc_fold_builtin): Likewise.
      	* config/spu/spu-c.c (spu_resolve_overloaded_builtin): Likewise.
      	* config/spu/spu.c (spu_expand_builtin): Likewise.
      	* config/stormy16/stormy16.c (xstormy16_expand_builtin): Likewise.
      	* config/tilegx/tilegx.c (tilegx_expand_builtin): Likewise.
      	* config/tilepro/tilepro.c (tilepro_expand_builtin): Likewise.
      	* config/xtensa/xtensa.c (xtensa_fold_builtin): Likewise.
      	(xtensa_expand_builtin): Likewise.
      
      gcc/ada/
      	PR middle-end/91421
      	* gcc-interface/trans.c (gigi): Call set_decl_buillt_in_function.
      	(Call_to_gnu): Use DECL_FE_FUNCTION_CODE instead of DECL_FUNCTION_CODE.
      
      gcc/c/
      	PR middle-end/91421
      	* c-decl.c (merge_decls): Use copy_decl_built_in_function.
      
      gcc/c-family/
      	PR middle-end/91421
      	* c-common.c (resolve_overloaded_builtin): Use
      	copy_decl_built_in_function.
      
      gcc/cp/
      	PR middle-end/91421
      	* decl.c (duplicate_decls):  Use copy_decl_built_in_function.
      	* pt.c (declare_integer_pack): Use set_decl_built_in_function.
      
      gcc/d/
      	PR middle-end/91421
      	* intrinsics.cc (maybe_set_intrinsic): Use set_decl_built_in_function.
      
      gcc/jit/
      	PR middle-end/91421
      	* jit-playback.c (new_function): Use set_decl_built_in_function.
      
      gcc/lto/
      	PR middle-end/91421
      	* lto-common.c (compare_tree_sccs_1): Use DECL_UNCHECKED_FUNCTION_CODE
      	instead of DECL_FUNCTION_CODE.
      	* lto-symtab.c (lto_symtab_merge_p): Likewise.
      
      From-SVN: r274404
      Richard Sandiford committed
    • Protect some checks of DECL_FUNCTION_CODE · cb1180d5
      This patch protects various uses of DECL_FUNCTION_CODE that didn't
      obviously check for BUILT_IN_NORMAL first (either directly or in callers).
      They could therefore trigger for functions that either aren't built-ins
      or are a different kind of built-in.
      
      Also, the patch removes a redundant GIMPLE_CALL check from
      optimize_stdarg_builtin, since it gave the impression that the stmt
      was less well checked than it actually is.
      
      2019-08-13  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	PR middle-end/91421
      	* attribs.c (decl_attributes): Check the DECL_BUILT_IN_CLASS
      	before the DECL_FUNCTION_CODE.
      	* calls.c (maybe_warn_alloc_args_overflow): Use fndecl_built_in_p
      	to check for a BUILT_IN_ALLOCA call.
      	* ipa-cp.c (ipa_get_indirect_edge_target_1): Likewise for
      	BUILT_IN_UNREACHABLE.  Don't check for a FUNCTION_TYPE.
      	* ipa-devirt.c (possible_polymorphic_call_target_p): Likewise.
      	* ipa-prop.c (try_make_edge_direct_virtual_call): Likewise.
      	* gimple-ssa-isolate-paths.c (is_addr_local): Check specifically
      	for BUILT_IN_NORMAL functions.
      	* trans-mem.c (expand_block_edges): Use gimple_call_builtin_p to
      	test for BUILT_IN_TM_ABORT.
      	* tree-ssa-ccp.c (optimize_stack_restore): Use fndecl_built_in_p
      	to check for a BUILT_IN_STACK_RESTORE call.
      	(optimize_stdarg_builtin): Remove redundant check for GIMPLE_CALL.
      	* tree-ssa-threadedge.c
      	(record_temporary_equivalences_from_stmts_at_dest): Check for a
      	BUILT_IN_NORMAL decl before checking its DECL_FUNCTION_CODE.
      	* tree-vect-patterns.c (vect_recog_pow_pattern): Use a positive
      	test for a BUILT_IN_NORMAL call instead of a negative test for
      	an internal function call.
      
      gcc/c/
      	PR middle-end/91421
      	* c-decl.c (header_for_builtin_fn): Take a FUNCTION_DECL instead
      	of a built_in_function.
      	(diagnose_mismatched_decls, implicitly_declare): Update accordingly.
      
      From-SVN: r274403
      Richard Sandiford committed
    • Optimise constant IFN_WHILE_ULTs · 0b1fe8cf
      This patch is a combination of two changes that have to be
      committed as a single unit:
      
      (1) Try to fold IFN_WHILE_ULTs with constant arguments to a VECTOR_CST
          (which is always possible for fixed-length vectors but is not
          necessarily so for variable-length vectors)
      
      (2) Make the SVE port recognise constants that map to PTRUE VLn,
          which includes those generated by the new fold.
      
      (2) can't be tested without (1) and (1) would be a significant
      pessimisation without (2).
      
      The target-specific parts also start moving towards doing predicate
      manipulation in a canonical VNx16BImode form, using rtx_vector_builders.
      
      2019-08-13  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree.h (build_vector_a_then_b): Declare.
      	* tree.c (build_vector_a_then_b): New function.
      	* fold-const-call.c (fold_while_ult): Likewise.
      	(fold_const_call): Use it to handle IFN_WHILE_ULT.
      	* config/aarch64/aarch64-protos.h (AARCH64_FOR_SVPATTERN): New macro.
      	(aarch64_svpattern): New enum.
      	* config/aarch64/aarch64-sve.md (mov<PRED_ALL:mode>): Pass
      	constants through aarch64_expand_mov_immediate.
      	(*aarch64_sve_mov<PRED_ALL:mode>): Use aarch64_mov_operand rather
      	than general_operand as the predicate for operand 1.
      	(while_ult<GPI:mode><PRED_ALL:mode>): Add a '@' marker.
      	* config/aarch64/aarch64.c (simd_immediate_info::PTRUE): New
      	insn_type.
      	(simd_immediate_info::simd_immediate_info): New overload that
      	takes a scalar_int_mode and an svpattern.
      	(simd_immediate_info::u): Add a "pattern" field.
      	(svpattern_token): New function.
      	(aarch64_get_sve_pred_bits, aarch64_widest_sve_pred_elt_size)
      	(aarch64_partial_ptrue_length, aarch64_svpattern_for_vl)
      	(aarch64_sve_move_pred_via_while): New functions.
      	(aarch64_expand_mov_immediate): Try using
      	aarch64_sve_move_pred_via_while for predicates that contain N ones
      	followed by M zeros but that do not correspond to a VLnnn pattern.
      	(aarch64_sve_pred_valid_immediate): New function.
      	(aarch64_simd_valid_immediate): Use it instead of dealing directly
      	with PTRUE and PFALSE.
      	(aarch64_output_sve_mov_immediate): Handle new simd_immediate_info
      	forms.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/spill_2.c: Increase iteration counts
      	beyond the range of a PTRUE.
      	* gcc.target/aarch64/sve/while_6.c: New test.
      	* gcc.target/aarch64/sve/while_7.c: Likewise.
      	* gcc.target/aarch64/sve/while_8.c: Likewise.
      	* gcc.target/aarch64/sve/while_9.c: Likewise.
      	* gcc.target/aarch64/sve/while_10.c: Likewise.
      
      From-SVN: r274402
      Richard Sandiford committed
    • re PR fortran/88072 (gfortran crashes with an internal compiler error) · abb1d111
      2019-08-13  Steven G. Kargl  <kargl@gcc.gnu.org> 
      
      	PR fortran/88072
      	* gfortran.dg/unlimited_polymorphic_28.f90: Fix error message.  Left
      	out of previous commit!
      
      From-SVN: r274400
      Steven G. Kargl committed
    • re PR fortran/88072 (gfortran crashes with an internal compiler error) · 34342ea3
      2019-08-13  Steven G. Kargl  <kargl@gcc.gnu.org>
      
      	PR fortran/88072
      	* misc.c (gfc_typename): Do not point to something that ought not to 
      	be pointed at.
      
      2019-08-13  Steven G. Kargl  <kargl@gcc.gnu.org>
      
      	PR fortran/88072
      	* gfortran.dg/pr88072.f90: New test.
      	* gfortran.dg/unlimited_polymorphic_28.f90: Fix error message.
      
      From-SVN: r274399
      Steven G. Kargl committed
    • [Darwin] There is no need to distinguish PIC/non-PIC symbol stubs. · d308419c
      So we can use a single flag for both, and rename this now, before a confusing
      name gets into the wild.
      
      gcc/
      
      2019-08-13 Iain Sandoe <iain@sandoe.co.uk>
      
      	* config/darwin.c (machopic_indirect_call_target): Rename symbol stub
      	flag.
      	(darwin_override_options): Likewise.
      	* config/darwin.h: Likewise.
      	* config/darwin.opt: Likewise.
      	* config/i386/i386.c (output_pic_addr_const): Likewise.
      	* config/rs6000/darwin.h: Likewise.
      	* config/rs6000/rs6000.c (rs6000_call_darwin_1): Likewise.
      	* config/i386/darwin.h (TARGET_MACHO_PICSYM_STUBS): Rename to ...
      	... this TARGET_MACHO_SYMBOL_STUBS.
      	(FUNCTION_PROFILER):Likewise.
      	* config/i386/i386.h: Likewise.
      
      gcc/testsuite/
      
      2019-08-13  Iain Sandoe  <iain@sandoe.co.uk>
      
      	* obj-c++.dg/stubify-1.mm: Rename symbol stub option.
      	* obj-c++.dg/stubify-2.mm: Likewise.
      	* objc.dg/stubify-1.m: Likewise.
      	* objc.dg/stubify-2.m: Likewise.
      
      From-SVN: r274397
      Iain Sandoe committed
    • re PR fortran/90563 (Out of bounds error when compiling with -Wextra) · 20ac6454
      2013-08-13  Thomas Koenig  <tkoenig@gcc.gnu.org>
      
      	PR fortran/90563
      	* gfortran.dg/do_subsript_5.f90: Correct test.
      
      From-SVN: r274396
      Thomas Koenig committed
    • re PR fortran/90563 (Out of bounds error when compiling with -Wextra) · 35ca2d4e
      2013-08-13  Thomas Koenig  <tkoenig@gcc.gnu.org>
      
      	PR fortran/90563
      	* frontend-passes.c (insert_index): Suppress errors while
      	simplifying the resulting expression.
      
      2013-08-13  Thomas Koenig  <tkoenig@gcc.gnu.org>
      
      	PR fortran/90563
      	* gfortran.dg/do_subsript_5.f90: New test.
      
      From-SVN: r274394
      Thomas Koenig committed
    • re PR fortran/89647 (Host associated procedure unable to be used as binding target) · eabd9d91
      2019-08-13  Steven G. Kargl  <kargl@gcc.gnu.org>
      
      	PR fortran/89647
      	resolve.c (resolve_typebound_procedure): Allow host associated 
      	procedure to be a binding target.  While here, wrap long line.
      
      2019-08-13  Steven G. Kargl  <kargl@gcc.gnu.org>
      
      	PR fortran/89647
      	* gfortran.dg/pr89647.f90: New test.
      
      From-SVN: r274393
      Steven G. Kargl committed