summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2012-11-09 19:18:49 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2012-11-09 19:18:49 +0000
commit722c9a7925d1a66569513a1894fdd230962fa3f9 (patch)
treec7891c4266554b19b951bc4c314cd4252459652e
parentb3235b128f383559a7a9b9119896e406b347879c (diff)
downloadllvm-722c9a7925d1a66569513a1894fdd230962fa3f9.tar.gz
llvm-722c9a7925d1a66569513a1894fdd230962fa3f9.tar.bz2
llvm-722c9a7925d1a66569513a1894fdd230962fa3f9.tar.xz
Fix assertions in updateRegMaskSlots().
The RegMaskSlots contains 'r' slots while NewIdx and OldIdx are 'B' slots. This broke the checks in the assertions. This fixes PR14302. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167625 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/LiveIntervalAnalysis.cpp18
-rw-r--r--test/CodeGen/PowerPC/misched.ll45
2 files changed, 59 insertions, 4 deletions
diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp
index 65bc4af99e..4e75d892e5 100644
--- a/lib/CodeGen/LiveIntervalAnalysis.cpp
+++ b/lib/CodeGen/LiveIntervalAnalysis.cpp
@@ -146,6 +146,11 @@ void LiveIntervals::print(raw_ostream &OS, const Module* ) const {
OS << PrintReg(Reg) << " = " << getInterval(Reg) << '\n';
}
+ OS << "RegMasks:";
+ for (unsigned i = 0, e = RegMaskSlots.size(); i != e; ++i)
+ OS << ' ' << RegMaskSlots[i];
+ OS << '\n';
+
printInstrs(OS);
}
@@ -1257,10 +1262,15 @@ private:
SmallVectorImpl<SlotIndex>::iterator RI =
std::lower_bound(LIS.RegMaskSlots.begin(), LIS.RegMaskSlots.end(),
OldIdx);
- assert(*RI == OldIdx && "No RegMask at OldIdx.");
- *RI = NewIdx;
- assert(*prior(RI) < *RI && *RI < *next(RI) &&
- "RegSlots out of order. Did you move one call across another?");
+ assert(RI != LIS.RegMaskSlots.end() && *RI == OldIdx.getRegSlot() &&
+ "No RegMask at OldIdx.");
+ *RI = NewIdx.getRegSlot();
+ assert((RI == LIS.RegMaskSlots.begin() ||
+ SlotIndex::isEarlierInstr(*llvm::prior(RI), *RI)) &&
+ "Cannot move regmask instruction above another call");
+ assert((llvm::next(RI) == LIS.RegMaskSlots.end() ||
+ SlotIndex::isEarlierInstr(*RI, *llvm::next(RI))) &&
+ "Cannot move regmask instruction below another call");
}
// Return the last use of reg between NewIdx and OldIdx.
diff --git a/test/CodeGen/PowerPC/misched.ll b/test/CodeGen/PowerPC/misched.ll
new file mode 100644
index 0000000000..d6fb3b3046
--- /dev/null
+++ b/test/CodeGen/PowerPC/misched.ll
@@ -0,0 +1,45 @@
+; RUN: llc < %s -enable-misched -verify-machineinstrs
+; PR14302
+target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64"
+target triple = "powerpc64-bgq-linux"
+
+@b = external global [16000 x double], align 32
+
+define void @pr14302() nounwind {
+entry:
+ tail call void @putchar() nounwind
+ br label %for.body
+
+for.body: ; preds = %for.body, %entry
+ br i1 undef, label %for.body, label %for.body24.i
+
+for.body24.i: ; preds = %for.body24.i, %for.body
+ store double 1.000000e+00, double* undef, align 8
+ br i1 undef, label %for.body24.i58, label %for.body24.i
+
+for.body24.i58: ; preds = %for.body24.i58, %for.body24.i
+ %arrayidx26.i55.1 = getelementptr inbounds [16000 x double]* @b, i64 0, i64 undef
+ store double 1.000000e+00, double* %arrayidx26.i55.1, align 8
+ br i1 undef, label %for.body24.i64, label %for.body24.i58
+
+for.body24.i64: ; preds = %for.body24.i64, %for.body24.i58
+ %exitcond.2489 = icmp eq i32 0, 16000
+ br i1 %exitcond.2489, label %for.body24.i70, label %for.body24.i64
+
+for.body24.i70: ; preds = %for.body24.i70, %for.body24.i64
+ br i1 undef, label %for.body24.i76, label %for.body24.i70
+
+for.body24.i76: ; preds = %for.body24.i76, %for.body24.i70
+ br i1 undef, label %set1d.exit77, label %for.body24.i76
+
+set1d.exit77: ; preds = %for.body24.i76
+ br label %for.body29
+
+for.body29: ; preds = %for.body29, %set1d.exit77
+ br i1 undef, label %for.end35, label %for.body29
+
+for.end35: ; preds = %for.body29
+ ret void
+}
+
+declare void @putchar()