1. 16 Aug, 2019 1 commit
  2. 15 Aug, 2019 39 commits
    • re PR fortran/91443 (-Wargument-mismatch does not catch mismatch for global procedure) · fb078366
      2019-08-15  Thomas Koenig  <tkoenig@gcc.gnu.org>
      
      	PR fortran/91443
      	* frontend-passes.c (check_externals_expr): New function.
      	(check_externals_code): New function.
      	(gfc_check_externals): New function.
      	* gfortran.h (debug): Add prototypes for gfc_symbol * and
      	gfc_expr *.
      	(gfc_check_externals): Add prototype.
      	* interface.c (compare_actual_formal): Do not complain about
      	alternate returns if the formal argument is optional.
      	(gfc_procedure_use): Handle cases when an error has been issued
      	previously.  Break long line.
      	* parse.c (gfc_parse_file): Call gfc_check_externals for all
      	external procedures.
      	* resolve.c (resolve_global_procedure): Remove checking of
      	argument list.
      
      2019-08-15  Thomas Koenig  <tkoenig@gcc.gnu.org>
      
      	PR fortran/91443
      	* gfortran.dg/argument_checking_19.f90: New test.
      	* gfortran.dg/altreturn_10.f90: Change dg-warning to dg-error.
      	* gfortran.dg/dec_union_11.f90: Add -std=legacy.
      	* gfortran.dg/hollerith8.f90: Likewise. Remove warning for
      	Hollerith constant.
      	* gfortran.dg/integer_exponentiation_2.f90: New subroutine gee_i8;
      	use it to avoid type mismatches.
      	* gfortran.dg/pr41011.f: Add -std=legacy.
      	* gfortran.dg/whole_file_1.f90: Change warnings to errors.
      	* gfortran.dg/whole_file_2.f90: Likewise.
      
      From-SVN: r274551
      Thomas Koenig committed
    • PR c++/90393 - ICE with thow in ?: · 7148dede
      My previous patch for 64372 was incomplete: it only stopped making the
      non-throw argument into an rvalue, lvalue_kind still considered the ?:
      expression to be an rvalue, leaving us worse than before.
      
      	PR c++/64372, DR 1560 - Gratuitous lvalue-to-rvalue conversion in ?:
      	* tree.c (lvalue_kind): Handle throw in one arm.
      	* typeck.c (rationalize_conditional_expr): Likewise.
      	(cp_build_modify_expr): Likewise.
      
      From-SVN: r274550
      Jason Merrill committed
    • i386: Separate costs of pseudo registers from hard registers · d321551c
      processor_costs has costs of RTL expressions with pseudo registers and
      and costs of hard register moves:
      
      1. Costs of RTL expressions are used to generate the most efficient RTL
      operations with pseudo registers.
      
      2. Costs of hard register moves are used by register allocator to
      decide how to allocate and move hard registers.
      
      Since relative costs of pseudo register load and store versus pseudo
      register moves in RTL expressions can be different from relative costs
      of hard registers, we should separate costs of RTL expressions with
      pseudo registers from costs of hard registers so that register allocator
      and RTL expressions can be improved independently.
      
      This patch moves costs of hard register moves to the new hard_register
      field and duplicates costs of moves which are also used for costs of RTL
      expressions.
      
      	PR target/90878
      	* config/i386/i386.c (inline_memory_move_cost): Use hard_register
      	for costs of hard register moves.
      	(ix86_register_move_cost): Likewise.
      	* config/i386/i386.h (processor_costs): Move costs of hard
      	register moves to hard_register.  Add int_load, int_store,
      	xmm_move, ymm_move, zmm_move, sse_to_integer, integer_to_sse,
      	sse_load, sse_store, sse_unaligned_load and sse_unaligned_store
      	for costs of RTL expressions.
      	* config/i386/x86-tune-costs.h: Move costs of hard register
      	moves to hard_register.  Duplicate int_load, int_store,
      	xmm_move, ymm_move, zmm_move, sse_to_integer, integer_to_sse,
      	sse_load, sse_store for costs of RTL expressions.
      
      From-SVN: r274543
      H.J. Lu committed
    • PR libstdc++/91456 make INVOKE<R> work with uncopyable prvalues · d91f618d
      In C++17 a function can return a prvalue of a type that cannot be moved
      or copied. The current implementation of std::is_invocable_r uses
      std::is_convertible to test the conversion to R required by INVOKE<R>.
      That fails for non-copyable prvalues, because std::is_convertible is
      defined in terms of std::declval which uses std::add_rvalue_reference.
      In C++17 conversion from R to R involves no copies and so is not the
      same as conversion from R&& to R.
      
      This commit changes std::is_invocable_r to check the conversion without
      using std::is_convertible.
      
      std::function also contains a similar check using std::is_convertible,
      which can be fixed by simply reusing std::is_invocable_r (but because
      std::is_invocable_r is not defined for C++11 it uses the underlying
      std::__is_invocable_impl trait directly).
      
      	PR libstdc++/91456
      	* include/bits/std_function.h (__check_func_return_type): Remove.
      	(function::_Callable): Use std::__is_invocable_impl instead of
      	__check_func_return_type.
      	* include/std/type_traits (__is_invocable_impl): Add another defaulted
      	template parameter. Define a separate partial specialization for
      	INVOKE and INVOKE<void>. For INVOKE<R> replace is_convertible check
      	with a check that models delayed temporary materialization.
      	* testsuite/20_util/function/91456.cc: New test.
      	* testsuite/20_util/is_invocable/91456.cc: New test.
      
      From-SVN: r274542
      Jonathan Wakely committed
    • Add r274540 to LOCAL_PATCHES. · b3595983
      2019-08-15  Martin Liska  <mliska@suse.cz>
      
      	* LOCAL_PATCHES: Add r274540
      
      From-SVN: r274541
      Martin Liska committed
    • Reapply missing patch for libsanitizer. · 71e895b1
      2019-08-15  Martin Liska  <mliska@suse.cz>
      
      	* tsan/tsan_rtl_ppc64.S: Reapply.
      
      From-SVN: r274540
      Martin Liska committed
    • Remove TARGET_SETUP_INCOMING_VARARG_BOUNDS · 06b5889c
      TARGET_SETUP_INCOMING_VARARG_BOUNDS seems to be an unused vestige of the
      MPX support.
      
      2019-08-15  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* target.def (setup_incoming_vararg_bounds): Remove.
      	* doc/tm.texi.in (TARGET_SETUP_INCOMING_VARARG_BOUNDS): Remove.
      	* doc/tm.texi: Regenerate.
      	* targhooks.c (default_setup_incoming_vararg_bounds): Delete.
      	* targhooks.h (default_setup_incoming_vararg_bounds): Likewise.
      	* config/i386/i386.c (ix86_setup_incoming_vararg_bounds): Likewise.
      	(TARGET_SETUP_INCOMING_VARARG_BOUNDS): Likewise.
      
      From-SVN: r274539
      Richard Sandiford committed
    • [libsanitizer] Fix PR bootstrap/91455 · 8bc1fac7
      If a target does not support libbacktrace, it might still the include
      for $(top_srcdir).
      
      Regenerate the built files using automake-1.15.1
      
      libsanitizer/
      
      2019-08-15  Iain Sandoe  <iain@sandoe.co.uk>
      
      	PR bootstrap/91455
      	* Makefile.in: Regenerated.
      	* aclocal.m4: Likewise.
      	* asan/Makefile.in: Likewise.
      	* configure: Likewise.
      	* interception/Makefile.in: Likewise.
      	* libbacktrace/Makefile.in: Likewise.
      	* lsan/Makefile.in: Likewise.
      	* sanitizer_common/Makefile.am: Include top_srcdir unconditionally.
      	* sanitizer_common/Makefile.in: Regenerated.
      	* tsan/Makefile.in: Likewise.
      	* ubsan/Makefile.in: Likewise.
      
      From-SVN: r274538
      Iain Sandoe committed
    • MSP430: Fix lines over 80 characters long in config/msp430/*.{c,h} files · 43bfd4e8
      2019-08-15  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
      
      	MSP430: Fix lines over 80 characters long in
      	config/msp430/*.{c,h} files
      
      	* config/msp430/driver-msp430.c (msp430_select_cpu): Fix format
      	specifier in string.
      	(msp430_select_hwmult_lib): Split line more than 80 characters long.
      	* config/msp430/msp430-devices.c (msp430_extract_mcu_data): Remove
      	redundant old comment.
      	* config/msp430/msp430-protos.h (msp430_output_aligned_decl_common):
      	Split line more than 80 characters long.
      	* config/msp430/msp430.c (msp430_option_override): Likewise.
      	(msp430_return_in_memory): Likewise.
      	(msp430_gimplify_va_arg_expr): Likewise.
      	(TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P): Likewise.
      	(msp430_legitimate_constant): Likewise.
      	(TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS): Likewise.
      	(msp430_attr): Likewise.
      	(msp430_data_attr): Likewise.
      	(msp430_start_function): Likewise.
      	(gen_prefix): Likewise.
      	(msp430_init_sections): Likewise.
      	(msp430_select_section): Likewise.
      	(msp430_function_section): Likewise.
      	(msp430_unique_section): Likewise.
      	(msp430_output_aligned_decl_common): Likewise.
      	(msp430_do_not_relax_short_jumps): Likewise.
      	(msp430_init_builtins): Likewise.
      	(msp430_expand_delay_cycles): Likewise.
      	(msp430_expand_prologue): Likewise.
      	(msp430_expand_epilogue): Likewise.
      	(msp430_expand_helper): Likewise.
      	(msp430_split_movsi): Likewise.
      	(msp430_print_operand): Likewise.
      	(msp430_return_addr_rtx): Likewise.
      	(msp430x_extendhisi): Likewise.
      	* config/msp430/msp430.h (STARTFILE_SPEC): Likewise.
      	(ASM_SPEC): Likewise.
      	Remove very obvious comments.
      	(LIB_SPEC): Split line more than 80 characters long.
      	(EH_RETURN_HANDLER_RTX): Likewise.
      	(HARD_REGNO_CALLER_SAVE_MODE): Likewise.
      
      From-SVN: r274537
      Jozef Lawrynowicz committed
    • MSP430: Fix whitespace errors and incorrect indentation in config/msp430/*.{c,h} files · 81a8845c
      2019-08-15  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
      
      	MSP430: Fix whitespace errors and incorrect indentation in
      	config/msp430/*.{c,h} files
      
      	* config/msp430/driver-msp430.c (msp430_select_cpu): Fix indentation.
      	(msp430_select_hwmult_lib): Likewise.
      	* config/msp430/msp430-devices.c (parse_devices_csv_1): Likewise.
      	(msp430_extract_mcu_data): Likewise.
      	(struct t_msp430_mcu_data): Likewise.
      	* config/msp430/msp430.c (struct machine_function): Remove whitespace
      	before left square bracket.
      	(msp430_option_override): Fix indentation.
      	(msp430_hard_regno_nregs_with_padding): Likewise.
      	(msp430_initial_elimination_offset): Likewise.
      	(msp430_special_register_convention_p): Remove whitespace before left
      	square bracket and after exclamation mark.
      	(msp430_evaluate_arg): Likewise.
      	(msp430_callee_copies): Fix indentation.
      	(msp430_gimplify_va_arg_expr): Likewise.
      	(msp430_function_arg_advance): Remove whitespace before left square
      	bracket.
      	(reg_ok_for_addr): Likewise.
      	(msp430_preserve_reg_p): Likewise.
      	(msp430_compute_frame_info): Likewise.
      	(msp430_asm_output_addr_const_extra): Add space between function name
      	and open parenthesis.
      	(has_section_name): Fix indentation.
      	(msp430_attr): Remove trailing whitespace.
      	(msp430_section_attr): Likewise.
      	(msp430_data_attr): Likewise.
      	(struct msp430_attribute_table): Fix comment and whitespace.
      	(msp430_start_function): Remove whitespace before left square bracket.
      	Add space between function name and open parenthesis.
      	(msp430_select_section): Remove trailing whitespace.
      	(msp430_section_type_flags): Remove trailing whitespace.
      	(msp430_unique_section): Remove space before closing parenthesis.
      	(msp430_output_aligned_decl_common): Change 8 spaces to a tab.
      	(msp430_builtins): Remove whitespace before left square bracket.
      	(msp430_init_builtins):	Fix indentation.
      	(msp430_expand_prologue): Remove whitespace before left square bracket.
      	Remove space before closing parenthesis.
      	(msp430_expand_epilogue): Remove whitespace before left square bracket.
      	(msp430_split_movsi): Remove space before closing parenthesis.
      	(helper_function_name_mappings): Fix indentation.
      	(msp430_use_f5_series_hwmult): Fix whitespace.
      	(use_32bit_hwmult): Likewise.
      	(msp430_no_hwmult): Likewise.
      	(msp430_output_labelref): Remove whitespace before left square bracket.
      	(msp430_print_operand_raw): Likewise.
      	(msp430_print_operand_addr): Likewise.
      	(msp430_print_operand): Add two spaces after '.' in comment.
      	Fix trailing whitespace.
      	(msp430x_extendhisi): Fix indentation.
      	* config/msp430/msp430.h (TARGET_CPU_CPP_BUILTINS): Change 8 spaces to
      	tab.
      	(PC_REGNUM): Likewise.
      	(STACK_POINTER_REGNUM): Likewise.
      	(CC_REGNUM): Likewise.
      
      From-SVN: r274536
      Jozef Lawrynowicz committed
    • re PR target/91454 (ICE in get_attr_avx_partial_xmm_update, at… · 8ed1d2fa
      re PR target/91454 (ICE in get_attr_avx_partial_xmm_update, at config/i386/i386.md:1804 since r274481)
      
      2019-08-15  Richard Biener  <rguenther@suse.de>
      
      	PR target/91454
      	* config/i386/i386-features.c (gen_gpr_to_xmm_move_src): New
      	helper.
      	(general_scalar_chain::make_vector_copies): Use it.
      
      From-SVN: r274535
      Richard Biener committed
    • Implement P0848R3, Conditionally Trivial Special Member Functions. · c735f8f1
      With Concepts, overloads of special member functions can differ in
      constraints, and this paper clarifies how that affects class properties: if
      a class has a more constrained trivial copy constructor and a less
      constrained non-trivial copy constructor, it is still trivially copyable.
      
      	* tree.c (special_memfn_p): New.
      	* class.c (add_method): When overloading, hide ineligible special
      	member fns.
      	(check_methods): Set TYPE_HAS_COMPLEX_* here.
      	* decl.c (grok_special_member_properties): Not here.
      	* name-lookup.c (push_class_level_binding_1): Move overloaded
      	functions case down, accept FUNCTION_DECL as target_decl.
      
      From-SVN: r274534
      Jason Merrill committed
    • re PR tree-optimization/91445 (After memset, logical && operator produces false… · 84cc60bf
      re PR tree-optimization/91445 (After memset, logical && operator produces false result, optimization level >=O1)
      
      2019-08-15  Richard Biener  <rguenther@suse.de>
      
      	PR tree-optimization/91445
      	* gcc.dg/torture/pr91445.c: New testcase.
      
      From-SVN: r274533
      Richard Biener committed
    • function.c (assign_parm_setup_reg): Handle misaligned stack arguments. · 83403245
      2019-08-15  Bernd Edlinger  <bernd.edlinger@hotmail.de>
      
              * function.c (assign_parm_setup_reg): Handle misaligned stack arguments.
      
      From-SVN: r274531
      Bernd Edlinger committed
    • Clean up dead condition for operators in DCE. · bbedc1ae
      2019-08-15  Martin Liska  <mliska@suse.cz>
      
      	* tree-ssa-dce.c (propagate_necessity): We can't reach now
      	operators with no arguments.
      	(eliminate_unnecessary_stmts): Likewise here.
      
      From-SVN: r274529
      Martin Liska committed
    • c-common.c (c_stddef_cpp_builtins): When the GIMPLE FE is enabled, define __SIZETYPE__. · 21c1e205
      2019-08-15  Richard Biener  <rguenther@suse.de>
      
      	c-family/
      	* c-common.c (c_stddef_cpp_builtins): When the GIMPLE FE is
      	enabled, define __SIZETYPE__.
      
      	* gcc.dg/pr80170.c: Adjust to use __SIZETYPE__.
      
      From-SVN: r274528
      Richard Biener committed
    • i386-features.c (general_scalar_chain::convert_insn): Revert 2019-08-14 change. · c839844a
      	* config/i386/i386-features.c (general_scalar_chain::convert_insn)
      	<case COMPARE>: Revert 2019-08-14 change.
      	(convertible_comparison_p): Revert 2019-08-14 change.  Return false
      	for (TARGET_64BIT || mode != DImode).
      
      From-SVN: r274526
      Uros Bizjak committed
    • Enforce canonicalization in value_range. · c7cf3a9b
      From-SVN: r274525
      Aldy Hernandez committed
    • Add missing check for BUILT_IN_MD (PR 91444) · eb2211e3
      In this PR we were passing an ordinary non-built-in function to
      targetm.vectorize.builtin_md_vectorized_function, which is only
      supposed to handle BUILT_IN_MD.
      
      2019-08-15  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	PR middle-end/91444
      	* tree-vect-stmts.c (vectorizable_call): Check that the function
      	is a BUILT_IN_MD function before passing it to
      	targetm.vectorize.builtin_md_vectorized_function.
      
      From-SVN: r274524
      Richard Sandiford committed
    • [AArch64] Add a aarch64_sve_mode_p query · 5c38705d
      This patch adds an exported function for testing whether a mode is
      an SVE mode.  The ACLE will make more use of it, but there's already
      one place that can benefit.
      
      2019-08-15  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/aarch64-protos.h (aarch64_sve_mode_p): Declare.
      	* config/aarch64/aarch64.c (aarch64_sve_mode_p): New function.
      	(aarch64_select_early_remat_modes): Use it.
      
      From-SVN: r274523
      Richard Sandiford committed
    • [AArch64] Fix predicate alignment for fixed-length SVE · 07108a9e
      aarch64_simd_vector_alignment was only giving predicates 16-bit
      alignment in VLA mode, not VLS mode.  I think the problem is latent
      because we can't yet create an ABI predicate type, but it seemed worth
      fixing in a standalone patch rather than as part of the main ACLE series.
      
      The ACLE patches have tests for this.
      
      2019-08-15  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/aarch64.c (aarch64_simd_vector_alignment): Return
      	16 for SVE predicates even if they are fixed-length.
      
      From-SVN: r274522
      Richard Sandiford committed
    • [AArch64] Tweak operand choice for SVE predicate AND · 2d2388f8
      SVE defines an assembly alias:
      
         MOV pa.B, pb/Z, pc.B  ->  AND pa.B. pb/Z, pc.B, pc.B
      
      Our and<mode>3 pattern was instead using the functionally-equivalent:
      
         AND pa.B. pb/Z, pb.B, pc.B
                         ^^^^
      This patch duplicates pc.B instead so that the alias can be seen
      in disassembly.
      
      I wondered about using the alias in the pattern instead, but using AND
      explicitly seems to fit better with the pattern name and surrounding code.
      
      2019-08-15  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/aarch64-sve.md (and<PRED_ALL:mode>3): Make the
      	operand order match the MOV /Z alias.
      
      From-SVN: r274521
      Richard Sandiford committed
    • [AArch64] Pass a pattern to aarch64_output_sve_cnt_immediate · 139df05a
      This patch makes us always pass an explicit vector pattern to
      aarch64_output_sve_cnt_immediate, rather than assuming it's ALL.
      The ACLE patches need to be able to pass in other values.
      
      2019-08-15  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/aarch64.c (aarch64_output_sve_cnt_immediate): Take
      	the vector pattern as an aarch64_svpattern argument.  Update the
      	overloaded caller accordingly.
      	(aarch64_output_sve_scalar_inc_dec): Update call accordingly.
      	(aarch64_output_sve_vector_inc_dec): Likewise.
      
      From-SVN: r274520
      Richard Sandiford committed
    • [AArch64] Optimise aarch64_add_offset for SVE VL constants · 7d8bdfa7
      aarch64_add_offset contains code to decompose all SVE VL-based constants
      into native operations.  The worst-case fallback is to load the number
      of SVE elements into a register and use a general multiplication.
      This patch improves that fallback by reusing expand_mult if
      can_create_pseudo_p, rather than emitting a MULT pattern directly.
      
      In order to increase the chances of being able to use a simple
      add-and-shift, the patch also tries to compute VG * the lowest set
      bit of the multiplier, rather than always using CNTD as the basis
      for the multiplication path.
      
      This is tested by the ACLE patches but is really an independent
      improvement.
      
      2019-08-15  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/aarch64.c (aarch64_add_offset): In the fallback
      	multiplication case, try to compute VG * (lowest set bit) directly
      	rather than always basing the multiplication on VG.  Use
      	expand_mult for the multiplication if we can.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/loop_add_4.c: Expect 10 INCWs and
      	INCDs rather than 8.
      
      From-SVN: r274519
      Richard Sandiford committed
    • [AArch64] Rework SVE INC/DEC handling · 0fdc30bc
      The scalar addition patterns allowed all the VL constants that
      ADDVL and ADDPL allow, but wrote the instructions as INC or DEC
      if possible (i.e. adding or subtracting a number of elements * [1, 16]
      when the source and target registers the same).  That works for the
      cases that the autovectoriser needs, but there are a few constants
      that INC and DEC can handle but ADDPL and ADDVL can't.  E.g.:
      
              inch    x0, all, mul #9
      
      is not a multiple of the number of bytes in an SVE register, and so
      can't use ADDVL.  It represents 36 times the number of bytes in an
      SVE predicate, putting it outside the range of ADDPL.
      
      This patch therefore adds separate alternatives for INC and DEC,
      tied to a new Uai constraint.  It also adds an explicit "scalar"
      or "vector" to the function names, to avoid a clash with the
      existing support for vector INC and DEC.
      
      2019-08-15  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/aarch64-protos.h
      	(aarch64_sve_scalar_inc_dec_immediate_p): Declare.
      	(aarch64_sve_inc_dec_immediate_p): Rename to...
      	(aarch64_sve_vector_inc_dec_immediate_p): ...this.
      	(aarch64_output_sve_addvl_addpl): Take a single rtx argument.
      	(aarch64_output_sve_scalar_inc_dec): Declare.
      	(aarch64_output_sve_inc_dec_immediate): Rename to...
      	(aarch64_output_sve_vector_inc_dec): ...this.
      	* config/aarch64/aarch64.c (aarch64_sve_scalar_inc_dec_immediate_p)
      	(aarch64_output_sve_scalar_inc_dec): New functions.
      	(aarch64_output_sve_addvl_addpl): Remove the base and offset
      	arguments.  Only handle true ADDVL and ADDPL instructions;
      	don't emit an INC or DEC.
      	(aarch64_sve_inc_dec_immediate_p): Rename to...
      	(aarch64_sve_vector_inc_dec_immediate_p): ...this.
      	(aarch64_output_sve_inc_dec_immediate): Rename to...
      	(aarch64_output_sve_vector_inc_dec): ...this.  Update call to
      	aarch64_sve_vector_inc_dec_immediate_p.
      	* config/aarch64/predicates.md (aarch64_sve_scalar_inc_dec_immediate)
      	(aarch64_sve_plus_immediate): New predicates.
      	(aarch64_pluslong_operand): Accept aarch64_sve_plus_immediate
      	rather than aarch64_sve_addvl_addpl_immediate.
      	(aarch64_sve_inc_dec_immediate): Rename to...
      	(aarch64_sve_vector_inc_dec_immediate): ...this.  Update call to
      	aarch64_sve_vector_inc_dec_immediate_p.
      	(aarch64_sve_add_operand): Update accordingly.
      	* config/aarch64/constraints.md (Uai): New constraint.
      	(vsi): Update call to aarch64_sve_vector_inc_dec_immediate_p.
      	* config/aarch64/aarch64.md (add<GPI:mode>3): Don't force the second
      	operand into a register if it satisfies aarch64_sve_plus_immediate.
      	(*add<GPI:mode>3_aarch64, *add<GPI:mode>3_poly_1): Add an alternative
      	for Uai.  Update calls to aarch64_output_sve_addvl_addpl.
      	* config/aarch64/aarch64-sve.md (add<mode>3): Call
      	aarch64_output_sve_vector_inc_dec instead of
      	aarch64_output_sve_inc_dec_immediate.
      
      From-SVN: r274518
      Richard Sandiford committed
    • [AArch64] Rework SVE REV[BHW] patterns · d7a09c44
      The current SVE REV patterns follow the AArch64 scheme, in which
      UNSPEC_REV<NN> reverses elements within an <NN>-bit granule.
      E.g. UNSPEC_REV64 on VNx8HI reverses the four 16-bit elements
      within each 64-bit granule.
      
      The native SVE scheme is the other way around: UNSPEC_REV64 is seen
      as an operation on 64-bit elements, with REVB swapping bytes within
      the elements, REVH swapping halfwords, and so on.  This fits SVE more
      naturally because the operation can then be predicated per <NN>-bit
      granule/element.
      
      Making the patterns use the Advanced SIMD scheme was more natural
      when all we cared about were permutes, since we could then use
      the source and target of the permute in their original modes.
      However, the ACLE does need patterns that follow the native scheme,
      treating them as operations on integer elements.  This patch defines
      the patterns that way instead and updates the existing uses to match.
      
      This also brings in a couple of helper routines from the ACLE branch.
      
      2019-08-15  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/iterators.md (UNSPEC_REVB, UNSPEC_REVH)
      	(UNSPEC_REVW): New constants.
      	(elem_bits): New mode attribute.
      	(SVE_INT_UNARY): New int iterator.
      	(optab): Handle UNSPEC_REV[BHW].
      	(sve_int_op): New int attribute.
      	(min_elem_bits): Handle VNx16QI and the predicate modes.
      	* config/aarch64/aarch64-sve.md (*aarch64_sve_rev64<mode>)
      	(*aarch64_sve_rev32<mode>, *aarch64_sve_rev16vnx16qi): Delete.
      	(@aarch64_pred_<SVE_INT_UNARY:optab><SVE_I:mode>): New pattern.
      	* config/aarch64/aarch64.c (aarch64_sve_data_mode): New function.
      	(aarch64_sve_int_mode, aarch64_sve_rev_unspec): Likewise.
      	(aarch64_split_sve_subreg_move): Use UNSPEC_REV[BHW] instead of
      	unspecs based on the total width of the reversed data.
      	(aarch64_evpc_rev_local): Likewise (for SVE only).  Use a
      	reinterpret followed by a subreg on big-endian targets.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/revb_1.c: Restrict to little-endian targets.
      	Avoid including stdint.h.
      	* gcc.target/aarch64/sve/revh_1.c: Likewise.
      	* gcc.target/aarch64/sve/revw_1.c: Likewise.
      	* gcc.target/aarch64/sve/revb_2.c: New big-endian test.
      	* gcc.target/aarch64/sve/revh_2.c: Likewise.
      	* gcc.target/aarch64/sve/revw_2.c: Likewise.
      
      From-SVN: r274517
      Richard Sandiford committed
    • [AArch64] Add more SVE FMLA and FMAD /z alternatives · 432b29c1
      This patch makes the floating-point conditional FMA patterns provide the
      same /z alternatives as the integer patterns added by a previous patch.
      We can handle cases in which individual inputs are allocated to the same
      register as the output, so we don't need to force all registers to be
      different.
      
      2019-08-15  Richard Sandiford  <richard.sandiford@arm.com>
      	    Kugan Vivekanandarajah  <kugan.vivekanandarajah@linaro.org>
      
      gcc/
      	* config/aarch64/aarch64-sve.md
      	(*cond_<SVE_COND_FP_TERNARY:optab><SVE_F:mode>_any): Add /z
      	alternatives in which one of the inputs is in the same register
      	as the output.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/cond_mla_5.c: Allow FMAD as well as FMLA
      	and FMSB as well as FMLS.
      
      Co-Authored-By: Kugan Vivekanandarajah <kuganv@linaro.org>
      
      From-SVN: r274516
      Richard Sandiford committed
    • [AArch64] Add MOVPRFX alternatives for SVE EXT patterns · 06b3ba23
      We use EXT both to implement vec_extract for large indices and as a
      permute.  In both cases we can use MOVPRFX to handle the case in which
      the first input and output can't be tied.
      
      2019-08-15  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/aarch64-sve.md (*vec_extract<mode><Vel>_ext)
      	(*aarch64_sve_ext<mode>): Add MOVPRFX alternatives.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/ext_2.c: Expect a MOVPRFX.
      	* gcc.target/aarch64/sve/ext_3.c: New test.
      
      From-SVN: r274515
      Richard Sandiford committed
    • [AArch64] Remove unneeded FSUB alternatives and add a new one · 2ae21bd1
      The floating-point subtraction patterns don't need to handle
      subtraction of constants, since those go through the addition
      patterns instead.  There was a missing MOVPRFX alternative for
      FSUBR though.
      
      2019-08-15  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/aarch64-sve.md (*sub<SVE_F:mode>3): Remove immediate
      	FADD and FSUB alternatives.  Add a MOVPRFX alternative for FSUBR.
      
      From-SVN: r274514
      Richard Sandiford committed
    • [AArch64] Add more unpredicated MOVPRFX alternatives · 5e176a61
      FABD and some immediate instructions were missing MOVPRFX alternatives.
      This is tested by the ACLE patches but is really an independent improvement.
      
      2019-08-15  Richard Sandiford  <richard.sandiford@arm.com>
      	    Kugan Vivekanandarajah  <kugan.vivekanandarajah@linaro.org>
      
      gcc/
      	* config/aarch64/aarch64-sve.md (add<SVE_I:mode>3, sub<SVE_I:mode>3)
      	(<LOGICAL:optab><SVE_I:mode>3, *add<SVE_F:mode>3, *mul<SVE_F:mode>3)
      	(*fabd<SVE_F:mode>3): Add more MOVPRFX alternatives.
      
      Co-Authored-By: Kugan Vivekanandarajah <kuganv@linaro.org>
      
      From-SVN: r274513
      Richard Sandiford committed
    • [AArch64] Use SVE reversed shifts in preference to MOVPRFX · 7d1f2401
      This patch makes us use reversed SVE shifts when the first operand
      can't be tied to the output but the second can.  This is tested
      more thoroughly by the ACLE patches but is really an independent
      improvement.
      
      2019-08-15  Richard Sandiford  <richard.sandiford@arm.com>
      	    Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>
      
      gcc/
      	* config/aarch64/aarch64-sve.md (*v<ASHIFT:optab><SVE_I:mode>3):
      	Add an alternative that uses reversed shifts.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/shift_1.c: Accept reversed shifts.
      
      Co-Authored-By: Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
      
      From-SVN: r274512
      Richard Sandiford committed
    • [aarch64] Use neoversen1 tuning struct for -mcpu=cortex-a76 · 42418c1f
      The neoversen1 tuning struct gives better performance on the Cortex-A76, so use that.
      The only difference from the current tuning is the function and label alignment settings.
      
      This gives about 1.3% improvement on SPEC2006 int and 0.3% on SPEC2006 fp. 
      
              * config/aarch64/aarch64-cores.def (cortex-a76): Use neoversen1 tuning
              struct.
      
      From-SVN: r274511
      Kyrylo Tkachov committed
    • [AArch64] Add a commutativity marker to the SVE [SU]ABD patterns · 9a8d9b3f
      This will be tested by the ACLE patches, but it's really an
      independent improvement.
      
      2019-08-15  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/aarch64-sve.md (aarch64_<su>abd<mode>_3): Add
      	a commutativity marker.
      
      From-SVN: r274510
      Richard Sandiford committed
    • [AArch64] Use SVE MLA, MLS, MAD and MSB for conditional arithmetic · b6c3aea1
      This patch uses predicated MLA, MLS, MAD and MSB to implement
      conditional "FMA"s on integers.  This also requires providing
      the unpredicated optabs (fma and fnma) since otherwise
      tree-ssa-math-opts.c won't try to use the conditional forms.
      
      We still want to use shifts and adds in preference to multiplications,
      so the patch makes the optab expanders check for that.
      
      The tests cover floating-point types too, which are already handled,
      and which were already tested to some extent by gcc.dg/vect.
      
      2019-08-15  Richard Sandiford  <richard.sandiford@arm.com>
      	    Kugan Vivekanandarajah  <kugan.vivekanandarajah@linaro.org>
      
      gcc/
      	* config/aarch64/aarch64-protos.h (aarch64_prepare_sve_int_fma)
      	(aarch64_prepare_sve_cond_int_fma): Declare.
      	* config/aarch64/aarch64.c (aarch64_convert_mult_to_shift)
      	(aarch64_prepare_sve_int_fma): New functions.
      	(aarch64_prepare_sve_cond_int_fma): Likewise.
      	* config/aarch64/aarch64-sve.md
      	(cond_<SVE_INT_BINARY:optab><SVE_I:mode>): Add a "@" marker.
      	(fma<SVE_I:mode>4, cond_fma<SVE_I:mode>, *cond_fma<SVE_I:mode>_2)
      	(*cond_fma<SVE_I:mode>_4, *cond_fma<SVE_I:mode>_any, fnma<SVE_I:mode>4)
      	(cond_fnma<SVE_I:mode>, *cond_fnma<SVE_I:mode>_2)
      	(*cond_fnma<SVE_I:mode>_4, *cond_fnma<SVE_I:mode>_any): New patterns.
      	(*madd<mode>): Rename to...
      	(*fma<mode>4): ...this.
      	(*msub<mode>): Rename to...
      	(*fnma<mode>4): ...this.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/cond_mla_1.c: New test.
      	* gcc.target/aarch64/sve/cond_mla_1_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_mla_2.c: Likewise.
      	* gcc.target/aarch64/sve/cond_mla_2_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_mla_3.c: Likewise.
      	* gcc.target/aarch64/sve/cond_mla_3_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_mla_4.c: Likewise.
      	* gcc.target/aarch64/sve/cond_mla_4_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_mla_5.c: Likewise.
      	* gcc.target/aarch64/sve/cond_mla_5_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_mla_6.c: Likewise.
      	* gcc.target/aarch64/sve/cond_mla_6_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_mla_7.c: Likewise.
      	* gcc.target/aarch64/sve/cond_mla_7_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_mla_8.c: Likewise.
      	* gcc.target/aarch64/sve/cond_mla_8_run.c: Likewise.
      
      Co-Authored-By: Kugan Vivekanandarajah <kuganv@linaro.org>
      
      From-SVN: r274509
      Richard Sandiford committed
    • [AArch64] Use SVE binary immediate instructions for conditional arithmetic · a19ba9e1
      This patch lets us use the immediate forms of FADD, FSUB, FSUBR,
      FMUL, FMAXNM and FMINNM for conditional arithmetic.  (We already
      use them for normal unconditional arithmetic.)
      
      2019-08-15  Richard Sandiford  <richard.sandiford@arm.com>
      	    Kugan Vivekanandarajah  <kugan.vivekanandarajah@linaro.org>
      
      gcc/
      	* config/aarch64/aarch64.c (aarch64_print_vector_float_operand):
      	Print 2.0 naturally.
      	(aarch64_sve_float_mul_immediate_p): Return true for 2.0.
      	* config/aarch64/predicates.md
      	(aarch64_sve_float_negated_arith_immediate): New predicate,
      	renamed from aarch64_sve_float_arith_with_sub_immediate.
      	(aarch64_sve_float_arith_with_sub_immediate): Test for both
      	positive and negative constants.
      	(aarch64_sve_float_arith_with_sub_operand): Redefine as a register
      	or an aarch64_sve_float_arith_with_sub_immediate.
      	* config/aarch64/constraints.md (vsN): Use
      	aarch64_sve_float_negated_arith_immediate.
      	* config/aarch64/iterators.md (SVE_COND_FP_BINARY_I1): New int
      	iterator.
      	(sve_pred_fp_rhs2_immediate): New int attribute.
      	* config/aarch64/aarch64-sve.md
      	(cond_<SVE_COND_FP_BINARY:optab><SVE_F:mode>): Use
      	sve_pred_fp_rhs1_operand and sve_pred_fp_rhs2_operand.
      	(*cond_<SVE_COND_FP_BINARY_I1:optab><SVE_F:mode>_2_const)
      	(*cond_<SVE_COND_FP_BINARY_I1:optab><SVE_F:mode>_any_const)
      	(*cond_add<SVE_F:mode>_2_const, *cond_add<SVE_F:mode>_any_const)
      	(*cond_sub<mode>_3_const, *cond_sub<mode>_any_const): New patterns.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/cond_fadd_1.c: New test.
      	* gcc.target/aarch64/sve/cond_fadd_1_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fadd_2.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fadd_2_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fadd_3.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fadd_3_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fadd_4.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fadd_4_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fsubr_1.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fsubr_1_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fsubr_2.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fsubr_2_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fsubr_3.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fsubr_3_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fsubr_4.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fsubr_4_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fmaxnm_1.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fmaxnm_1_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fmaxnm_2.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fmaxnm_2_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fmaxnm_3.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fmaxnm_3_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fmaxnm_4.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fmaxnm_4_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fminnm_1.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fminnm_1_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fminnm_2.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fminnm_2_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fminnm_3.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fminnm_3_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fminnm_4.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fminnm_4_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fmul_1.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fmul_1_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fmul_2.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fmul_2_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fmul_3.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fmul_3_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fmul_4.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fmul_4_run.c: Likewise.
      
      Co-Authored-By: Kugan Vivekanandarajah <kuganv@linaro.org>
      
      From-SVN: r274508
      Richard Sandiford committed
    • [AArch64] Use SVE FABD in conditional arithmetic · bf30864e
      This patch extends the FABD support so that it handles conditional
      arithmetic.  We're relying on combine for this, since there's no
      associated IFN_COND_* (yet?).
      
      2019-08-15  Richard Sandiford  <richard.sandiford@arm.com>
      	    Kugan Vivekanandarajah  <kugan.vivekanandarajah@linaro.org>
      
      gcc/
      	* config/aarch64/aarch64-sve.md (*aarch64_cond_abd<SVE_F:mode>_2)
      	(*aarch64_cond_abd<SVE_F:mode>_3)
      	(*aarch64_cond_abd<SVE_F:mode>_any): New patterns.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/cond_fabd_1.c: New test.
      	* gcc.target/aarch64/sve/cond_fabd_1_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fabd_2.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fabd_2_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fabd_3.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fabd_3_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fabd_4.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fabd_4_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fabd_5.c: Likewise.
      	* gcc.target/aarch64/sve/cond_fabd_5_run.c: Likewise.
      
      Co-Authored-By: Kugan Vivekanandarajah <kuganv@linaro.org>
      
      From-SVN: r274507
      Richard Sandiford committed
    • [AArch64] Use SVE [SU]ABD in conditional arithmetic · 9730c5cc
      This patch extends the [SU]ABD support so that it handles
      conditional arithmetic.  We're relying on combine for this,
      since there's no associated IFN_COND_* (yet?).
      
      2019-08-15  Richard Sandiford  <richard.sandiford@arm.com>
      	    Kugan Vivekanandarajah  <kugan.vivekanandarajah@linaro.org>
      
      gcc/
      	* config/aarch64/aarch64-sve.md (*aarch64_cond_<su>abd<mode>_2)
      	(*aarch64_cond_<su>abd<mode>_any): New patterns.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/cond_abd_1.c: New test.
      	* gcc.target/aarch64/sve/cond_abd_1_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_abd_2.c: Likewise.
      	* gcc.target/aarch64/sve/cond_abd_2_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_abd_3.c: Likewise.
      	* gcc.target/aarch64/sve/cond_abd_3_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_abd_4.c: Likewise.
      	* gcc.target/aarch64/sve/cond_abd_4_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_abd_5.c: Likewise.
      	* gcc.target/aarch64/sve/cond_abd_5_run.c: Likewise.
      
      Co-Authored-By: Kugan Vivekanandarajah <kuganv@linaro.org>
      
      From-SVN: r274506
      Richard Sandiford committed
    • Add support for conditional shifts · 20103c0e
      This patch adds support for IFN_COND shifts left and shifts right.
      This is mostly mechanical, but since we try to handle conditional
      operations in the same way as unconditional operations in match.pd,
      we need to support IFN_COND shifts by scalars as well as vectors.
      E.g.:
      
         IFN_COND_SHL (cond, a, { 1, 1, ... }, fallback)
      
      and:
      
         IFN_COND_SHL (cond, a, 1, fallback)
      
      are the same operation, with:
      
         (for shiftrotate (lrotate rrotate lshift rshift)
          ...
          /* Prefer vector1 << scalar to vector1 << vector2
             if vector2 is uniform.  */
          (for vec (VECTOR_CST CONSTRUCTOR)
           (simplify
            (shiftrotate @0 vec@1)
            (with { tree tem = uniform_vector_p (@1); }
             (if (tem)
      	(shiftrotate @0 { tem; }))))))
      
      preferring the latter.  The patch copes with this by extending
      create_convert_operand_from to handle scalar-to-vector conversions.
      
      2019-08-15  Richard Sandiford  <richard.sandiford@arm.com>
      	    Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>
      
      gcc/
      	* internal-fn.def (IFN_COND_SHL, IFN_COND_SHR): New internal functions.
      	* internal-fn.c (FOR_EACH_CODE_MAPPING): Handle shifts.
      	* match.pd (UNCOND_BINARY, COND_BINARY): Likewise.
      	* optabs.def (cond_ashl_optab, cond_ashr_optab, cond_lshr_optab): New
      	optabs.
      	* optabs.h (create_convert_operand_from): Expand comment.
      	* optabs.c (maybe_legitimize_operand): Allow implicit broadcasts
      	when mapping scalar rtxes to vector operands.
      	* config/aarch64/iterators.md (SVE_INT_BINARY): Add ashift,
      	ashiftrt and lshiftrt.
      	(sve_int_op, sve_int_op_rev, sve_pred_int_rhs2_operand): Handle them.
      	* config/aarch64/aarch64-sve.md (*cond_<optab><mode>_2_const)
      	(*cond_<optab><mode>_any_const): New patterns.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/cond_shift_1.c: New test.
      	* gcc.target/aarch64/sve/cond_shift_1_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_shift_2.c: Likewise.
      	* gcc.target/aarch64/sve/cond_shift_2_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_shift_3.c: Likewise.
      	* gcc.target/aarch64/sve/cond_shift_3_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_shift_4.c: Likewise.
      	* gcc.target/aarch64/sve/cond_shift_4_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_shift_5.c: Likewise.
      	* gcc.target/aarch64/sve/cond_shift_5_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_shift_6.c: Likewise.
      	* gcc.target/aarch64/sve/cond_shift_6_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_shift_7.c: Likewise.
      	* gcc.target/aarch64/sve/cond_shift_7_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_shift_8.c: Likewise.
      	* gcc.target/aarch64/sve/cond_shift_8_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_shift_9.c: Likewise.
      	* gcc.target/aarch64/sve/cond_shift_9_run.c: Likewise.
      
      Co-Authored-By: Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
      
      From-SVN: r274505
      Richard Sandiford committed