On 21 October 2023 01:56:16 CEST, Vineet Gupta <[email protected]> wrote:
>On 10/19/23 23:50, Ajit Agarwal wrote:
>> Hello All:
>>
>> This version 9 of the patch uses abi interfaces to remove zero and sign
>> extension elimination.
>> Bootstrapped and regtested on powerpc-linux-gnu.
>>
>> In this version (version 9) of the patch following review comments are
>> incorporated.
>>
>> a) Removal of hard code zero_extend and sign_extend in abi interfaces.
>> b) Source and destination with different registers are considered.
>> c) Further enhancements.
>> d) Added sign extension elimination using abi interfaces.
>
>As has been trend in the past, I don't think all the review comments have been
>addressed.
And apart from that, may I ask if this is just me, or does anybody else think
that it might be worthwhile to actually read a patch before (re-)posting?
Seeing e.g. the proposed abi_extension_candidate_p as written in a first POC
would deserve some manual CSE, if nothing more then for clarity and conciseness?
Just curious from a meta perspective..
And:
>> ree: Improve ree pass for rs6000 target using defined abi interfaces
mentioning powerpc like this, and then changing generic code could be
interpreted as misleading, IMHO.
>>
>> For rs6000 target we see redundant zero and sign extension and done
>> to improve ree pass to eliminate such redundant zero and sign extension
>> using defined ABI interfaces.
Mentioning powerpc in the body as one of the affected target(s) is of course
fine.
>> +/* Return TRUE if target mode is equal to source mode of zero_extend
>> + or sign_extend otherwise false. */
, false otherwise.
But I'm not a native speaker
>> +/* Return TRUE if the candidate insn is zero extend and regno is
>> + a return registers. */
>> +
>> +static bool
>> +abi_extension_candidate_return_reg_p (/*rtx_insn *insn, */int regno)
Leftover debug comment.
>> +{
>> + if (targetm.calls.function_value_regno_p (regno))
>> + return true;
>> +
>> + return false;
>> +}
>> +
As said, I don't see why the below was not cleaned up before the V1 submission.
Iff it breaks when manually CSEing, I'm curious why?
>> +/* Return TRUE if reg source operand of zero_extend is argument registers
>> + and not return registers and source and destination operand are same
>> + and mode of source and destination operand are not same. */
>> +
>> +static bool
>> +abi_extension_candidate_p (rtx_insn *insn)
>> +{
>> + rtx set = single_set (insn);
>> + machine_mode dst_mode = GET_MODE (SET_DEST (set));
>> + rtx orig_src = XEXP (SET_SRC (set), 0);
>> +
>> + if (!FUNCTION_ARG_REGNO_P (REGNO (orig_src))
>> + || abi_extension_candidate_return_reg_p (/*insn,*/ REGNO (orig_src)))
On top, debug leftover.
>> + return false;
>> +
>> + /* Mode of destination and source should be different. */
>> + if (dst_mode == GET_MODE (orig_src))
>> + return false;
>> +
>> + machine_mode mode = GET_MODE (XEXP (SET_SRC (set), 0));
>> + bool promote_p = abi_target_promote_function_mode (mode);
>> +
>> + /* REGNO of source and destination should be same if not
>> + promoted. */
>> + if (!promote_p && REGNO (SET_DEST (set)) != REGNO (orig_src))
>> + return false;
>> +
>> + return true;
>> +}
>> +
As said, please also rephrase the above (and everything else if it obviously
looks akin the above).
The rest, mentioned below, should largely be covered by following the coding
convention.
>> +/* Return TRUE if the candidate insn is zero extend and regno is
>> + an argument registers. */
Singular register.
>> +
>> +static bool
>> +abi_extension_candidate_argno_p (/*rtx_code code, */int regno)
Debug leftover.
I would probably have inlined this function manually, with a respective comment.
Did not look how often it is used, admittedly.
>> +{
>> + if (FUNCTION_ARG_REGNO_P (regno))
>> + return true;
>> +
>> + return false;
>> +}
[]
>> +
>> /* This function goes through all reaching defs of the source
s/This function goes/Go/
>> of the candidate for elimination (CAND) and tries to combine
(of, ?didn't look) candidate CAND for eliminating
>> the extension with the definition instruction. The changes
defining
Pre-existing, I know.
But you could fix those in a preparatory patch while you touch surrounding code.
This is not a requirement, of course, just good habit, IMHO.
>> @@ -770,6 +889,11 @@ combine_reaching_defs (ext_cand *cand, const_rtx
>> set_pat, ext_state *state)
>> state->defs_list.truncate (0);
>> state->copies_list.truncate (0);
>> + rtx orig_src = XEXP (SET_SRC (cand->expr),0);
>> +
>> + if (abi_extension_candidate_p (cand->insn)
>> + && (!get_defs (cand->insn, orig_src, NULL)))
Excess braces.
Hopefully check_gnu_style would have complained.
>> + return abi_handle_regs (cand->insn);
>> outcome = make_defs_and_copies_lists (cand->insn, set_pat, state);
>> @@ -1036,6 +1160,15 @@ combine_reaching_defs (ext_cand *cand, const_rtx
>> set_pat, ext_state *state)
>> }
>> }
>> + rtx insn_set = single_set (cand->insn);
>> +
>> + machine_mode mode = (GET_MODE (XEXP (SET_SRC (insn_set), 0)));
Excess braces.
Also in a lot of other spots in your patch.
Please read the coding conventions and the patch, once again, before submission?
thanks