public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jeff Law <law@redhat.com>
To: gcc-patches@gcc.gnu.org, richard.sandiford@linaro.org
Subject: Re: [04/77] Add FOR_EACH iterators for modes
Date: Fri, 11 Aug 2017 17:57:00 -0000	[thread overview]
Message-ID: <41f9f8bb-b748-71b4-de2a-da89f09a9419@redhat.com> (raw)
In-Reply-To: <87tw1eqb3d.fsf@linaro.org>

On 08/11/2017 11:16 AM, Richard Sandiford wrote:
> Hi Jeff,
> 
> First, many thanks for the reviews!
> 
> Jeff Law <law@redhat.com> writes:
>> On 07/13/2017 02:39 AM, Richard Sandiford wrote:
>>> The new iterators are:
>>>
>>> - FOR_EACH_MODE_IN_CLASS: iterate over all the modes in a mode class.
>>>
>>> - FOR_EACH_MODE_FROM: iterate over all the modes in a class,
>>>   starting at a given mode.
>>>
>>> - FOR_EACH_WIDER_MODE: iterate over all the modes in a class,
>>>   starting at the next widest mode after a given mode.
>>>
>>> - FOR_EACH_2XWIDER_MODE: same, but considering only modes that
>>>   are two times wider than the previous mode.
>>>
>>> - FOR_EACH_MODE_UNTIL: iterate over all the modes in a class until
>>>   a given mode is reached.
>>>
>>> - FOR_EACH_MODE: iterate over all the modes in a class between
>>>   two given modes, inclusive of the first but not the second.
>>>
>>> These help with the stronger type checking added by later patches,
>>> since every new mode will be in the same class as the previous one.
>>>
>>> 2017-07-13  Richard Sandiford  <richard.sandiford@linaro.org>
>>>             Alan Hayward  <alan.hayward@arm.com>
>>>             David Sherwood  <david.sherwood@arm.com>
>>>
>>> gcc/
>>> 	* machmode.h (mode_traits): New structure.
>>> 	(get_narrowest_mode): New function.
>>> 	(mode_iterator::start): Likewise.
>>> 	(mode_iterator::iterate_p): Likewise.
>>> 	(mode_iterator::get_wider): Likewise.
>>> 	(mode_iterator::get_known_wider): Likewise.
>>> 	(mode_iterator::get_2xwider): Likewise.
>>> 	(FOR_EACH_MODE_IN_CLASS): New mode iterator.
>>> 	(FOR_EACH_MODE): Likewise.
>>> 	(FOR_EACH_MODE_FROM): Likewise.
>>> 	(FOR_EACH_MODE_UNTIL): Likewise.
>>> 	(FOR_EACH_WIDER_MODE): Likewise.
>>> 	(FOR_EACH_2XWIDER_MODE): Likewise.
>>> 	* builtins.c (expand_builtin_strlen): Use new mode iterators.
>>> 	* combine.c (simplify_comparison): Likewise
>>> 	* config/i386/i386.c (type_natural_mode): Likewise.
>>> 	* cse.c (cse_insn): Likewise.
>>> 	* dse.c (find_shift_sequence): Likewise.
>>> 	* emit-rtl.c (init_derived_machine_modes): Likewise.
>>> 	(init_emit_once): Likewise.
>>> 	* explow.c (hard_function_value): Likewise.
>>> 	* expmed.c (init_expmed_one_mode): Likewise.
>>> 	(extract_fixed_bit_field_1): Likewise.
>>> 	(extract_bit_field_1): Likewise.
>>> 	(expand_divmod): Likewise.
>>> 	(emit_store_flag_1): Likewise.
>>> 	* expr.c (init_expr_target): Likewise.
>>> 	(convert_move): Likewise.
>>> 	(alignment_for_piecewise_move): Likewise.
>>> 	(widest_int_mode_for_size): Likewise.
>>> 	(emit_block_move_via_movmem): Likewise.
>>> 	(copy_blkmode_to_reg): Likewise.
>>> 	(set_storage_via_setmem): Likewise.
>>> 	(compress_float_constant): Likewise.
>>> 	* omp-low.c (omp_clause_aligned_alignment): Likewise.
>>> 	* optabs-query.c (get_best_extraction_insn): Likewise.
>>> 	* optabs.c (expand_binop): Likewise.
>>> 	(expand_twoval_unop): Likewise.
>>> 	(expand_twoval_binop): Likewise.
>>> 	(widen_leading): Likewise.
>>> 	(widen_bswap): Likewise.
>>> 	(expand_parity): Likewise.
>>> 	(expand_unop): Likewise.
>>> 	(prepare_cmp_insn): Likewise.
>>> 	(prepare_float_lib_cmp): Likewise.
>>> 	(expand_float): Likewise.
>>> 	(expand_fix): Likewise.
>>> 	(expand_sfix_optab): Likewise.
>>> 	* postreload.c (move2add_use_add2_insn): Likewise.
>>> 	* reg-stack.c (reg_to_stack): Likewise.
>>> 	* reginfo.c (choose_hard_reg_mode): Likewise.
>>> 	* rtlanal.c (init_num_sign_bit_copies_in_rep): Likewise.
>>> 	* stmt.c (emit_case_decision_tree): Likewise.
>>> 	* stor-layout.c (mode_for_size): Likewise.
>>> 	(smallest_mode_for_size): Likewise.
>>> 	(mode_for_vector): Likewise.
>>> 	(finish_bitfield_representative): Likewise.
>>> 	* tree-ssa-math-opts.c (target_supports_divmod_p): Likewise.
>>> 	* tree-vect-generic.c (type_for_widest_vector_mode): Likewise.
>>> 	* tree-vect-stmts.c (vectorizable_conversion): Likewise.
>>> 	* var-tracking.c (prepare_call_arguments): Likewise.
>>>
>>> gcc/ada/
>>> 	* gcc-interface/misc.c (fp_prec_to_size): Use new mode iterators.
>>> 	(fp_size_to_prec): Likewise.
>>>
>>> gcc/c-family/
>>> 	* c-common.c (c_common_fixed_point_type_for_size): Use new mode
>>> 	iterators.
>>> 	* c-cppbuiltin.c (c_cpp_builtins): Likewise.
>> So in some cases I see that we have loops like this:
>>
>> for (; mode != VOIDmode; mode = GET_WIDER_MODE (mode))
>>
>> Which iterates from the current mode through all the remaining modes,
>> with each iteration using a wider mode than the previous iteration.
>> GET_WIDER_MODE is always going to give us something in the same class or
>> VOIDmode.
>>
>> This is getting translated into:
>>
>> FOR_EACH_MODE_FROM (mode, mode)
>>
>> The two loops have different steps.  The original steps to a wider mode
>> each iteration.  The new one may step to a different mode of the same
>> width IIUC.
>>
>> Am I missing something here?
> 
> The new iterators use GET_MODE_WIDER or GET_MODE_2XWIDER to step,
> and the patch is only supposed to convert loops that have matching steps.
> It wasn't supposed to convert loops that step through modes as numerical
> values, but I see now that I fluffed it with:
Ah, I was just doing a high level looksie at the conversions first using
the descriptions you gave when I saw what appeared to be the
inconsistency.  Let me repeat that knowing that we're stepping with
GET_MODE_WIDER and friends.


