[llvm-dev] Instruction Dependency Information in Register Allocation

hameeza ahmed via llvm-dev llvm-dev at lists.llvm.org
Mon Aug 28 21:36:43 PDT 2017


Hello,

I have added a new function in register allocation stage
(AllocationOrder.h) file to define the physical register allocation order.
There i require the information of instructions dependency.

For example:

if my register allocationorder is {R_0_Reg_0, R_0_Reg_1, R_0_Reg_2,
R_0_Reg_3, R_0_Reg_4, R_0_Reg_5, R_0_Reg_6, R_0_Reg_7, R_1_Reg_0,
R_1_Reg_1, R_1_Reg_2, R_1_Reg_3, R_1_Reg_4, R_1_Reg_5, R_1_Reg_6,
R_1_Reg_7.....................................R_31_Reg_7}

then my algorithm should do;

if there exists dependency between instruction (or if 2 independent
instructions are predecessors of another instruction)  then
PhysReg=(PhysReg+1) mod 8.
otherwise, if there is no dependency then PhysReg=(PhysReg+8) mod 32 i.e
new R

for now i make this function in AllocationOrder.h

unsigned nextP(int count) {

  unsigned Limit = 0;
  int Prev;
  Prev=Pos;
    if (Pos < 0)
    {

    if (count%2==0)   ///here i need the dependency information
    {

    Pos=Pos+8;
    }

    else
    {
      Pos=Pos-7;

}
  return Hints.end()[Prev];}
    if (!Limit)
      Limit = Order.size();
    while (Pos < int(Limit)) {
    if (count%2==0)
    {

    Pos=Pos+8;
    }

    else
    {
      Pos=Pos-7;

}
      unsigned Reg = Order[Prev];
      if (!isHint(Reg))
        return Reg;
    }
    return 0;
  }
This is called in RegAllocGreedy.cpp.

 while ((PhysReg = Order.nextP(count)))
{
count++;
if (!Matrix->checkInterference(VirtReg, PhysReg))
      break;

  }

so after correct implementation my emitted assembly should be;

1. P_256B_LOAD_DWORD R_0_Reg_0, Pword ptr [rip + b]
2. P_256B_LOAD_DWORD R_1_Reg_0, Pword ptr [rip + b+256] //  instruction 2
is not dependent on instruction 1 here increment order index by 8 and get
R_1
3. P_256B_LOAD_DWORD R_0_Reg_1, Pword ptr [rip + c] // //  instruction 3 is
not dependent on instruction 1 but both will contribute towards ADD so here
increment order index by 1 and get Reg_1
4. P_256B_LOAD_DWORD R_1_Reg_1, Pword ptr [rip + c+256] //  instruction 4
is not dependent on instruction 2 but both will contribute towards ADD so
here increment order index by 1 and get Reg_1
5. P_256B_VADD R_0_Reg_0, R_0_Reg_1, R_0_Reg_0 //  instruction 5 is
 dependent on instruction 1 and 3 here keep R_0
6. P_256B_VADD R_1_Reg_0, R_1_Reg_1, R_1_Reg_0 //  instruction 6 is
 dependent on instruction 2 and 4 here keep R_1


I think I am close the only information i need is instruction dependency
information such that instruction 1, 3, 5 lie in 1 group while 2, 4, 6 lie
in another.

Can someone point me any data structure, function? that i can use at this
point to get dependency information??

Please help.

Thank You
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170829/bfc4e2ac/attachment.html>


More information about the llvm-dev mailing list