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
next prev parent 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).