LiveVariables: Do not remove dead flags from vreg operands
authorMatthias Braun <matze@braunis.de>
Tue, 29 Mar 2016 03:08:18 +0000 (03:08 +0000)
committerMatthias Braun <matze@braunis.de>
Tue, 29 Mar 2016 03:08:18 +0000 (03:08 +0000)
Also add a FIXME comment on why Mips RDDSP causes bogus dead flags to be
added which LiveVariables cleans up by accident.

llvm-svn: 264695

llvm/lib/CodeGen/LiveVariables.cpp

index 78ede3e..b153260 100644 (file)
@@ -527,9 +527,14 @@ void LiveVariables::runOnInstr(MachineInstr *MI,
         MO.setIsKill(false);
       if (MO.readsReg())
         UseRegs.push_back(MOReg);
-    } else /*MO.isDef()*/ {
-      if (!(TargetRegisterInfo::isPhysicalRegister(MOReg) &&
-            MRI->isReserved(MOReg)))
+    } else {
+      assert(MO.isDef());
+      // FIXME: We should not remove any dead flags. Howeve the MIPS RDDSP
+      // instruction needs it at the moment: RDDSP gets its implicit use
+      // operands added too late in the processing so InstrEmitter adds an
+      // incorrect dead flag because the uses are not yet visible.
+      if (TargetRegisterInfo::isPhysicalRegister(MOReg) &&
+          !MRI->isReserved(MOReg))
         MO.setIsDead(false);
       DefRegs.push_back(MOReg);
     }