Remove <def,read-undef> flags from partial redefinitions.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Thu, 27 Sep 2012 23:31:32 +0000 (23:31 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Thu, 27 Sep 2012 23:31:32 +0000 (23:31 +0000)
The new coalescer can turn a full virtual register definition into a
partial redef by merging another value into an unused vector lane.

Make sure to clear the <read-undef> flag on such defs.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@164807 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/RegisterCoalescer.cpp

index eb4ffe17a1ece65a56e8c077f5db785bea106e3f..f45072f1ac56b69148fa395ee3a8852cc55302e0 100644 (file)
@@ -1732,6 +1732,12 @@ void JoinVals::pruneValues(JoinVals &Other,
     case CR_Replace:
       // This value takes precedence over the value in Other.LI.
       LIS->pruneValue(&Other.LI, Def, &EndPoints);
+      // Remove <def,read-undef> flags. This def is now a partial redef.
+      if (!Def.isBlock())
+        for (MIOperands MO(Indexes->getInstructionFromIndex(Def));
+             MO.isValid(); ++MO)
+          if (MO->isReg() && MO->isDef() && MO->getReg() == LI.reg)
+            MO->setIsUndef(false);
       DEBUG(dbgs() << "\t\tpruned " << PrintReg(Other.LI.reg) << " at " << Def
                    << ": " << Other.LI << '\n');
       break;