Hello Jeff:

On 21/04/23 2:33 am, Ajit Agarwal via Gcc-patches wrote:
> Hello Jeff:
> 
> On 20/04/23 3:23 am, Jeff Law wrote:
>>
>>
>> On 4/19/23 12:00, Ajit Agarwal wrote:
>>> Hello All:
>>>
>>> This is patch-3 to improve ree pass for rs6000 target.
>>> Main functionality routines to imprve ree pass.
>>>
>>> Bootstrapped and regtested on powerpc64-gnu-linux.
>>>
>>> Thanks & Regards
>>> Ajit
>>>
>>>     ree: Improve ree pass for rs6000 target.
>>>
>>>     For rs6000 target we see redundant zero and sign
>>>     extension and done to improve ree pass to eliminate
>>>     such redundant zero and sign extension. Support of
>>>     zero_extend/sign_extend/AND.
>>>
>>>     2023-04-19  Ajit Kumar Agarwal  <aagar...@linux.ibm.com>
>>>
>>> gcc/ChangeLog:
>>>
>>>     * ree.cc (eliminate_across_bbs_p): Add checks to enable extension
>>>     elimination across and within basic blocks.
>>>     (def_arith_p): New function to check definition has arithmetic
>>>     operation.
>>>     (combine_set_extension): Modification to incorporate AND
>>>     and current zero_extend and sign_extend instruction.
>>>     (merge_def_and_ext): Add calls to eliminate_across_bbs_p and
>>>     zero_extend sign_extend and AND instruction.
>>>     (rtx_is_zext_p): New function.
>>>     (reg_used_set_between_p): New function.
>>>
>>> gcc/testsuite/ChangeLog:
>>>
>>>     * g++.target/powerpc/zext-elim.C: New testcase.
>>>     * g++.target/powerpc/zext-elim-1.C: New testcase.
>>>     * g++.target/powerpc/zext-elim-2.C: New testcase.
>>>     * g++.target/powerpc/sext-elim.C: New testcase.
>>> ---
>>>   gcc/ree.cc                                    | 451 ++++++++++++++++--
>>>   gcc/testsuite/g++.target/powerpc/sext-elim.C  |  18 +
>>>   .../g++.target/powerpc/zext-elim-1.C          |  19 +
>>>   .../g++.target/powerpc/zext-elim-2.C          |  11 +
>>>   gcc/testsuite/g++.target/powerpc/zext-elim.C  |  30 ++
>>>   5 files changed, 482 insertions(+), 47 deletions(-)
>>>   create mode 100644 gcc/testsuite/g++.target/powerpc/sext-elim.C
>>>   create mode 100644 gcc/testsuite/g++.target/powerpc/zext-elim-1.C
>>>   create mode 100644 gcc/testsuite/g++.target/powerpc/zext-elim-2.C
>>>   create mode 100644 gcc/testsuite/g++.target/powerpc/zext-elim.C
>>>
>>> diff --git a/gcc/ree.cc b/gcc/ree.cc
>>> index 413aec7c8eb..053db2e8ff3 100644
>>> --- a/gcc/ree.cc
>>> +++ b/gcc/ree.cc
>>> @@ -253,6 +253,71 @@ struct ext_cand
>>>     static int max_insn_uid;
>>>   +bool
>>> +reg_used_set_between_p (rtx set, rtx_insn *def_insn, rtx_insn *insn
>>> +{
>>> +  if (reg_used_between_p (set, def_insn, insn)
>>> +      || reg_set_between_p (set, def_insn, insn))
>>> +    return true;
>>> +
>>> +  return false;
>>> +}
>> This seems general enough that it should go into the same file as 
>> reg_used_between_p and reg_set_between_p.  It needs a function comment as 
>> well.
>>
>>
>>> +static unsigned int
>>> +rtx_is_zext_p (rtx insn)
>>> +{
>>> +  if (GET_CODE (insn) == AND)
>>> +    {
>>> +      rtx set = XEXP (insn, 0);
>>> +      if (REG_P (set))
>>> +    {
>>> +      if (XEXP (insn, 1) == const1_rtx)
>>> +        return 1;
>>> +    }
>>> +      else
>>> +    return 0;
>>> +    }
>>> +
>>> +  return 0;
>>> +}
>> So my comment from the prior version stands.  Testing for const1_rtx is just 
>> wrong.  The optimization you're trying to perform (If I understand it 
>> correctly) works for many other constants and the set of constants supported 
>> will vary based on the input and output modes.
>>
>> Similarly in rtx_is_zext_p.
>>
>> You still have numerous formatting issues which makes reading the patch more 
>> difficult than it should be.  Please review the formatting guidelines and 
>> follow them.   In particular please review how to indent multi-line 
>> conditionals.
>>
>>
> 
> Currently I support AND with const1_rtx. This is what is equivalent to zero 
> extension instruction in power instruction set. When you specify many other 
> constants and Could you please specify what other constants needs to be 
> supported and how to determine on the Input and output modes.
>>
On top of that I support eliminating zero_extend and sign_extend wherein if 
result mode of def insn not equal to source operand of zero_extend and 
sign_extend.

