Skip to content
Snippets Groups Projects
  1. Aug 30, 2017
    • Ian Lance Taylor's avatar
      Fix e-mail address. · 5e2eef48
      Ian Lance Taylor authored
      From-SVN: r251541
      5e2eef48
    • Ian Lance Taylor's avatar
      configure.ac: Substitute GOC_FOR_TARGET and GCC_FOR_TARGET. · 1913c1bf
      Ian Lance Taylor authored
      	* configure.ac: Substitute GOC_FOR_TARGET and GCC_FOR_TARGET.
      	* Makefile.am (MOSTLYCLEANFILES): Add check-gcc.
      	(check-gccgo): Create via a temporary file.
      	(check-gcc): New target.
      	(CHECK_ENV): Set CC.
      	(ECHO_ENV): Report CC.
      	(check-go-tool): Depend on check-gcc.
      	(check-runtime, check-cgo-test, check-carchive-test): Likewise.
      	* configure, Makefile.in: Rebuild.
      
      From-SVN: r251540
      1913c1bf
    • Michael Meissner's avatar
      re PR target/82015 (PowerPC should check if 2nd argument to... · 6da714c6
      Michael Meissner authored
      re PR target/82015 (PowerPC should check if 2nd argument to __builtin_unpackv1ti and similar functions is 0 or 1)
      
      2017-08-30  Michael Meissner  <meissner@linux.vnet.ibm.com>
      
      	PR target/82015
      	* gcc.target/powerpc/pr82015.c: Fix up error message.
      
      From-SVN: r251539
      6da714c6
    • Jon Beniston's avatar
      tree-vect-patterns.c (vect_pattern_recog_1): Use VECTOR_TYPE_P instead of VECTOR_MODE_P check. · 4c8fd8ac
      Jon Beniston authored
      
      	* tree-vect-patterns.c (vect_pattern_recog_1): Use VECTOR_TYPE_P instead
      	of VECTOR_MODE_P check.
      	* tree-vect-stmts.c (get_vectype_for_scalar_type_and_size): Allow single
      	element vector types.
      
      
      Co-Authored-By: default avatarRichard Biener <rguenther@suse.de>
      
      From-SVN: r251538
      4c8fd8ac
    • Richard Sandiford's avatar
      Drop df_ from df_read_modify_subreg_p · 33845ca9
      Richard Sandiford authored
      ...it's really a general RTL predicate, rather than something that depends
      on the DF state.  Thanks to Segher for the suggestion.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      
      gcc/
      	* df.h (df_read_modify_subreg_p): Remove in favor of...
      	* rtl.h (read_modify_subreg_p): ...this new function.  Take a
      	const_rtx instead of an rtx.
      	* cprop.c (local_cprop_find_used_regs): Update accordingly.
      	* df-problems.c (df_word_lr_mark_ref): Likewise.
      	* ira-lives.c (mark_pseudo_reg_live): Likewise.
      	(mark_pseudo_reg_dead): Likewise.
      	(mark_ref_dead): Likewise.
      	* reginfo.c (init_subregs_of_mode): Likewise.
      	* sched-deps.c (sched_analyze_1): Likewise.
      	* df-scan.c (df_def_record_1): Likewise.
      	(df_uses_record): Likewise.
      	(df_read_modify_subreg_p): Remove in favor of...
      	* rtlanal.c (read_modify_subreg_p): ...this new function.  Take a
      	const_rtx instead of an rtx.
      
      From-SVN: r251537
      33845ca9
    • Richard Sandiford's avatar
      Add a partial_subreg_p predicate · bd4288c0
      Richard Sandiford authored
      
      This patch adds a partial_subreg_p predicate to go alongside
      paradoxical_subreg_p.
      
      Like the paradoxical_subreg_p patch, this one replaces some tests that
      were based on GET_MODE_SIZE rather than GET_MODE_PRECISION.  In each
      case the change should be a no-op or an improvement.
      
      The regcprop.c patch prevents some replacements of the 82-bit RFmode
      with the 80-bit XFmode on ia64.  I don't understand the target details
      here particularly well, but from the way the modes are described in
      ia64-modes.def, it isn't valid to assume that an XFmode can carry an
      RFmode payload.  A comparison of the testsuite assembly output for one
      target per CPU showed no other differences.
      
      Some of the places changed here are tracking the widest access mode
      found for a register.  The series tries to standardise on:
      
        if (partial_subreg_p (widest_seen, new_mode))
          widest_seen = new_mode;
      
      rather than:
      
        if (paradoxical_subreg_p (new_mode, widest_seen))
          widest_seen = new_mode;
      
      Either would have been OK.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* rtl.h (partial_subreg_p): New function.
      	* caller-save.c (save_call_clobbered_regs): Use it.
      	* calls.c (expand_call): Likewise.
      	* combine.c (combinable_i3pat): Likewise.
      	(simplify_set): Likewise.
      	(make_extraction): Likewise.
      	(make_compound_operation_int): Likewise.
      	(gen_lowpart_or_truncate): Likewise.
      	(force_to_mode): Likewise.
      	(make_field_assignment): Likewise.
      	(reg_truncated_to_mode): Likewise.
      	(record_truncated_value): Likewise.
      	(move_deaths): Likewise.
      	* cse.c (record_jump_cond): Likewise.
      	(cse_insn): Likewise.
      	* cselib.c (cselib_lookup_1): Likewise.
      	* expmed.c (extract_bit_field_using_extv): Likewise.
      	* function.c (assign_parm_setup_reg): Likewise.
      	* ifcvt.c (noce_convert_multiple_sets): Likewise.
      	* ira-build.c (create_insn_allocnos): Likewise.
      	* lra-coalesce.c (merge_pseudos): Likewise.
      	* lra-constraints.c (match_reload): Likewise.
      	(simplify_operand_subreg): Likewise.
      	(curr_insn_transform): Likewise.
      	* lra-lives.c (process_bb_lives): Likewise.
      	* lra.c (new_insn_reg): Likewise.
      	(lra_substitute_pseudo): Likewise.
      	* regcprop.c (mode_change_ok): Likewise.
      	(maybe_mode_change): Likewise.
      	(copyprop_hardreg_forward_1): Likewise.
      	* reload.c (push_reload): Likewise.
      	(find_reloads): Likewise.
      	(find_reloads_subreg_address): Likewise.
      	* reload1.c (alter_reg): Likewise.
      	(eliminate_regs_1): Likewise.
      	* simplify-rtx.c (simplify_unary_operation_1): Likewise.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251536
      bd4288c0
    • David Edelsohn's avatar
      rs6000.c (rs6000_expand_binop_builtin): Revert back to if statements, including unpack. · 432ebb1d
      David Edelsohn authored
              * config/rs6000/rs6000.c (rs6000_expand_binop_builtin): Revert
              back to if statements, including unpack.
      
      From-SVN: r251535
      432ebb1d
    • Tony Reix's avatar
      simple-object-xcoff.c (simple_object_xcoff_find_sections): Improve .go_export csect handling. · 62663034
      Tony Reix authored
      	* simple-object-xcoff.c (simple_object_xcoff_find_sections):
      	Improve .go_export csect handling.  Don't make assumptions
      	on containing section or number of auxiliary entries.
      
      From-SVN: r251533
      62663034
    • Martin Liska's avatar
      Fix IPA ICF with ASM statements (PR inline-asm/82001). · 6cc30cb4
      Martin Liska authored
      2017-08-30  Martin Liska  <mliska@suse.cz>
      
      	PR inline-asm/82001
      	* ipa-icf-gimple.c (func_checker::compare_tree_list_operand):
      	Rename to ...
      	(func_checker::compare_asm_inputs_outputs): ... this function.
      	(func_checker::compare_gimple_asm): Use the function to compare
      	also ASM constrains.
      	* ipa-icf-gimple.h: Rename the function.
      2017-08-30  Martin Liska  <mliska@suse.cz>
      
      	PR inline-asm/82001
      	* gcc.dg/ipa/pr82001.c: New test.
      
      From-SVN: r251530
      6cc30cb4
    • Richard Sandiford's avatar
      357b7604
    • Richard Sandiford's avatar
      [77/77] Add a complex_mode class · a97390bf
      Richard Sandiford authored
      
      This patch adds another machine_mode wrapper for modes that are
      known to be COMPLEX_MODE_P.  There aren't yet many places that make
      use of it, but that might change in future.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* coretypes.h (complex_mode): New type.
      	* gdbhooks.py (build_pretty_printer): Handle it.
      	* machmode.h (complex_mode): New class.
      	(complex_mode::includes_p): New function.
      	(is_complex_int_mode): Likewise.
      	(is_complex_float_mode): Likewise.
      	* genmodes.c (get_mode_class): Handle complex mode classes.
      	* function.c (expand_function_end): Use is_complex_int_mode.
      
      gcc/go/
      	* go-lang.c (go_langhook_type_for_mode): Use is_complex_float_mode.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251527
      a97390bf
    • Richard Sandiford's avatar
      [76/77] Add a scalar_mode_pod class · 382615c6
      Richard Sandiford authored
      
      This patch adds a scalar_mode_pod class and uses it to
      replace the machine_mode in fixed_value.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* coretypes.h (scalar_mode_pod): New typedef.
      	* gdbhooks.py (build_pretty_printer): Handle it.
      	* machmode.h (gt_ggc_mx, gt_pch_nx): New functions.
      	* fixed-value.h (fixed_value::mode): Change type to scalar_mode_pod.
      	* fold-const.c (fold_convert_const_int_from_fixed): Use scalar_mode.
      	* tree-streamer-in.c (unpack_ts_fixed_cst_value_fields): Use
      	as_a <scalar_mode>.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251526
      382615c6
    • Richard Sandiford's avatar
      [74/77] Various small scalar_mode changes · 79d22165
      Richard Sandiford authored
      
      This patch uses scalar_mode in a few miscellaneous places:
      
      - Previous patches mean mode_to_vector can take a scalar_mode without
        further changes.
      
      - Implicit promotion is limited to scalar types (affects promote_mode
        and sdbout_parms)
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* machmode.h (mode_for_vector): Take a scalar_mode instead
      	of a machine_mode.
      	* stor-layout.c (mode_for_vector): Likewise.
      	* explow.c (promote_mode): Use as_a <scalar_mode>.
      	* sdbout.c (sdbout_parms): Use is_a <scalar_mode>.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251525
      79d22165
    • Richard Sandiford's avatar
      [73/77] Pass scalar_mode to scalar_mode_supported_p · 005ba29c
      Richard Sandiford authored
      
      This patch makes the preferred_simd_mode target hook take a scalar_mode
      rather than a machine_mode.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* target.def (preferred_simd_mode): Take a scalar_mode
      	instead of a machine_mode.
      	* targhooks.h (default_preferred_simd_mode): Likewise.
      	* targhooks.c (default_preferred_simd_mode): Likewise.
      	* config/arc/arc.c (arc_preferred_simd_mode): Likewise.
      	* config/arm/arm.c (arm_preferred_simd_mode): Likewise.
      	* config/c6x/c6x.c (c6x_preferred_simd_mode): Likewise.
      	* config/epiphany/epiphany.c (epiphany_preferred_simd_mode): Likewise.
      	* config/i386/i386.c (ix86_preferred_simd_mode): Likewise.
      	* config/mips/mips.c (mips_preferred_simd_mode): Likewise.
      	* config/nvptx/nvptx.c (nvptx_preferred_simd_mode): Likewise.
      	* config/powerpcspe/powerpcspe.c (rs6000_preferred_simd_mode):
      	Likewise.
      	* config/rs6000/rs6000.c (rs6000_preferred_simd_mode): Likewise.
      	* config/s390/s390.c (s390_preferred_simd_mode): Likewise.
      	* config/sparc/sparc.c (sparc_preferred_simd_mode): Likewise.
      	* config/aarch64/aarch64.c (aarch64_preferred_simd_mode): Likewise.
      	(aarch64_simd_scalar_immediate_valid_for_move): Update accordingly.
      	* doc/tm.texi: Regenerate.
      	* optabs-query.c (can_vec_mask_load_store_p): Return false for
      	non-scalar modes.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251524
      005ba29c
    • Richard Sandiford's avatar
      [72/77] Pass scalar_mode to scalar_mode_supported_p · 18e2a8b8
      Richard Sandiford authored
      
      This patch makes the scalar_mode_supported_p target hook take a
      scalar_mode rather than a machine_mode.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* target.def (scalar_mode_supported_p): Take a scalar_mode
      	instead of a machine_mode.
      	* targhooks.h (default_scalar_mode_supported_p): Likewise.
      	* targhooks.c (default_scalar_mode_supported_p): Likewise.
      	* config/aarch64/aarch64.c (aarch64_scalar_mode_supported_p): Likewise.
      	* config/alpha/alpha.c (alpha_scalar_mode_supported_p): Likewise.
      	* config/arm/arm.c (arm_scalar_mode_supported_p): Likewise.
      	* config/avr/avr.c (avr_scalar_mode_supported_p): Likewise.
      	* config/c6x/c6x.c (c6x_scalar_mode_supported_p): Likewise.
      	* config/i386/i386.c (ix86_scalar_mode_supported_p): Likewise.
      	* config/ia64/ia64.c (ia64_scalar_mode_supported_p): Likewise.
      	* config/mips/mips.c (mips_scalar_mode_supported_p): Likewise.
      	* config/msp430/msp430.c (msp430_scalar_mode_supported_p): Likewise.
      	* config/pa/pa.c (pa_scalar_mode_supported_p): Likewise.
      	* config/pdp11/pdp11.c (pdp11_scalar_mode_supported_p): Likewise.
      	* config/powerpcspe/powerpcspe.c (rs6000_scalar_mode_supported_p):
      	Likewise.
      	* config/rs6000/rs6000.c (rs6000_scalar_mode_supported_p): Likewise.
      	* config/s390/s390.c (s390_scalar_mode_supported_p): Likewise.
      	* config/spu/spu.c (spu_scalar_mode_supported_p): Likewise.
      	* config/tilegx/tilegx.c (tilegx_scalar_mode_supported_p): Likewise.
      	* config/tilepro/tilepro.c (tilepro_scalar_mode_supported_p):
      	Likewise.
      	* doc/tm.texi: Regenerate.
      
      gcc/c-family/
      	* c-attribs.c (vector_mode_valid_p) Fold GET_MODE_INNER call
      	into scalar_mode_supported_p call.
      	(handle_mode_attribute): Update call to scalar_mode_supported_p.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251523
      18e2a8b8
    • Richard Sandiford's avatar
      [71/77] Use opt_scalar_mode for mode iterators · 16d22000
      Richard Sandiford authored
      
      This patch uses opt_scalar_mode when iterating over scalar modes.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* coretypes.h (opt_scalar_mode): New typedef.
      	* gdbhooks.py (build_pretty_printers): Handle it.
      	* machmode.h (mode_iterator::get_2xwider): Add overload for
      	opt_mode<T>.
      	* emit-rtl.c (init_emit_once): Use opt_scalar_mode when iterating
      	over scalar modes.
      	* expr.c (convert_mode_scalar): Likewise.
      	* omp-low.c (omp_clause_aligned_alignment): Likewise.
      	* optabs.c (expand_float): Likewise.
      	(expand_fix): Likewise.
      	* tree-vect-stmts.c (vectorizable_conversion): Likewise.
      
      gcc/c-family/
      	* c-common.c (c_common_fixed_point_type_for_size): Use opt_scalar_mode
      	for the mode iterator.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251522
      16d22000
    • Richard Sandiford's avatar
      [70/77] Make expand_fix/float check for scalar modes · f4f60580
      Richard Sandiford authored
      
      The expand_float code:
      
        /* Unsigned integer, and no way to convert directly.  Convert as signed,
           then unconditionally adjust the result.  */
      
      and the expand_fix code:
      
        /* For an unsigned conversion, there is one more way to do it.
           If we have a signed conversion, we generate code that compares
           the real value to the largest representable positive number.  If if
           is smaller, the conversion is done normally.  Otherwise, subtract
           one plus the highest signed number, convert, and add it back.
      
      are restricted to scalars, since the expansion branches on a
      comparison of the value.  This patch makes that explicit.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* optabs.c (expand_float): Explicitly check for scalars before
      	using a branching expansion.
      	(expand_fix): Likewise.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251521
      f4f60580
    • Richard Sandiford's avatar
      [69/77] Split scalar-only part out of convert_mode · 4e084bc3
      Richard Sandiford authored
      
      This patch splits the final scalar-only part of convert_mode out
      into its own subroutine and treats the modes as scalar_modes there.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* expr.c (convert_mode): Split scalar handling out into...
      	(convert_mode_scalar): ...this new function.  Treat the modes
      	as scalar_modes.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251520
      4e084bc3
    • Richard Sandiford's avatar
      [68/77] Use scalar_mode for is_int_mode/is_float_mode pairs · 3bd8f481
      Richard Sandiford authored
      
      This patch uses scalar_mode for code that operates only on MODE_INT
      and MODE_FLOAT.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* omp-expand.c (expand_omp_atomic): Use is_int_mode, is_float_mode
      	and scalar_mode.
      	* tree-vect-stmts.c (get_vectype_for_scalar_type_and_size): Likewise.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251519
      3bd8f481
    • Richard Sandiford's avatar
      [67/77] Use scalar_mode in fixed-value.* · 79052416
      Richard Sandiford authored
      
      This patch makes the fixed-value.* routines use scalar_mode.
      It would be possible to define special classes for these modes, as for
      scalar_int_mode and scalar_float_mode, but at the moment nothing would
      benefit from them.  In particular, there's no use case that would help
      select between one class for all fixed-point modes versus one class for
      fractional modes and one class for accumulator modes.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* fixed-value.h (fixed_from_double_int): Take a scalar_mode
      	rather than a machine_mode.
      	(fixed_from_string): Likewise.
      	(fixed_convert): Likewise.
      	(fixed_convert_from_int): Likewise.
      	(fixed_convert_from_real): Likewise.
      	(real_convert_from_fixed): Likewise.
      	* fixed-value.c (fixed_from_double_int): Likewise.
      	(fixed_from_string): Likewise.
      	(fixed_convert): Likewise.
      	(fixed_convert_from_int): Likewise.
      	(fixed_convert_from_real): Likewise.
      	(real_convert_from_fixed): Likewise.
      	* config/avr/avr.c (avr_out_round): Use as_a <scalar_mode>.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251518
      79052416
    • Richard Sandiford's avatar
      [66/77] Use scalar_mode for constant integers · db61b7f9
      Richard Sandiford authored
      
      This patch treats the mode associated with an integer constant as a
      scalar_mode.  We can't use the more natural-sounding scalar_int_mode
      because we also use (const_int 0) for bounds-checking modes.  (It might
      be worth adding a bounds-specific code instead, but that's for another
      day.)
      
      This exposes a latent bug in simplify_immed_subreg, which for
      vectors of CONST_WIDE_INTs would pass the vector mode rather than
      the element mode to rtx_mode_t.
      
      I think the:
      
      		  /* We can get a 0 for an error mark.  */
      		  || GET_MODE_CLASS (mode) == MODE_VECTOR_INT
      		  || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT
      
      in immed_double_const is dead.  trunc_int_mode (via gen_int_mode)
      would go on to ICE if the mode fitted in a HWI, and surely plenty
      of other code would be confused to see a const_int be interpreted
      as a vector.  We should instead be using CONST0_RTX (mode) if we
      need a safe constant for a particular mode.
      
      We didn't try to make these functions take scalar_mode arguments
      because in many cases that would be too invasive at this stage.
      Maybe it would become feasible in future.  Also, the long-term
      direction should probably be to add modes to constant integers
      rather than have then as VOIDmode odd-ones-out.  That would remove
      the need for rtx_mode_t and thus remove the question whether they
      should use scalar_int_mode, scalar_mode or machine_mode.
      
      The patch also uses scalar_mode for the CONST_DOUBLE handling
      in loc_descriptor.  In that case the mode can legitimately be
      either floating-point or integral.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* emit-rtl.c (immed_double_const): Use is_a <scalar_mode> instead
      	of separate mode class checks.  Do not allow vector modes here.
      	(immed_wide_int_const): Use as_a <scalar_mode>.
      	* explow.c (trunc_int_for_mode): Likewise.
      	* rtl.h (wi::int_traits<rtx_mode_t>::get_precision): Likewise.
      	(wi::shwi): Likewise.
      	(wi::min_value): Likewise.
      	(wi::max_value): Likewise.
      	* dwarf2out.c (loc_descriptor): Likewise.
      	* simplify-rtx.c (simplify_immed_subreg): Fix rtx_mode_t argument
      	for CONST_WIDE_INT.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251517
      db61b7f9
    • Richard Sandiford's avatar
      [65/77] Add a SCALAR_TYPE_MODE macro · b397965c
      Richard Sandiford authored
      
      This patch adds a SCALAR_TYPE_MODE macro, along the same lines as
      SCALAR_INT_TYPE_MODE and SCALAR_FLOAT_TYPE_MODE.  It also adds
      two instances of as_a <scalar_mode> to c_common_type, when converting
      an unsigned fixed-point SCALAR_TYPE_MODE to the equivalent signed mode.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* tree.h (SCALAR_TYPE_MODE): New macro.
      	* expr.c (expand_expr_addr_expr_1): Use it.
      	(expand_expr_real_2): Likewise.
      	* fold-const.c (fold_convert_const_fixed_from_fixed): Likeise.
      	(fold_convert_const_fixed_from_int): Likewise.
      	(fold_convert_const_fixed_from_real): Likewise.
      	(native_encode_fixed): Likewise
      	(native_encode_complex): Likewise
      	(native_encode_vector): Likewise.
      	(native_interpret_fixed): Likewise.
      	(native_interpret_real): Likewise.
      	(native_interpret_complex): Likewise.
      	(native_interpret_vector): Likewise.
      	* omp-simd-clone.c (simd_clone_adjust_return_type): Likewise.
      	(simd_clone_adjust_argument_types): Likewise.
      	(simd_clone_init_simd_arrays): Likewise.
      	(simd_clone_adjust): Likewise.
      	* stor-layout.c (layout_type): Likewise.
      	* tree.c (build_minus_one_cst): Likewise.
      	* tree-cfg.c (verify_gimple_assign_ternary): Likewise.
      	* tree-inline.c (estimate_move_cost): Likewise.
      	* tree-ssa-math-opts.c (convert_plusminus_to_widen): Likewise.
      	* tree-vect-loop.c (vect_create_epilog_for_reduction): Likewise.
      	(vectorizable_reduction): Likewise.
      	* tree-vect-patterns.c (vect_recog_widen_mult_pattern): Likewise.
      	(vect_recog_mixed_size_cond_pattern): Likewise.
      	(check_bool_pattern): Likewise.
      	(adjust_bool_pattern): Likewise.
      	(search_type_for_mask_1): Likewise.
      	* tree-vect-slp.c (vect_schedule_slp_instance): Likewise.
      	* tree-vect-stmts.c (vectorizable_conversion): Likewise.
      	(vectorizable_load): Likewise.
      	(vectorizable_store): Likewise.
      	* ubsan.c (ubsan_encode_value): Likewise.
      	* varasm.c (output_constant): Likewise.
      
      gcc/c-family/
      	* c-lex.c (interpret_fixed): Use SCALAR_TYPE_MODE.
      	* c-common.c (c_build_vec_perm_expr): Likewise.
      
      gcc/c/
      	* c-typeck.c (build_binary_op): Use SCALAR_TYPE_MODE.
      	(c_common_type): Likewise.  Use as_a <scalar_mode> when setting
      	m1 and m2 to the signed equivalent of a fixed-point
      	SCALAR_TYPE_MODE.
      
      gcc/cp/
      	* typeck.c (cp_build_binary_op): Use SCALAR_TYPE_MODE.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251516
      b397965c
    • Richard Sandiford's avatar
      [64/77] Add a scalar_mode class · d21cefc2
      Richard Sandiford authored
      
      This patch adds a scalar_mode class that can hold any scalar mode,
      specifically:
      
        - scalar integers
        - scalar floating-point values
        - scalar fractional modes
        - scalar accumulator modes
        - pointer bounds modes
      
      To start with this patch uses this type for GET_MODE_INNER.
      Later patches add more uses.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* coretypes.h (scalar_mode): New class.
      	* machmode.h (scalar_mode): Likewise.
      	(scalar_mode::includes_p): New function.
      	(mode_to_inner): Return a scalar_mode rather than a machine_mode.
      	* gdbhooks.py (build_pretty_printers): Handle scalar_mode.
      	* genmodes.c (get_mode_class): Handle remaining scalar modes.
      	* cfgexpand.c (expand_debug_expr): Use scalar_mode.
      	* expmed.c (store_bit_field_1): Likewise.
      	(extract_bit_field_1): Likewise.
      	* expr.c (write_complex_part): Likewise.
      	(read_complex_part): Likewise.
      	(emit_move_complex_push): Likewise.
      	(expand_expr_real_2): Likewise.
      	* function.c (assign_parm_setup_reg): Likewise.
      	(assign_parms_unsplit_complex): Likewise.
      	* optabs.c (expand_binop): Likewise.
      	* rtlanal.c (subreg_get_info): Likewise.
      	* simplify-rtx.c (simplify_immed_subreg): Likewise.
      	* varasm.c (output_constant_pool_2): Likewise.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251515
      d21cefc2
    • Richard Sandiford's avatar
      [63/77] Simplifications after type switch · 90970acd
      Richard Sandiford authored
      
      This patch makes a few simplifications after the previous
      mechanical machine_mode->scalar_int_mode change.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* expmed.c (extract_high_half): Use scalar_int_mode and remove
      	assertion.
      	(expmed_mult_highpart_optab): Likewise.
      	(expmed_mult_highpart): Likewise.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251514
      90970acd
    • Richard Sandiford's avatar
      [62/77] Big machine_mode to scalar_int_mode replacement · 095a2d76
      Richard Sandiford authored
      
      This patch changes the types of various things from machine_mode
      to scalar_int_mode, in cases where (after previous patches)
      simply changing the type is enough on its own.  The patch does
      nothing other than that.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* builtins.h (builtin_strncpy_read_str): Take a scalar_int_mode
      	instead of a machine_mode.
      	(builtin_memset_read_str): Likewise.
      	* builtins.c (c_readstr): Likewise.
      	(builtin_memcpy_read_str): Likewise.
      	(builtin_strncpy_read_str): Likewise.
      	(builtin_memset_read_str): Likewise.
      	(builtin_memset_gen_str): Likewise.
      	(expand_builtin_signbit): Use scalar_int_mode for local variables.
      	* cfgexpand.c (convert_debug_memory_address): Take a scalar_int_mode
      	instead of a machine_mode.
      	* combine.c (simplify_if_then_else): Use scalar_int_mode for local
      	variables.
      	(make_extraction): Likewise.
      	(try_widen_shift_mode): Take and return scalar_int_modes instead
      	of machine_modes.
      	* config/aarch64/aarch64.c (aarch64_libgcc_cmp_return_mode): Return
      	a scalar_int_mode instead of a machine_mode.
      	* config/avr/avr.c (avr_addr_space_address_mode): Likewise.
      	(avr_addr_space_pointer_mode): Likewise.
      	* config/cr16/cr16.c (cr16_unwind_word_mode): Likewise.
      	* config/msp430/msp430.c (msp430_addr_space_pointer_mode): Likewise.
      	(msp430_unwind_word_mode): Likewise.
      	* config/spu/spu.c (spu_unwind_word_mode): Likewise.
      	(spu_addr_space_pointer_mode): Likewise.
      	(spu_addr_space_address_mode): Likewise.
      	(spu_libgcc_cmp_return_mode): Likewise.
      	(spu_libgcc_shift_count_mode): Likewise.
      	* config/rl78/rl78.c (rl78_addr_space_address_mode): Likewise.
      	(rl78_addr_space_pointer_mode): Likewise.
      	(fl78_unwind_word_mode): Likewise.
      	(rl78_valid_pointer_mode): Take a scalar_int_mode instead of a
      	machine_mode.
      	* config/alpha/alpha.c (vms_valid_pointer_mode): Likewise.
      	* config/ia64/ia64.c (ia64_vms_valid_pointer_mode): Likewise.
      	* config/mips/mips.c (mips_mode_rep_extended): Likewise.
      	(mips_valid_pointer_mode): Likewise.
      	* config/tilegx/tilegx.c (tilegx_mode_rep_extended): Likewise.
      	* config/ft32/ft32.c (ft32_valid_pointer_mode): Likewise.
      	(ft32_addr_space_pointer_mode): Return a scalar_int_mode instead
      	of a machine_mode.
      	(ft32_addr_space_address_mode): Likewise.
      	* config/m32c/m32c.c (m32c_valid_pointer_mode): Take a
      	scalar_int_mode instead of a machine_mode.
      	(m32c_addr_space_pointer_mode): Return a scalar_int_mode instead
      	of a machine_mode.
      	(m32c_addr_space_address_mode): Likewise.
      	* config/powerpcspe/powerpcspe.c (rs6000_abi_word_mode): Likewise.
      	(rs6000_eh_return_filter_mode): Likewise.
      	* config/rs6000/rs6000.c (rs6000_abi_word_mode): Likewise.
      	(rs6000_eh_return_filter_mode): Likewise.
      	* config/s390/s390.c (s390_libgcc_cmp_return_mode): Likewise.
      	(s390_libgcc_shift_count_mode): Likewise.
      	(s390_unwind_word_mode): Likewise.
      	(s390_valid_pointer_mode): Take a scalar_int_mode rather than a
      	machine_mode.
      	* target.def (mode_rep_extended): Likewise.
      	(valid_pointer_mode): Likewise.
      	(addr_space.valid_pointer_mode): Likewise.
      	(eh_return_filter_mode): Return a scalar_int_mode rather than
      	a machine_mode.
      	(libgcc_cmp_return_mode): Likewise.
      	(libgcc_shift_count_mode): Likewise.
      	(unwind_word_mode): Likewise.
      	(addr_space.pointer_mode): Likewise.
      	(addr_space.address_mode): Likewise.
      	* doc/tm.texi: Regenerate.
      	* dojump.c (prefer_and_bit_test): Take a scalar_int_mode rather than
      	a machine_mode.
      	(do_jump): Use scalar_int_mode for local variables.
      	* dwarf2cfi.c (init_return_column_size): Take a scalar_int_mode
      	rather than a machine_mode.
      	* dwarf2out.c (convert_descriptor_to_mode): Likewise.
      	(scompare_loc_descriptor_wide): Likewise.
      	(scompare_loc_descriptor_narrow): Likewise.
      	* emit-rtl.c (adjust_address_1): Use scalar_int_mode for local
      	variables.
      	* except.c (sjlj_emit_dispatch_table): Likewise.
      	(expand_builtin_eh_copy_values): Likewise.
      	* explow.c (convert_memory_address_addr_space_1): Likewise.
      	Take a scalar_int_mode rather than a machine_mode.
      	(convert_memory_address_addr_space): Take a scalar_int_mode rather
      	than a machine_mode.
      	(memory_address_addr_space): Use scalar_int_mode for local variables.
      	* expmed.h (expand_mult_highpart_adjust): Take a scalar_int_mode
      	rather than a machine_mode.
      	* expmed.c (mask_rtx): Likewise.
      	(init_expmed_one_conv): Likewise.
      	(expand_mult_highpart_adjust): Likewise.
      	(extract_high_half): Likewise.
      	(expmed_mult_highpart_optab): Likewise.
      	(expmed_mult_highpart): Likewise.
      	(expand_smod_pow2): Likewise.
      	(expand_sdiv_pow2): Likewise.
      	(emit_store_flag_int): Likewise.
      	(adjust_bit_field_mem_for_reg): Use scalar_int_mode for local
      	variables.
      	(extract_low_bits): Likewise.
      	* expr.h (by_pieces_constfn): Take a scalar_int_mode rather than
      	a machine_mode.
      	* expr.c (pieces_addr::adjust):  Likewise.
      	(can_store_by_pieces): Likewise.
      	(store_by_pieces): Likewise.
      	(clear_by_pieces_1): Likewise.
      	(expand_expr_addr_expr_1): Likewise.
      	(expand_expr_addr_expr): Use scalar_int_mode for local variables.
      	(expand_expr_real_1): Likewise.
      	(try_casesi): Likewise.
      	* final.c (shorten_branches): Likewise.
      	* fold-const.c (fold_convert_const_int_from_fixed): Change the
      	type of "mode" to machine_mode.
      	* internal-fn.c (expand_arith_overflow_result_store): Take a
      	scalar_int_mode rather than a machine_mode.
      	(expand_mul_overflow): Use scalar_int_mode for local variables.
      	* loop-doloop.c (doloop_modify): Likewise.
      	(doloop_optimize): Likewise.
      	* optabs.c (expand_subword_shift): Take a scalar_int_mode rather
      	than a machine_mode.
      	(expand_doubleword_shift_condmove): Likewise.
      	(expand_doubleword_shift): Likewise.
      	(expand_doubleword_clz): Likewise.
      	(expand_doubleword_popcount): Likewise.
      	(expand_doubleword_parity): Likewise.
      	(expand_absneg_bit): Use scalar_int_mode for local variables.
      	(prepare_float_lib_cmp): Likewise.
      	* rtl.h (convert_memory_address_addr_space_1): Take a scalar_int_mode
      	rather than a machine_mode.
      	(convert_memory_address_addr_space): Likewise.
      	(get_mode_bounds): Likewise.
      	(get_address_mode): Return a scalar_int_mode rather than a
      	machine_mode.
      	* rtlanal.c (get_address_mode): Likewise.
      	* stor-layout.c (get_mode_bounds): Take a scalar_int_mode rather
      	than a machine_mode.
      	* targhooks.c (default_mode_rep_extended): Likewise.
      	(default_valid_pointer_mode): Likewise.
      	(default_addr_space_valid_pointer_mode): Likewise.
      	(default_eh_return_filter_mode): Return a scalar_int_mode rather
      	than a machine_mode.
      	(default_libgcc_cmp_return_mode): Likewise.
      	(default_libgcc_shift_count_mode): Likewise.
      	(default_unwind_word_mode): Likewise.
      	(default_addr_space_pointer_mode): Likewise.
      	(default_addr_space_address_mode): Likewise.
      	* targhooks.h (default_eh_return_filter_mode): Likewise.
      	(default_libgcc_cmp_return_mode): Likewise.
      	(default_libgcc_shift_count_mode): Likewise.
      	(default_unwind_word_mode): Likewise.
      	(default_addr_space_pointer_mode): Likewise.
      	(default_addr_space_address_mode): Likewise.
      	(default_mode_rep_extended): Take a scalar_int_mode rather than
      	a machine_mode.
      	(default_valid_pointer_mode): Likewise.
      	(default_addr_space_valid_pointer_mode): Likewise.
      	* tree-ssa-address.c (addr_for_mem_ref): Use scalar_int_mode for
      	local variables.
      	* tree-ssa-loop-ivopts.c (get_shiftadd_cost): Take a scalar_int_mode
      	rather than a machine_mode.
      	* tree-switch-conversion.c (array_value_type): Use scalar_int_mode
      	for local variables.
      	* tree-vrp.c (simplify_float_conversion_using_ranges): Likewise.
      	* var-tracking.c (use_narrower_mode): Take a scalar_int_mode rather
      	than a machine_mode.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251513
      095a2d76
    • Richard Sandiford's avatar
      [60/77] Pass scalar_int_modes to do_jump_by_parts_* · d787ba56
      Richard Sandiford authored
      
      The callers of do_jump_by_parts_* had already established
      that the modes were MODE_INTs, so this patch passes the
      modes down as scalar_int_modes.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* dojump.c (do_jump_by_parts_greater_rtx): Change the type of
      	the mode argument to scalar_int_mode.
      	(do_jump_by_parts_zero_rtx): Likewise.
      	(do_jump_by_parts_equality_rtx): Likewise.
      	(do_jump_by_parts_greater): Take a mode argument.
      	(do_jump_by_parts_equality): Likewise.
      	(do_jump_1): Update calls accordingly.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251512
      d787ba56
    • Richard Sandiford's avatar
      [59/77] Add a rtx_jump_table_data::get_data_mode helper · d305ca88
      Richard Sandiford authored
      
      This patch adds a helper function to get the mode of the addresses
      or offsets in a jump table.  It also changes the final.c code to use
      rtx_jump_table_data over rtx or rtx_insn in cases where it needed
      to use the new helper.  This in turn meant adding a safe_dyn_cast
      equivalent of safe_as_a, to cope with null NEXT_INSNs.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* is-a.h (safe_dyn_cast): New function.
      	* rtl.h (rtx_jump_table_data::get_data_mode): New function.
      	(jump_table_for_label): Likewise.
      	* final.c (final_addr_vec_align): Take an rtx_jump_table_data *
      	instead of an rtx_insn *.
      	(shorten_branches): Use dyn_cast instead of LABEL_P and
      	JUMP_TABLE_DATA_P.  Use jump_table_for_label and
      	rtx_jump_table_data::get_data_mode.
      	(final_scan_insn): Likewise.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251511
      d305ca88
    • Richard Sandiford's avatar
      [58/77] Use scalar_int_mode in a try_combine optimisation · 2123a9a5
      Richard Sandiford authored
      
      This patch uses scalar_int_modes for:
      
        /* If I2 is setting a pseudo to a constant and I3 is setting some
           sub-part of it to another constant, merge them by making a new
           constant.  */
      
      This was already implicit, but the danger with checking only
      CONST_SCALAR_INT_P is that it can include CC values too.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* combine.c (try_combine): Use is_a <scalar_int_mode> when
      	trying to combine a full-register integer set with a subreg
      	integer set.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251510
      2123a9a5
    • Richard Sandiford's avatar
      [57/77] Use scalar_int_mode in expand_expr_addr_expr · d93d3864
      Richard Sandiford authored
      
      This patch rewrites the condition:
      
        if (tmode != address_mode && tmode != pointer_mode)
          tmode = address_mode;
      
      to the equivalent:
      
        tmode == pointer_mode ? pointer_mode : address_mode
      
      The latter has the advantage that the result is naturally
      a scalar_int_mode; a later mechanical patch makes it one.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* expr.c (expand_expr_addr_expr): Add a new_tmode local variable
      	that is always either address_mode or pointer_mode.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251509
      d93d3864
    • Richard Sandiford's avatar
      [56/77] Use the more specific type when two modes are known to be equal · 8a92a3f3
      Richard Sandiford authored
      
      This patch adjusts a couple of cases in which we had established
      that two modes were equal and happened to be using the one with the
      more general type instead of the one with the more specific type.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* expr.c (expand_expr_real_2): Use word_mode instead of innermode
      	when the two are known to be equal.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251508
      8a92a3f3
    • Richard Sandiford's avatar
      [55/77] Use scalar_int_mode in simplify_const_unary_operation · 40c4ef22
      Richard Sandiford authored
      
      The main scalar integer block in simplify_const_unary_operation
      had the condition:
      
        if (CONST_SCALAR_INT_P (op) && width > 0)
      
      where "width > 0" was a roundabout way of testing != VOIDmode.
      This patch replaces it with a check for a scalar_int_mode instead.
      It also uses the number of bits in the input rather than the output
      mode to determine the result of a "count ... bits in zero" operation.
      (At the momemnt these modes have to be the same, but it still seems
      conceptually wrong to use the number of bits in the output mode.)
      
      The handling of float->integer ops also checked "width > 0",
      but this was redundant with the earlier check for MODE_INT.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* simplify-rtx.c (simplify_const_unary_operation): Use
      	is_a <scalar_int_mode> instead of checking for a nonzero
      	precision.  Forcibly convert op_mode to a scalar_int_mode
      	in that case.  More clearly differentiate the operand and
      	result modes and use the former when deciding what the value
      	of a count-bits operation should be.  Use is_int_mode instead
      	of checking for a MODE_INT.  Remove redundant check for whether
      	this mode has a zero precision.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251507
      40c4ef22
    • Richard Sandiford's avatar
      [54/77] Add explicit int checks for alternative optab implementations · 3c84109e
      Richard Sandiford authored
      
      expand_unop can expand narrow clz, clrsb, ctz, bswap, parity and
      ffs operations using optabs for wider modes.  These expansions
      apply only to scalar integer modes (and not for example to vectors),
      so the patch adds explicit checks for that.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* optabs.c (widen_leading): Change the type of the mode argument
      	to scalar_int_mode.  Use opt_scalar_int_mode for the mode iterator.
      	(widen_bswap): Likewise.
      	(expand_parity): Likewise.
      	(expand_ctz): Change the type of the mode argument to scalar_int_mode.
      	(expand_ffs): Likewise.
      	(epand_unop): Check for scalar integer modes before calling the
      	above routines.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251506
      3c84109e
    • Richard Sandiford's avatar
      [53/77] Pass a mode to const_scalar_mask_from_tree · 04d6ea36
      Richard Sandiford authored
      
      The caller of const_scalar_mask_from_tree has proven that
      the mode is a MODE_INT, so this patch passes it down as a
      scalar_int_mode.  It also expands the comment a little.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* expr.c (const_scalar_mask_from_tree): Add a mode argument.
      	Expand commentary.
      	(expand_expr_real_1): Update call accordingly.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251505
      04d6ea36
    • Richard Sandiford's avatar
      [52/77] Use scalar_int_mode in extract/store_bit_field · 1a527092
      Richard Sandiford authored
      
      After a certain point, extract_bit_field and store_bit_field
      ensure that they're dealing with integer modes or BLKmode MEMs.
      This patch uses scalar_int_mode and opt_scalar_int_mode for
      those parts.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* expmed.c (store_bit_field_using_insv): Add op0_mode and
      	value_mode arguments.  Use scalar_int_mode internally.
      	(store_bit_field_1): Rename the new integer mode from imode
      	to op0_mode and use it instead of GET_MODE (op0).  Update calls
      	to store_split_bit_field, store_bit_field_using_insv and
      	store_fixed_bit_field.
      	(store_fixed_bit_field): Add op0_mode and value_mode arguments.
      	Use scalar_int_mode internally.  Use a bit count rather than a mode
      	when calculating the largest bit size for get_best_mode.
      	Update calls to store_split_bit_field and store_fixed_bit_field_1.
      	(store_fixed_bit_field_1): Add mode and value_mode arguments.
      	Remove assertion that OP0 has a scalar integer mode.
      	(store_split_bit_field): Add op0_mode and value_mode arguments.
      	Update calls to extract_fixed_bit_field.
      	(extract_bit_field_using_extv): Add an op0_mode argument.
      	Use scalar_int_mode internally.
      	(extract_bit_field_1): Rename the new integer mode from imode to
      	op0_mode and use it instead of GET_MODE (op0).  Update calls to
      	extract_split_bit_field, extract_bit_field_using_extv and
      	extract_fixed_bit_field.
      	(extract_fixed_bit_field): Add an op0_mode argument.  Update calls
      	to extract_split_bit_field and extract_fixed_bit_field_1.
      	(extract_fixed_bit_field_1): Add a mode argument.  Remove assertion
      	that OP0 has a scalar integer mode.  Use as_a <scalar_int_mode>
      	on the target mode.
      	(extract_split_bit_field): Add an op0_mode argument.  Update call
      	to extract_fixed_bit_field.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251504
      1a527092
    • Richard Sandiford's avatar
      [51/77] Use opt_scalar_int_mode when iterating over integer modes · 59b51186
      Richard Sandiford authored
      
      This patch uses opt_scalar_int_mode rather than machine_mode
      when iterating over scalar_int_modes, in cases where that helps
      with future patches.  (Using machine_mode is still OK in places
      that don't really care about the mode being a scalar integer.)
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* cse.c (cse_insn): Use opt_scalar_int_mode for the mode iterator.
      	* explow.c (hard_function_value): Likewise.
      	* expmed.c (extract_fixed_bit_field_1): Likewise.  Move the
      	convert_to_mode call outside the loop.
      	* expr.c (alignment_for_piecewise_move): Use opt_scalar_int_mode
      	for the mode iterator.  Require the mode specified by max_pieces
      	to exist.
      	(emit_block_move_via_movmem): Use opt_scalar_int_mode for the
      	mode iterator.
      	(copy_blkmode_to_reg): Likewise.
      	(set_storage_via_setmem): Likewise.
      	* optabs.c (prepare_cmp_insn): Likewise.
      	* rtlanal.c (init_num_sign_bit_copies_in_rep): Likewise.
      	* stor-layout.c (finish_bitfield_representative): Likewise.
      
      gcc/fortran/
      	* trans-types.c (gfc_init_kinds): Use opt_scalar_int_mode for
      	the mode iterator.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251503
      59b51186
    • Richard Sandiford's avatar
      [50/77] Add helper routines for SUBREG_PROMOTED_VAR_P subregs · 5e4e37bf
      Richard Sandiford authored
      
      When subregs contain promoted values, as indicated by
      SUBREG_PROMOTED_VAR_P, both the unpromoted (outer) and
      promoted (inner) values are known to be scalar integers.
      This patch adds helper routines that get the modes as
      scalar_int_modes.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* rtl.h (subreg_unpromoted_mode, subreg_promoted_mode): New functions.
      	* expr.c (convert_move): Use them.
      	(convert_modes): Likewise.
      	(store_expr_with_bounds): Likewise.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251502
      5e4e37bf
    • Richard Sandiford's avatar
      [49/77] Simplify nonzero/num_sign_bits hooks · 401581b6
      Richard Sandiford authored
      
      The two implementations of the reg_nonzero_bits and reg_num_sign_bits
      hooks ignored the "known_x", "known_mode" and "known_ret" arguments,
      so this patch removes them.  It adds a new scalar_int_mode parameter
      that specifies the mode of "x".  (This mode might be different from
      "mode", which is the mode in which "x" is used.)
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* rtl.h (rtl_hooks::reg_nonzero_bits): Add a scalar_int_mode
      	parameter for the mode of "x".  Remove the "known_x", "known_mode"
      	and "known_ret" arguments.  Change the type of the mode argument
      	to scalar_int_mode.
      	(rtl_hooks:reg_num_sign_bit_copies): Likewise.
      	* combine.c (reg_nonzero_bits_for_combine): Update accordingly.
      	(reg_num_sign_bit_copies_for_combine): Likewise.
      	* rtlanal.c (nonzero_bits1): Likewise.
      	(num_sign_bit_copies1): Likewise.
      	* rtlhooks-def.h (reg_nonzero_bits_general): Likewise.
      	(reg_num_sign_bit_copies_general): Likewise.
      	* rtlhooks.c (reg_num_sign_bit_copies_general): Likewise.
      	(reg_nonzero_bits_general): Likewise.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251501
      401581b6
    • Richard Sandiford's avatar
      [48/77] Make subroutines of num_sign_bit_copies operate on scalar_int_mode · f8265fb8
      Richard Sandiford authored
      
      Similarly to the nonzero_bits patch, this one moves the mode
      class check and VOIDmode handling from num_sign_bit_copies1
      to num_sign_bit_copies itself, then changes the subroutines
      to operate on scalar_int_modes.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* rtlanal.c (num_sign_bit_copies): Handle VOIDmode here rather
      	than in subroutines.  Return 1 for non-integer modes.
      	(cached_num_sign_bit_copies): Change the type of the mode parameter
      	to scalar_int_mode.
      	(num_sign_bit_copies1): Likewise.  Remove early exit for other mode
      	classes.  Handle CONST_INT_P first and then check whether X also
      	has a scalar integer mode.  Check the same thing for inner registers
      	of a SUBREG and for values that are being extended or truncated.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251500
      f8265fb8
    • Richard Sandiford's avatar
      [47/77] Make subroutines of nonzero_bits operate on scalar_int_mode · 22527b59
      Richard Sandiford authored
      
      nonzero_bits1 assumed that all bits of a floating-point or vector mode
      were needed.  It seems likely that fixed-point modes should have been
      handled in the same way.  After excluding those, the only remaining
      modes that are likely to be useful are scalar integer ones.
      
      This patch moves the mode class check to nonzero_bits itself, along
      with the handling of mode == VOIDmode.  The subroutines of nonzero_bits
      can then take scalar_int_modes.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* rtlanal.c (nonzero_bits): Handle VOIDmode here rather than
      	in subroutines.  Return the mode mask for non-integer modes.
      	(cached_nonzero_bits): Change the type of the mode parameter
      	to scalar_int_mode.
      	(nonzero_bits1): Likewise.  Remove early exit for other mode
      	classes.  Handle CONST_INT_P first and then check whether X
      	also has a scalar integer mode.
      
      Co-Authored-By: default avatarAlan Hayward <alan.hayward@arm.com>
      Co-Authored-By: default avatarDavid Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251499
      22527b59
    • Richard Sandiford's avatar
      [46/77] Make widest_int_mode_for_size return a scalar_int_mode · b4e6c85e
      Richard Sandiford authored
      The comment for widest_int_mode said that it returns "the widest integer
      mode no wider than SIZE", but it actually returns the widest integer
      mode that is narrower than SIZE.  In practice SIZE is always greater
      than 1, so it can always pick QImode in the worst case.  The VOIDmode
      paths seem to be dead.
      
      gcc/
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      	* expr.c (widest_int_mode_for_size): Make the comment match the code.
      	Return a scalar_int_mode and assert that the size is greater than
      	one byte.
      	(by_pieces_ninsns): Update accordingly and remove VOIDmode handling.
      	(op_by_pieces_d::op_by_pieces_d): Likewise.
      	(op_by_pieces_d::run): Likewise.
      	(can_store_by_pieces): Likewise.
      
      From-SVN: r251498
      b4e6c85e
Loading