[llvm-dev] Conditional Register Assignment based on the no of loop iterations

Matthias Braun via llvm-dev llvm-dev at lists.llvm.org
Mon Jul 10 19:48:48 PDT 2017


Are you asking for software pipelining? There is a MachinePipeliner pass that targets can put into their pass pipeline.

- Matthias

> On Jul 10, 2017, at 3:46 AM, hameeza ahmed via llvm-dev <llvm-dev at lists.llvm.org> wrote:
> 
> can someone suggest me solution for this problem??
> Need serious help. My work is stuck............
> 
> On Mon, Jul 10, 2017 at 10:22 AM, hameeza ahmed <hahmed2305 at gmail.com <mailto:hahmed2305 at gmail.com>> wrote:
> Here basically my problem is vector width since i have used v64i32 in my backend. now if vector width=64. i want the Reg_B class registers to be assigned and if vector width=2048 i want Reg_A registers to be assigned to instruction. 
> 
> Should i incorporate the solution in lowering stage? some thing like;
> 
> addRegisterClass(MVT::v2048i32, &X86::Reg_B);
> 
>               setOperationAction(ISD::MNLOAD,               MVT::v2048i32, custom);
> 
> then in function LowerOperation(SDValue Op, SelectionDAG &DAG)
> 
> i should do,
> 
>   case ISD::MNLOAD:               return LOAD2048(Op, Subtarget, DAG);
> 
> then i will implement
> static SDValue LOAD2048(SDValue Op, const X86Subtarget &Subtarget,
>                           SelectionDAG &DAG)
> {
> 
> //dont know the details of this part
> but here i plan to encode 2048 elements again in 32 v64i32 but with different instruction name like previously it was 
> load<LD256; i intend to make it load<LD256_N
> 
> so that in instructioninfo.td <http://instructioninfo.td/> while pattern matching both LD256 and LD256_N are treated separately. 1 will use Reg_B registers and other will use Reg_A respectively.
> 
> 
> Is it fine??? 
> Please guide me...
> I need serious help, please.....
> 
> Thank You
> 
> 
> 
> On Mon, Jul 10, 2017 at 9:29 AM, hameeza ahmed <hahmed2305 at gmail.com <mailto:hahmed2305 at gmail.com>> wrote:
> or should i write a condition in registerinfo.td <http://registerinfo.td/>; to define the registers in object Reg_A in specific order according to loop iterations.
> 
> On Mon, Jul 10, 2017 at 9:17 AM, hameeza ahmed <hahmed2305 at gmail.com <mailto:hahmed2305 at gmail.com>> wrote:
> hello,
> 
> i have a situation where i have to assign the registers to instructions based on the loop iterations.
> 
> for eg.. 
> the registers are: 
> R_0_V_0, R_0_V_1, R_0_V_2, R_0_V_3,
> R_1_V_0, R_1_V_1, R_1_V_2, R_1_V_3,
> R_2_V_0, R_2_V_1, R_2_V_2, R_2_V_3.
> These registers defined in object Reg_A
> 
> These are total 12 registers. will use them contiguously, here i  define it in above mentioned order i.e changing V first then R.
> 
> 
> for eg;
> if no of iterations>=4.
> 1st load will take place in R_0_V_0
> 2nd load will take place in R_0_V_1
> 3rd load will take place in R_0_V_2
> 4th load will take place in R_0_V_3
> I am getting this required behavior for iterations>=4. I want this to happen only if there are 4 or above iterations in loop.
> 
> 
> But if my iterations are less than 4 like 3
> again it will do the same thing;
> 1st load will take place in R_0_V_0
> 2nd load will take place in R_0_V_1
> 3rd load will take place in R_0_V_2
> 
> Here i dont want the above to happen rather it should increment R instead of V in this case.
> It should do something as follows:
> 1st load to take place in R_0_V_0
> 2nd load to take place in R_1_V_0
> 3rd load to take place in R_2_V_0
> 
> Now, how to achieve this?
> 
> Can i mention some condition in instructioninfo.td <http://instructioninfo.td/> file? 
> and in registerinfo.td <http://registerinfo.td/> file instead of 1 object Reg_A, there will be 2 objects Reg_A and Reg_B
> where Reg_B defines same registers but in different order.
> 
> Reg_B;
> 
> R_0_V_0, R_1_V_0, R_2_V_0,  //here R changes
> R_0_V_1, R_1_V_1, R_2_V_1, 
> R_0_V_2, R_1_V_2, R_2_V_2, 
> R_0_V_3, R_1_V_3, R_2_V_3.
> 
> So that in instructioninfo.td <http://instructioninfo.td/> file it will be something like;
> 
> if (no of iterations>=4)
> 
> load ................$Reg_A      ; here all register operands will come from Reg_A instance.
> 
> if (no of iterations<4)
> 
> load ................$Reg_B      ; here all register operands will come from Reg_B instance.
> 
> 
> Is the above approach possible??? if yes then how can we acquire the no of iterations in instructioninfo.td <http://instructioninfo.td/> file??
> 
> or can you suggest some better way?
> 
> Looking forward to response
> 
> Thank You.
> 
> 
> 
> 
> 
> 
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170710/5e843f74/attachment.html>


More information about the llvm-dev mailing list