How do you define your imaginary register in target.h? Can you post
one example of your instruction pattern? 

Bingfeng

> -----Original Message-----
> From: Hariharan Sandanagobalane [mailto:harihar...@picochip.com] 
> Sent: 12 May 2010 16:40
> To: Bingfeng Mei
> Cc: gcc@gcc.gnu.org
> Subject: Re: Machine description question
> 
> Thanks for your help BingFeng.
> 
> I gave this a go and ended up with worse code (and worse 
> memory usage) 
> than before. I started with this experiment because of the compilers 
> "All virtual registers are assumed to be used and clobbered by 
> unspec_volatile" rule. The get/put instructions read/write to 
> registers 
> and the virtual register assigned for them interferes with all the 
> virtual registers in the function. So, they were highly likely to be 
> spilled and use stack instead. I wanted to try to avoid this by the 
> introduction of unspec's and use of imaginary registers.
> 
> But, the virtual registers that are involved in unspec patterns with 
> these imaginary registers still seem to be marked to 
> interfere with all 
> the virtual registers. Is that to be expected? Am i missing something 
> obvious here?
> 
> Regards
> Hari
> 
> Bingfeng Mei wrote:
> > Our architecture has the similar resource, and we use the 
> first approach
> > by creating an imaginary register and dependency between 
> these instructions,
> > i.e., every such instruction reads and write to the special 
> register to
> > create artificial dependency. You may need to add a 
> (unspec:..) as an 
> > independent expression in your pattern to prevent some 
> wrong optimizations. 
> >
> >
> > Cheers,
> > Bingfeng
> >
> >   
> >> -----Original Message-----
> >> From: gcc-ow...@gcc.gnu.org [mailto:gcc-ow...@gcc.gnu.org] On 
> >> Behalf Of Hariharan
> >> Sent: 12 May 2010 11:18
> >> To: gcc@gcc.gnu.org
> >> Subject: Machine description question
> >>
> >> Hello all,
> >> Picochip has communication instructions that allow one array 
> >> element to 
> >> pass data to another. There are 3 such instructions 
> PUT/GET/TSTPORT. 
> >> Currently, all three of these use UNSPEC_VOLATILE side-effect 
> >> expressions to make sure they don't get reordered. But, i 
> >> wonder if it 
> >> is an overkill to use UNSPEC_VOLATILE for this purpose and 
> whether i 
> >> should use UNSPEC instead. The only thing we care here is 
> that they 
> >> don't reordered with respect to each other. It is okay for other 
> >> instructions to move around the communication instructions 
> >> (as long as 
> >> normal scheduler dependencies are taken care of). There are 
> >> possibly one 
> >> of two things i can do.
> >>
> >> 1. Introduce an implicit dependency between all communication 
> >> instructions by adding a use/clobber of an imaginary register.
> >> 2. Introduce explicit dependency between them by using some 
> >> target hook 
> >> to add dependency links. I have not found any appropriate 
> >> target hook to 
> >> do this.
> >>
> >> Can you tell me which one i should try? Has anyone tried 
> >> doing anything 
> >> similar? Any pointers/suggestions on this will be greatly 
> appreciated.
> >>
> >> Thanks
> >> Hari
> >>
> >>
> >>     
> 
> 

Reply via email to