RegisterCoalescer: Do not remove IMPLICIT_DEFS if they are required for subranges.
authorMatthias Braun <matze@braunis.de>
Thu, 8 Jan 2015 00:21:23 +0000 (00:21 +0000)
committerMatthias Braun <matze@braunis.de>
Thu, 8 Jan 2015 00:21:23 +0000 (00:21 +0000)
The register coalescer used to remove implicit_defs when they are
covered by the main range anyway. With subreg liveness tracking we can't
do that anymore in places where the IMPLICIT_DEF is required as begin of
a subregister liverange.

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

lib/CodeGen/RegisterCoalescer.cpp

index 7a0c36ee347910fd50801d5de39d80915bddd7af..200ad137aeadad0bf617dfac4de728cfae945ad9 100644 (file)
@@ -1912,8 +1912,14 @@ JoinVals::analyzeValue(unsigned ValNo, JoinVals &Other) {
     return CR_Replace;
 
   // Check for simple erasable conflicts.
-  if (DefMI->isImplicitDef())
+  if (DefMI->isImplicitDef()) {
+    // We need the def for the subregister if there is nothing else live at the
+    // subrange at this point.
+    if (TrackSubRegLiveness
+        && (V.WriteLanes & (OtherV.ValidLanes | OtherV.WriteLanes)) == 0)
+      return CR_Replace;
     return CR_Erase;
+  }
 
   // Include the non-conflict where DefMI is a coalescable copy that kills
   // OtherVNI. We still want the copy erased and value numbers merged.