Do not share a single unknown val# for all the live ranges merged into a physical...
authorEvan Cheng <evan.cheng@apple.com>
Sat, 25 Apr 2009 09:25:19 +0000 (09:25 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Sat, 25 Apr 2009 09:25:19 +0000 (09:25 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@70026 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/LiveInterval.h
lib/CodeGen/LiveInterval.cpp
test/CodeGen/X86/2009-04-25-CoalescerBug.ll [new file with mode: 0644]

index 00b51a16f1ea381738f2af774cb404585a022576..d6f5c8484e423fae15f280f9992e23df21d35ea6 100644 (file)
@@ -213,10 +213,6 @@ namespace llvm {
       return VNI;
     }
 
-    /// getUnknownValNo - Find a value# for unknown values, if there isn't one
-    /// create a new one.
-    VNInfo *getUnknownValNo(BumpPtrAllocator &VNInfoAllocator);
-
     /// addKill - Add a kill instruction index to the specified value
     /// number.
     static void addKill(VNInfo *VNI, unsigned KillIdx) {
index 68d9ad4b3e658fd2a43311a0550c7a9bcc372442..39d66117ad43e719326c112656908ea65d1a3a6b 100644 (file)
@@ -19,6 +19,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/CodeGen/LiveInterval.h"
+#include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/SmallSet.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/Support/Streams.h"
@@ -567,20 +568,6 @@ void LiveInterval::MergeValueInAsValue(const LiveInterval &RHS,
   }
 }
 
-VNInfo *LiveInterval::getUnknownValNo(BumpPtrAllocator &VNInfoAllocator) {
-  unsigned i = getNumValNums();
-  if (i) {
-    do {
-      --i;
-      VNInfo *VNI = getValNumInfo(i);
-      if (VNI->def == ~0U && !VNI->copy &&
-          !VNI->hasPHIKill && !VNI->redefByEC && VNI->kills.empty())
-        return VNI;
-    } while (i != 0);
-  }
-  return getNextValue(~0U, 0, VNInfoAllocator);
-}
-
 
 /// MergeInClobberRanges - For any live ranges that are not defined in the
 /// current interval, but are defined in the Clobbers interval, mark them
@@ -589,12 +576,19 @@ void LiveInterval::MergeInClobberRanges(const LiveInterval &Clobbers,
                                         BumpPtrAllocator &VNInfoAllocator) {
   if (Clobbers.empty()) return;
   
-  // Find a value # to use for the clobber ranges.  If there is already a value#
-  // for unknown values, use it.
-  VNInfo *ClobberValNo = getUnknownValNo(VNInfoAllocator);
-  
+  DenseMap<VNInfo*, VNInfo*> ValNoMaps;
   iterator IP = begin();
   for (const_iterator I = Clobbers.begin(), E = Clobbers.end(); I != E; ++I) {
+    // For every val# in the Clobbers interval, create a new "unknown" val#.
+    VNInfo *ClobberValNo = 0;
+    DenseMap<VNInfo*, VNInfo*>::iterator VI = ValNoMaps.find(I->valno);
+    if (VI != ValNoMaps.end())
+      ClobberValNo = VI->second;
+    else {
+      ClobberValNo = getNextValue(~0U, 0, VNInfoAllocator);
+      ValNoMaps.insert(std::make_pair(I->valno, ClobberValNo));
+    }
+
     bool Done = false;
     unsigned Start = I->start, End = I->end;
     // If a clobber range starts before an existing range and ends after
@@ -637,7 +631,7 @@ void LiveInterval::MergeInClobberRange(unsigned Start, unsigned End,
                                        BumpPtrAllocator &VNInfoAllocator) {
   // Find a value # to use for the clobber ranges.  If there is already a value#
   // for unknown values, use it.
-  VNInfo *ClobberValNo = getUnknownValNo(VNInfoAllocator);
+  VNInfo *ClobberValNo = getNextValue(~0U, 0, VNInfoAllocator);
   
   iterator IP = begin();
   IP = std::upper_bound(IP, end(), Start);
diff --git a/test/CodeGen/X86/2009-04-25-CoalescerBug.ll b/test/CodeGen/X86/2009-04-25-CoalescerBug.ll
new file mode 100644 (file)
index 0000000..981d327
--- /dev/null
@@ -0,0 +1,19 @@
+; RUN: llvm-as < %s | llc -march=x86-64 | grep mov | count 2
+; rdar://6806252
+
+define i64 @test(i32* %tmp13) nounwind {
+entry:
+       br label %while.cond
+
+while.cond:            ; preds = %while.cond, %entry
+       %tmp15 = load i32* %tmp13               ; <i32> [#uses=2]
+       %bf.lo = lshr i32 %tmp15, 1             ; <i32> [#uses=1]
+       %bf.lo.cleared = and i32 %bf.lo, 2147483647             ; <i32> [#uses=1]
+       %conv = zext i32 %bf.lo.cleared to i64          ; <i64> [#uses=1]
+       %bf.lo.cleared25 = and i32 %tmp15, 1            ; <i32> [#uses=1]
+       %tobool = icmp ne i32 %bf.lo.cleared25, 0               ; <i1> [#uses=1]
+       br i1 %tobool, label %while.cond, label %while.end
+
+while.end:             ; preds = %while.cond
+       ret i64 %conv
+}