[llvm] r261450 - Don't scan for SSA register operands to update when not in SSA form.

Dan Gohman via llvm-commits llvm-commits at lists.llvm.org
Sat Feb 20 13:28:18 PST 2016


Author: djg
Date: Sat Feb 20 15:28:18 2016
New Revision: 261450

URL: http://llvm.org/viewvc/llvm-project?rev=261450&view=rev
Log:
Don't scan for SSA register operands to update when not in SSA form.

TailDuplicate can run on either on SSA code or non-SSA code, as indicated to
it by MRI->isSSA() ("PreRegAlloc" here). TailDuplicate does extra work to
preserve SSA invariants when it duplicates code. This patch makes it skip
some of this extra work in the case where the code is not in SSA form.

Modified:
    llvm/trunk/lib/CodeGen/TailDuplication.cpp

Modified: llvm/trunk/lib/CodeGen/TailDuplication.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/TailDuplication.cpp?rev=261450&r1=261449&r2=261450&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/TailDuplication.cpp (original)
+++ llvm/trunk/lib/CodeGen/TailDuplication.cpp Sat Feb 20 15:28:18 2016
@@ -429,28 +429,30 @@ void TailDuplicatePass::DuplicateInstruc
                                      DenseMap<unsigned, unsigned> &LocalVRMap,
                                      const DenseSet<unsigned> &UsedByPhi) {
   MachineInstr *NewMI = TII->duplicate(MI, MF);
-  for (unsigned i = 0, e = NewMI->getNumOperands(); i != e; ++i) {
-    MachineOperand &MO = NewMI->getOperand(i);
-    if (!MO.isReg())
-      continue;
-    unsigned Reg = MO.getReg();
-    if (!TargetRegisterInfo::isVirtualRegister(Reg))
-      continue;
-    if (MO.isDef()) {
-      const TargetRegisterClass *RC = MRI->getRegClass(Reg);
-      unsigned NewReg = MRI->createVirtualRegister(RC);
-      MO.setReg(NewReg);
-      LocalVRMap.insert(std::make_pair(Reg, NewReg));
-      if (isDefLiveOut(Reg, TailBB, MRI) || UsedByPhi.count(Reg))
-        AddSSAUpdateEntry(Reg, NewReg, PredBB);
-    } else {
-      DenseMap<unsigned, unsigned>::iterator VI = LocalVRMap.find(Reg);
-      if (VI != LocalVRMap.end()) {
-        MO.setReg(VI->second);
-        // Clear any kill flags from this operand.  The new register could have
-        // uses after this one, so kills are not valid here.
-        MO.setIsKill(false);
-        MRI->constrainRegClass(VI->second, MRI->getRegClass(Reg));
+  if (PreRegAlloc) {
+    for (unsigned i = 0, e = NewMI->getNumOperands(); i != e; ++i) {
+      MachineOperand &MO = NewMI->getOperand(i);
+      if (!MO.isReg())
+        continue;
+      unsigned Reg = MO.getReg();
+      if (!TargetRegisterInfo::isVirtualRegister(Reg))
+        continue;
+      if (MO.isDef()) {
+        const TargetRegisterClass *RC = MRI->getRegClass(Reg);
+        unsigned NewReg = MRI->createVirtualRegister(RC);
+        MO.setReg(NewReg);
+        LocalVRMap.insert(std::make_pair(Reg, NewReg));
+        if (isDefLiveOut(Reg, TailBB, MRI) || UsedByPhi.count(Reg))
+          AddSSAUpdateEntry(Reg, NewReg, PredBB);
+      } else {
+        DenseMap<unsigned, unsigned>::iterator VI = LocalVRMap.find(Reg);
+        if (VI != LocalVRMap.end()) {
+          MO.setReg(VI->second);
+          // Clear any kill flags from this operand.  The new register could have
+          // uses after this one, so kills are not valid here.
+          MO.setIsKill(false);
+          MRI->constrainRegClass(VI->second, MRI->getRegClass(Reg));
+        }
       }
     }
   }




More information about the llvm-commits mailing list