Jeff Law <l...@redhat.com> writes:
> On 08/21/2017 07:34 AM, Richard Sandiford wrote:
>> This patch adds a partial_subreg_p predicate to go alongside
>> paradoxical_subreg_p.
>> 
>> The first two changes to cse_insn preserve the current behaviour,
>> but the condition seems strange.  Shouldn't we be able to continue
>> to cse if the inner modes of the two subregs have the same size?
> I would think so.  It could well be a simple oversight.  We're talking
> about very old code -- this stuff is virtually unchanged in 25 years.
>
> This specific chunk of code is something I would like to look more
> deeply into its utility -- most of what it's doing should be handled by
> DOM these days.  It'd be an interesting exercise to see if this code is
> important at all anymore.

OK.  When I get some spare machine time, I might try putting a
gcc_unreachable () there and doing the usual multi-target testing,
just to see if or when it fires.

> If you wanted to handle that case, I wouldn't object as a follow-up if
> you can come up with a testcase that shows when its useful.
>
>
>> The patch also preserves the existing condition in
>> simplify_operand_subreg, but perhaps it should be using
>> a df_read_modify_subreg_p-style check instead.  We don't
>> need to reload the inner value first if the inner value
>> is no bigger than a word, for example.
> Not sure on this one.  We could try to change it as a follow-up though.
> Vlad may have a better sense of how this might interact with other parts
> of LRA than I would

I'll give this one a go too.

>> The use in curr_insn_transform also seemed strange.  Surely the
>> modes of the SET_DEST and SET_SRC will be the same, given that
>> this code isn't meant for constants?
> Is it possible this is for the zero/sign extension support?

Even then I don't think we could ever have SET_SRC and SET_DEST being
different.  The extension has to be explicit in the source.

>> 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.
>> 
>> Doing this in regcprop.c 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 values 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.
>> 
>> Tested on aarch64-linux-gnu and x86_64-linux-gnu in addition to the above.
>> OK to install?
>> 
>> Richard
>> 
>> 
>> 2017-08-21  Richard Sandiford  <richard.sandif...@linaro.org>
>>          Alan Hayward  <alan.hayw...@arm.com>
>>          David Sherwood  <david.sherw...@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.
>>      * df-scan.c (df_read_modify_subreg_p): 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.
> Any thought on whether or not a same size subreg predicate would be
> useful.  ie, (subreg:SI (reg:SF)) and the like.  Certainly not something
> you have to do to go forward, just something to ponder.

Yeah, it might be worth having that too if there are a few instances
of it.  I'll keep an eye out.

> The patch is OK for the trunk.  The issues noted above all seem like
> potentially follow-up items if we want to tackle them at all.

Thanks,
Richard

>
> jeff

Reply via email to