On Thu, Sep 24, 2015 at 06:05:31AM +0000, Guo, Yejun wrote:
> 
> 
> -----Original Message-----
> From: Zhigang Gong [mailto:zhigang.g...@linux.intel.com] 
> Sent: Thursday, September 24, 2015 12:32 PM
> To: Guo, Yejun
> Cc: beignet@lists.freedesktop.org
> Subject: Re: [Beignet] [PATCH V2 3/3] add local copy propagation optimization 
> for each basic block
> 
> On Thu, Sep 24, 2015 at 02:58:22AM +0000, Guo, Yejun wrote:
> > 
> > > +
> > > +  void SelBasicBlockOptimizer::changeInsideReplaceInfos(const
> > > + SelectionInstruction& insn, GenRegister& var)  {
> > > +    for (ReplaceInfo* info : replaceInfos) {
> > > +      if (info->intermedia.reg() == var.reg()) {
> A new comment here is that the above loop is a little bit too heavy.
> For a large BB which has many MOV instructions, it will iterate too many 
> times for instructions after those MOV instructions. A better way is to 
> change to use a new map type of replaceInfos:
> map <ir::Register, set<ReplaceInfo*>>
> 
> This will be much faster than iterate all infos for each instruction.
> 
> [Yejun] nice, I'll change to map.
> 
> > > +        bool replaceable = false;
> > It's better to add a comment here to describe the cases which can't be 
> > replaced and why.
> > 
> > [yejun] actually, I think the code itself explains something, it is much 
> > complex to explain every detail in human words. I consider it as a 
> > nice-to-have since the basic logic is simple.
> I still think it is not that simple. A case just came into my mind which we 
> can't do replacement is:
> 
> MOV %r0, %r1
> ADD %r1, %r1, 1
> ...
> ADD %r10, %r0, 1
> ...
> 
> I'm afraid that your current code can't deal it correctly, right?
> 
> [yejun] current code does nothing for these instructions. It also relatives 
> to constant, maybe add another optimization path to keep every path clear and 
> simple. Or we can consider current code as a basic, and to extend it when 
> find such optimization is necessary.
If my understanding is correct, current code will replace %r0 to %r1 in
the second ADD instruction which breaks the code. This is not an optimize
opportunity, but a bug and must be fixed. The root cause is %r1 has been
modified after copy its value to another register, then we should not
propagate it to the destination register after that modification. For example,
for all instruction after
ADD %r1, %r1, 1,
We could not do the 's/r0/r1'.

> 
> > 
> > > +            uint32_t elements = CalculateElements(var, 
> > > insn.state.execWidth);
> > > +            if (info->elements == elements) {
> > Why not compare each attribute value, such as 
> > vstride_size,hstride_size,.....?
> > 
> > [Yejun] the execWidth is not recorded in the GenRegister, and I once saw 
> > instructions such as:
> > mov(1)  dst (vstride_size or hstride_size is 1/2/... or something 
> > else), src
> > mov(16) anotherdst, dst (with stride as 0)
> > 
> > the dst here is the same, but the strides are different, to handle this 
> > case, I add the function CalculateElements.
> The example you gave here has two different GenRegisters as GenRegister has 
> vstride and hstride members. Right? My previous comment suggests to compare 
> two GenRegistes' attributs and I can't understand your point here.
> 
> [Yejun] Let's use the following SEL IR as an example, %42 is the same 
> register but with two different stride in the two IRs. 
> MOV(1)              %42<2>:D  :       %41<0,1,0>:D
> MOV(16)           %43<1>:D    :       %42<0,1,0>:D
This doesn't address my comment. As the comment suggests to compare the 
GenRegisters' attribute
not the virtual register. You can easily found the above two GenRegisters are 
different.

> 
> 
> Thanks,
> Zhigang Gong.
> 
> > 
> > 
> > 
> > 
> > The other parts LGTM,
> > 
> > Thanks,
> > Zhigang Gong
_______________________________________________
Beignet mailing list
Beignet@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/beignet

Reply via email to