Thanks & Regards
Ajit
>>
>>
>> You sti
>>> @@ -698,6 +777,226 @@ get_sub_rtx (rtx_insn *def_insn)
>>>     return sub_rtx;
>>>   }
>>>   +/* Check if the def insn is ASHIFT and LSHIFTRT.
>>> +  Inputs: insn for which def has to be checked.
>>> +      source operand rtx.
>>> +   Output: True or false if def has arithmetic
>>> +       peration like ASHIFT and LSHIFTRT.  */
>> This still needs work.  Between the comments and code, I still don't know 
>> what you're really trying to do here.  I can make some guesses, but it's 
>> really your job to write clear comments about what you're doing so that a 
>> review or someone looking at the code in the future don't have to guess.
>>
>> It looks like you want to look at all the reaching definitions of INSN for 
>> ORIG_SRC and if they are ASHIFT/LSHIFTRT do...  what?
>>
>> Why are ASHIFT/LSHIFTRT interesting here?  Why are you looking for them?
>>
>>
>>
>>> +
>>> +/* Find feasibility of extension elimination
>>> +   across basic blocks.
>>> +   Input: candiate to check the feasibility.
>>> +      def_insn of candidate.
>>> +   Output: Returns true or false if feasible or not.  */
>> Function comments should read like complete sentences.  Arguments should be 
>> in all caps.  There are numerous examples in ree.cc you can follow.
>>
>> There's no comments in this code which describe the properties of the 
>> CFG/blocks you are looking for (domination, post-domination, whatever). It's 
>> jsut a series of tests with no clear explanation of what you're looking for 
>> or why any particular test exists.
>>
>> As far as I can tell you're looking at the predecessors of cand->insn and 
>> make some decisions based on what you find.  In some cases you return false 
>> in others you return true.  But there's zero indication of why you do 
>> anything.
>>
>> You're checking RTL in these cases, but I suspect you really want to be 
>> doing some kind of CFG property checks.  But since you haven't described 
>> what you're looking for, I can't make suggestions for the right queries to 
>> make.
>>
>> I stopped trying to review the function at this point.  It needs major work. 
>>  Let's start with the block/CFG properties you're looking for. We'll then 
>> have to go through each section of code and repeat the process.
>>
>> In fact I might recommend pulling the code which is trying to determine CFG 
>> properties into its own function.  Then try to come up with a good name for 
>> that function and a good function comment.
>>
>> THe next chunk of code you start looking at the properties of the candidate 
>> insn.  That seems like it ought to break out into its own function as well.
>>
>> THe process of refactoring, choosing good names and function comments should 
>> make the overall intent of this code clearer.
>>
>>
>>
> 
> I am working on this item and will incorporate them.
> 
> Thanks & Regards
> Ajit
>  
>> After that's done we'll review that work and perhaps go further.
>>
>> jeff

Reply via email to