<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/60378>60378</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            TableGen generate RegMask doesn't contain Alias Register result in liveRegUnit analysis problem
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          emelife
      </td>
    </tr>
</table>

<pre>
    Version: LLVM 12.x  
1. CSR Register mask doesn't contain alias register  
```c++
    // Emit the *_RegMask bit mask of call-preserved registers.
    BitVector Covered = RegBank.computeCoveredRegisters(*Regs);
    ...
    OS << "static const uint32_t " << CSRSet->getName()
       << "_RegMask[] = { ";
    printBitVectorAsHex(OS, Covered, 32);
    OS << "};\n";
  }

BitVector CodeGenRegBank::computeCoveredRegisters(ArrayRef<Record*> Regs) {
  SetVector<const CodeGenRegister*> Set;

  // First add Regs with all sub-registers.
  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
    CodeGenRegister *Reg = getReg(Regs[i]);
    if (Set.insert(Reg))
      // Reg is new, add all sub-registers.
      // The pre-ordering is not important here.
      Reg->addSubRegsPreOrder(Set, *this);
  }
 ...
}
```  
tablegen generate regmask only search register's super and sub register, doesn't search it's alias, so that alias register doesn't be masked  

2. XXXRegUnitRoots combines all alias register as one unit in it
```c++
extern const MCPhysReg HiIPURegUnitRoots[][2] = {
...
{ XXX::Xhf21, XXX::Xyf21 },
...
}
```   
Xhf21 and Xyf21 are alias, they all belong to X21

3. LiveRegUnits Problem
```c++
void LiveRegUnits::removeRegsNotPreserved(const uint32_t *RegMask) {
  for (unsigned U = 0, E = TRI->getNumRegUnits(); U != E; ++U) {
    for (MCRegUnitRootIterator RootReg(U, TRI); RootReg.isValid(); ++RootReg) {  // Here checks all regiters of one unit if it is masked in regmask.
      if (MachineOperand::clobbersPhysReg(RegMask, *RootReg))  //  In my case  Xhf21 is masked but Xyf21 is not. so that reset X21 is and result in LiveRegUnit incorrect.
        Units.reset(U);
    }
  }
}

void LiveRegUnits::stepBackward(const MachineInstr &MI) {
  // Remove defined registers and regmask kills from the set.
  for (const MachineOperand &MOP : phys_regs_and_masks(MI)) {
    if (MOP.isRegMask()) {
      removeRegsNotPreserved(MOP.getRegMask());
      continue;
    }

    if (MOP.isDef())
      removeReg(MOP.getReg());
  }

  // Add uses to the set.
  for (const MachineOperand &MOP : phys_regs_and_masks(MI)) {
    if (!MOP.isReg() || !MOP.readsReg())
      continue;
    addReg(MOP.getReg());
  }
}
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8V11P6zoW_TXuyxZR65w25aEPbYB7kA4X1B4Qb8iJdxMPqV3ZDpzOrx_ZzmcLdzQvI6HSxt5fa6-97DBjRCERV2S-IfObCattqfQKD1iJPU4yxU-rF9RGKEniNfz69fIAMxr9ASDTGzJdzyJId1vYYiGMRQ0HZt6BKzSS0MRCrqRlQgKrBDOg212NMVlMw19O6Mb9-acAAITeEXoHtwdhwZYIhK7ftlg8OO-ZsCGM2kPOqurqqNGg_kDeBTBR72oj7AvmVmlI1Qdq5EDiG5fwhsn3KFeHY22xWWrLMIQuCV1vsTCEXpN4kFkUDXw_7oDEKYlTIJQay6zIXcnGQi2kjembdQvtnnS33aG9IvFtgfZvdkAf5bp35wrv3LX1hsb4pEmycSujfI5aSNvVuDY_8Q-hy8cdoWlbsPsa0_NCRrmT5MYtzlM59u-eh1b5zyGWHP9C2cBI4jWJ199judaanba4J3G6xVxpTuiaxLfQAOwKayPusAlB4jRA2Yfy_hrTHdouzy7bwJo7oY0Fxrn3D5_ClsCqCkydXV0yZK80ELqspR8EDsJDPXWgYUsVExnx77Zd8cbtoTO3hu5XIK84KwTOE4fAKO-zQLvFgtClR2C-EWR-c94gsXd57dBGQhrUNux2u8acaap2roUBiZ8udVf99zUPzH6XCEeNV0pz1EIGH8qCOByVtkxaKFHjyHKLhSMx43xXZ66AJ42Pzjyk68ITuralOBuejkz9EPX8aqWg1QbLsgoLlFCgRM0suuEOYy-rExhkOi-7gSc0MWDqI2pgkruqB0vpQJAaO2G9hZclcntHNilZpmAU2JLZc7XqrTP0yoO8UzD_SSN4fX3dYvEshd0qZQ3k6pAJicY34cwfM6AkQi2FBSFdLv-ghvjHopaNqjykT-XJuE7_FPdPz8OIQSbIfEMHahFcDNDeuETDtL6Wezpz4PRPTns6812i6YXlZZ8aCLwfj3qwZxobXGnqtPvkIciwUrIAq-CVzobYxRH8Eh_YlGLgSauswsM_QfKhBB8ZhfQ1HpR_Zv5W9qk9EwhdXijyupXW8cSeK8FzrwS3_uvv7X2r3vWhC96pwnOrCre9KjxfqEIT5SEddO_eOoorDe5HEIZnF_b39r7x3SxEwrywSvA-aAjT2flg3XD_RI2Ql5i_ByI6CjohcEdnT8E9uE_TUlvIdtRGUx_k6IHlpZD4eETNJG90v1JZhto03Aw6FfD1StAn5_Jrc4N7CYcT5MwgQCBRn0NW24ZOQY6ibjZdX60jkVtxrNNo6soP0oASIGSutMbcjmoA8C2LvJMA8lhze4kaHH3jM_Ab9hmLxw3L3z-Z7jnXoHUvjXVNXzzcn9Gh025HXeC4F3J4jWkKDLr3LqrKwF6rg78SGbTnZ9goaNMiH_bxCdzt7ViezJvGwrwxyd-cU8den9QFTZt2Pz5FwnTtXH61E-DbyXPm4agb2Y8gB39JFLLGrzvxdUo3uO_dfZXKKPpXkS8CNL1Ycw61QeO06v-GM6GzDuqQLJAkJYmbH7-ikXEzquS_Acg4_99guJD48HPCVzG_jq_ZBFezRTKfLpaLeDYpV4v5fja7zvg8z1iSJRlN-ILP-TThP_Y8mWcTsaJTGk9n8XS6nE_jWTSPsx9Jch1PE7acLTNOfkzxwEQVVdXHIVK6mAhjalwtpnGynFQsw8r4FxNKJX6CX3T30_nNRK-czVVWF4b8mFbCWNN7scJWuPrtbhB_DW8Q7RvE5fvJ2p_Q3U2t15RqoClMsupkhIFjOKMmta5WpbVHLwGePYWwZZ25twpC71w-zb-ro1b_wtwSeuerMITe-Sr_EwAA__8udfKg">