[llvm] [X86][NFC] Reorder the registers to reduce unnecessary iterations (PR #70222)

Shengchen Kan via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 25 20:48:12 PDT 2023


================
@@ -406,11 +406,11 @@ bool LiveVariables::HandlePhysRegKill(Register Reg, MachineInstr *MI) {
   return true;
 }
 
-void LiveVariables::HandleRegMask(const MachineOperand &MO) {
+void LiveVariables::HandleRegMask(const MachineOperand &MO, unsigned NumRegs) {
   // Call HandlePhysRegKill() for all live registers clobbered by Mask.
   // Clobbered registers are always dead, sp there is no need to use
   // HandlePhysRegDef().
-  for (unsigned Reg = 1, NumRegs = TRI->getNumRegs(); Reg != NumRegs; ++Reg) {
+  for (unsigned Reg = 1; Reg != NumRegs; ++Reg) {
----------------
KanRobert wrote:

I did an analysis on the spent time there https://github.com/llvm/llvm-project/pull/67702#issuecomment-1767656271.

The extra time is spent on iterations over the new registers and new register classes. LiveVariables is one of the passes with the greatest impact b/c it iterates them for each basic block. Besides, for LiveVariables and some other passes, the new registers make a bigger regmask and regset. The operations on the regmask and regset take more time too, including allocation and loopup, etc.

`MRI->isReserved(Reg)`? I think it's a AArch64 function only and even not used by X86 at all.

> Am I reading this right, that it calls HandlePhysRegKill on the super register anytime it finds one of the subregisters is clobbered? Even if its already called it before?

My understanding is same as yours. 

https://github.com/llvm/llvm-project/pull/70222


More information about the llvm-commits mailing list