> 
> Index: gcc/expmed.c
> ===================================================================
> --- gcc/expmed.c	2017-07-13 09:17:39.972572368 +0100
> +++ gcc/expmed.c	2017-07-13 09:18:21.531429258 +0100
> @@ -204,8 +204,7 @@ init_expmed_one_mode (struct init_expmed
>  
>    if (SCALAR_INT_MODE_P (mode))
>      {
> -      for (mode_from = MIN_MODE_INT; mode_from <= MAX_MODE_INT;
> -	   mode_from = (machine_mode)(mode_from + 1))
> +      FOR_EACH_MODE_IN_CLASS (mode_from, MODE_INT)
>  	init_expmed_one_conv (all, mode, mode_from, speed);
>      }
>    if (GET_MODE_CLASS (mode) == MODE_INT)
> 
> Sorry about that!  Will fix.
> 
> [Maybe in this case the change is safe, since I'm not sure we support
> multiple full-integer modes with the same width.  It's still too subtle
> for a mechanical change like this though.]
> 
> Is that patch OK with that hunk removed?
Let me walk through a few uses again, then the implementation of the
iterators.  Odds are it's fine, but I should look at it deeper than I
have so far.

jeff

  reply	other threads:[~2017-08-11 17:30 UTC|newest]

Thread overview: 175+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-07-13  8:35 [00/77] Add wrapper classes for machine_modes Richard Sandiford
2017-07-13  8:36 ` [01/77] Add an E_ prefix to mode names Richard Sandiford
2017-08-11 16:56   ` Jeff Law
2017-07-13  8:38 ` [02/77] Add an E_ prefix to mode names and update case statements Richard Sandiford
2017-08-11 17:01   ` Jeff Law
2017-07-13  8:38 ` [03/77] Allow machine modes to be classes Richard Sandiford
2017-08-11 17:02   ` Jeff Law
2017-07-13  8:39 ` [05/77] Small tweak to array_value_type Richard Sandiford
2017-08-11 17:50   ` Jeff Law
2017-07-13  8:39 ` [04/77] Add FOR_EACH iterators for modes Richard Sandiford
2017-08-11 17:30   ` Jeff Law
2017-08-11 17:51     ` Richard Sandiford
2017-08-11 17:57       ` Jeff Law [this message]
2017-08-11 18:09   ` Jeff Law
2017-07-13  8:40 ` [06/77] Make GET_MODE_WIDER return an opt_mode Richard Sandiford
2017-08-11 18:11   ` Jeff Law
2017-08-11 19:38     ` Richard Sandiford
2017-08-28 18:35       ` Jeff Law
2017-08-28 19:13         ` Richard Sandiford
2017-08-28 20:56           ` Jeff Law
2017-08-29 15:29             ` Richard Sandiford
2017-08-29 15:42               ` Jeff Law
2017-08-29 15:53                 ` Richard Sandiford
2017-08-29 16:10                   ` Jeff Law
2017-07-13  8:40 ` [07/77] Add scalar_float_mode Richard Sandiford
2017-08-11 18:12   ` Jeff Law
2017-07-13  8:41 ` [08/77] Simplify gen_trunc/extend_conv_libfunc Richard Sandiford
2017-08-11 18:13   ` Jeff Law
2017-07-13  8:41 ` [09/77] Add SCALAR_FLOAT_TYPE_MODE Richard Sandiford
2017-08-11 18:16   ` Jeff Law
2017-07-13  8:42 ` [10/77] Make assemble_real take a scalar_float_mode Richard Sandiford
2017-08-11 18:16   ` Jeff Law
2017-07-13  8:42 ` [12/77] Use opt_scalar_float_mode when iterating over float modes Richard Sandiford
2017-08-11 19:14   ` Jeff Law
2017-07-13  8:42 ` [11/77] Add a float_mode_for_size helper function Richard Sandiford
2017-08-11 18:19   ` Jeff Law
2017-07-13  8:43 ` [14/77] Make libgcc_floating_mode_supported_p take a scalar_float_mode Richard Sandiford
2017-08-11 19:21   ` Jeff Law
2017-07-13  8:43 ` [13/77] Make floatn_mode return an opt_scalar_float_mode Richard Sandiford
2017-08-11 18:25   ` Jeff Law
2017-07-13  8:44 ` [15/77] Add scalar_int_mode Richard Sandiford
2017-08-14 18:38   ` Jeff Law
2017-07-13  8:44 ` [17/77] Add an int_mode_for_size helper function Richard Sandiford
2017-08-14 18:51   ` Jeff Law
2017-07-13  8:44 ` [16/77] Add scalar_int_mode_pod Richard Sandiford
2017-08-14 18:40   ` Jeff Law
2017-07-13  8:45 ` [18/77] Make int_mode_for_mode return an opt_scalar_int_mode Richard Sandiford
2017-08-14 19:16   ` Jeff Law
2017-07-13  8:45 ` [19/77] Add a smallest_int_mode_for_size helper function Richard Sandiford
2017-08-14 19:29   ` Jeff Law
2017-07-13  8:46 ` [21/77] Replace SCALAR_INT_MODE_P checks with is_a <scalar_int_mode> Richard Sandiford
2017-08-14 20:21   ` Jeff Law
2017-07-13  8:46 ` [20/77] Replace MODE_INT checks with is_int_mode Richard Sandiford
2017-08-14 19:32   ` Jeff Law
2017-07-13  8:46 ` [22/77] Replace !VECTOR_MODE_P with is_a <scalar_int_mode> Richard Sandiford
2017-08-14 19:35   ` Jeff Law
2017-07-13  8:47 ` [24/77] Replace a != BLKmode check " Richard Sandiford
2017-08-14 19:50   ` Jeff Law
2017-07-13  8:47 ` [23/77] Replace != VOIDmode checks " Richard Sandiford
2017-08-14 19:50   ` Jeff Law
2017-07-13  8:48 ` [26/77] Use is_a <scalar_int_mode> in subreg/extract simplifications Richard Sandiford
2017-08-15 18:19   ` Jeff Law
2017-07-13  8:48 ` [27/77] Use is_a <scalar_int_mode> before LOAD_EXTEND_OP Richard Sandiford
2017-08-14 20:47   ` Jeff Law
2017-07-13  8:48 ` [25/77] Use is_a <scalar_int_mode> for bitmask optimisations Richard Sandiford
2017-08-14 20:06   ` Jeff Law
2017-07-13  8:49 ` [28/77] Use is_a <scalar_int_mode> for miscellaneous types of test Richard Sandiford
2017-08-15 19:23   ` Jeff Law
2017-07-13  8:49 ` [30/77] Use scalar_int_mode for doubleword splits Richard Sandiford
2017-08-14 21:28   ` Jeff Law
2017-07-13  8:49 ` [29/77] Make some *_loc_descriptor helpers take scalar_int_mode Richard Sandiford
2017-08-14 20:47   ` Jeff Law
2017-07-13  8:50 ` [33/77] Add a NARROWEST_INT_MODE macro Richard Sandiford
2017-08-14 23:46   ` Jeff Law
2017-07-13  8:50 ` [32/77] Check is_a <scalar_int_mode> before calling valid_pointer_mode Richard Sandiford
2017-08-14 21:37   ` Jeff Law
2017-07-13  8:50 ` [31/77] Use scalar_int_mode for move2add Richard Sandiford
2017-08-15 21:16   ` Jeff Law
2017-07-13  8:51 ` [36/77] Use scalar_int_mode in the RTL iv routines Richard Sandiford
2017-08-16 17:27   ` Jeff Law
2017-07-13  8:51 ` [34/77] Add a SCALAR_INT_TYPE_MODE macro Richard Sandiford
2017-08-15 21:19   ` Jeff Law
2017-07-13  8:51 ` [35/77] Add uses of as_a <scalar_int_mode> Richard Sandiford
2017-08-15 22:35   ` Jeff Law
2017-07-13  8:51 ` [37/77] Use scalar_int_mode when emitting cstores Richard Sandiford
2017-08-15 23:29   ` Jeff Law
2017-07-13  8:52 ` [38/77] Move SCALAR_INT_MODE_P out of strict_volatile_bitfield_p Richard Sandiford
2017-08-15 23:50   ` Jeff Law
2017-07-13  8:52 ` [40/77] Use scalar_int_mode for extraction_insn fields Richard Sandiford
2017-08-16 18:25   ` Jeff Law
2017-07-13  8:52 ` [39/77] Two changes to the get_best_mode interface Richard Sandiford
2017-08-16 17:50   ` Jeff Law
2017-07-13  8:53 ` [41/77] Split scalar integer handling out of force_to_mode Richard Sandiford
2017-08-16 18:29   ` Jeff Law
2017-07-13  8:53 ` [42/77] Use scalar_int_mode in simplify_shift_const_1 Richard Sandiford
2017-08-16 18:46   ` Jeff Law
2017-07-13  8:54 ` [46/77] Make widest_int_mode_for_size return a scalar_int_mode Richard Sandiford
2017-08-24  6:15   ` Jeff Law
2017-07-13  8:54 ` [44/77] Make simplify_and_const_int take " Richard Sandiford
2017-08-24  4:29   ` Jeff Law
2017-07-13  8:54 ` [45/77] Make extract_left_shift " Richard Sandiford
2017-08-24  4:30   ` Jeff Law
2017-07-13  8:54 ` [43/77] Use scalar_int_mode in simplify_comparison Richard Sandiford
2017-08-24  4:29   ` Jeff Law
2017-07-13  8:55 ` [47/77] Make subroutines of nonzero_bits operate on scalar_int_mode Richard Sandiford
2017-08-24  6:59   ` Jeff Law
2017-07-13  8:55 ` [49/77] Simplify nonzero/num_sign_bits hooks Richard Sandiford
2017-08-24  9:19   ` Jeff Law
2017-07-13  8:55 ` [48/77] Make subroutines of num_sign_bit_copies operate on scalar_int_mode Richard Sandiford
2017-08-24  9:19   ` Jeff Law
2017-07-13  8:56 ` [52/77] Use scalar_int_mode in extract/store_bit_field Richard Sandiford
2017-08-24 18:21   ` Jeff Law
2017-07-13  8:56 ` [51/77] Use opt_scalar_int_mode when iterating over integer modes Richard Sandiford
2017-08-24 17:28   ` Jeff Law
2017-07-13  8:56 ` [50/77] Add helper routines for SUBREG_PROMOTED_VAR_P subregs Richard Sandiford
2017-08-24  6:17   ` Jeff Law
2017-07-13  8:57 ` [54/77] Add explicit int checks for alternative optab implementations Richard Sandiford
2017-08-24 21:35   ` Jeff Law
2017-07-13  8:57 ` [53/77] Pass a mode to const_scalar_mask_from_tree Richard Sandiford
2017-08-24  6:21   ` Jeff Law
2017-07-13  8:58 ` [57/77] Use scalar_int_mode in expand_expr_addr_expr Richard Sandiford
2017-08-24 21:36   ` Jeff Law
2017-07-13  8:58 ` [55/77] Use scalar_int_mode in simplify_const_unary_operation Richard Sandiford
2017-08-24 21:35   ` Jeff Law
2017-07-13  8:58 ` [56/77] Use the more specific type when two modes are known to be equal Richard Sandiford
2017-08-24  6:22   ` Jeff Law
2017-07-13  8:59 ` [58/77] Use scalar_int_mode in a try_combine optimisation Richard Sandiford
2017-08-24 21:37   ` Jeff Law
2017-07-13  8:59 ` [60/77] Pass scalar_int_modes to do_jump_by_parts_* Richard Sandiford
2017-08-24 21:52   ` Jeff Law
2017-07-13  8:59 ` [59/77] Add a rtx_jump_table_data::get_data_mode helper Richard Sandiford
2017-08-24 21:39   ` Jeff Law
2017-07-13  9:00 ` [61/77] Use scalar_int_mode in the AArch64 port Richard Sandiford
2017-08-24 21:56   ` Jeff Law
2017-09-05  8:49   ` James Greenhalgh
2017-07-13  9:01 ` [64/77] Add a scalar_mode class Richard Sandiford
2017-08-25  5:03   ` Jeff Law
2017-07-13  9:01 ` [62/77] Big machine_mode to scalar_int_mode replacement Richard Sandiford
2017-08-24 21:57   ` Jeff Law
2017-07-13  9:01 ` [63/77] Simplifications after type switch Richard Sandiford
2017-08-24 22:09   ` Jeff Law
2017-07-13  9:02 ` [68/77] Use scalar_mode for is_int_mode/is_float_mode pairs Richard Sandiford
2017-08-25  6:19   ` Jeff Law
2017-07-13  9:02 ` [67/77] Use scalar_mode in fixed-value.* Richard Sandiford
2017-08-25  8:15   ` Jeff Law
2017-07-13  9:02 ` [66/77] Use scalar_mode for constant integers Richard Sandiford
2017-08-25  5:05   ` Jeff Law
2017-08-30 12:56     ` Richard Sandiford
2017-07-13  9:02 ` [65/77] Add a SCALAR_TYPE_MODE macro Richard Sandiford
2017-08-25  5:04   ` Jeff Law
2017-07-13  9:03 ` [71/77] Use opt_scalar_mode for mode iterators Richard Sandiford
2017-08-25 16:46   ` Jeff Law
2017-07-13  9:03 ` [69/77] Split scalar-only part out of convert_mode Richard Sandiford
2017-08-25  8:21   ` Jeff Law
2017-07-13  9:03 ` [70/77] Make expand_fix/float check for scalar modes Richard Sandiford
2017-08-25  8:53   ` Jeff Law
2017-07-13  9:04 ` [72/77] Pass scalar_mode to scalar_mode_supported_p Richard Sandiford
2017-08-25 16:46   ` Jeff Law
2017-07-13  9:04 ` [73/77] " Richard Sandiford
2017-08-25 16:46   ` Jeff Law
2017-07-13  9:05 ` [77/77] Add a complex_mode class Richard Sandiford
2017-08-25 17:43   ` Jeff Law
2017-07-13  9:05 ` [75/77] Use scalar_mode in the AArch64 port Richard Sandiford
2017-08-25 16:48   ` Jeff Law
2017-09-05  8:49   ` James Greenhalgh
2017-07-13  9:05 ` [74/77] Various small scalar_mode changes Richard Sandiford
2017-08-25 17:31   ` Jeff Law
2017-07-13  9:05 ` [76/77] Add a scalar_mode_pod class Richard Sandiford
2017-08-25 17:16   ` Jeff Law
2017-07-22 21:02 ` [00/77] Add wrapper classes for machine_modes Segher Boessenkool
2017-07-24  9:28   ` Richard Sandiford
2017-07-24 10:56     ` Segher Boessenkool
2017-07-24 12:53       ` Richard Sandiford
2017-07-24 13:42         ` Segher Boessenkool
2017-07-24 18:31           ` Richard Biener

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=41f9f8bb-b748-71b4-de2a-da89f09a9419@redhat.com \
    --to=law@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=richard.sandiford@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).