Subreg live interval valno may not have a corresponding def machineinstr since it...
authorEvan Cheng <evan.cheng@apple.com>
Thu, 17 Jul 2008 19:48:53 +0000 (19:48 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Thu, 17 Jul 2008 19:48:53 +0000 (19:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53734 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SimpleRegisterCoalescing.cpp
test/CodeGen/X86/2008-07-16-CoalescerCrash.ll [new file with mode: 0644]

index bc833633ed24f05cb43fa5458e1605b02ee6e3b3..5b7f55dfc9a8cf1e0df6c9b5d4fce96b193ea82d 100644 (file)
@@ -1327,7 +1327,7 @@ bool SimpleRegisterCoalescing::RangeIsDefinedByCopyFromReg(LiveInterval &li,
     // Re-compute it.
     MachineInstr *DefMI = li_->getInstructionFromIndex(LR->start);
     unsigned SrcReg, DstReg;
-    if (tii_->isMoveInstr(*DefMI, SrcReg, DstReg) &&
+    if (DefMI && tii_->isMoveInstr(*DefMI, SrcReg, DstReg) &&
         DstReg == li.reg && SrcReg == Reg) {
       // Cache computed info.
       LR->valno->def  = LR->start;
diff --git a/test/CodeGen/X86/2008-07-16-CoalescerCrash.ll b/test/CodeGen/X86/2008-07-16-CoalescerCrash.ll
new file mode 100644 (file)
index 0000000..aa9ee50
--- /dev/null
@@ -0,0 +1,34 @@
+; RUN: llvm-as < %s | llc -mtriple=x86_64-apple-darwin
+
+       %struct.SV = type { i8*, i64, i64 }
+@"\01LC25" = external constant [8 x i8]                ; <[8 x i8]*> [#uses=1]
+
+declare void @Perl_sv_catpvf(%struct.SV*, i8*, ...) nounwind 
+
+declare fastcc i64 @Perl_utf8n_to_uvuni(i8*, i64, i64*, i64) nounwind 
+
+define fastcc i8* @Perl_pv_uni_display(%struct.SV* %dsv, i8* %spv, i64 %len, i64 %pvlim, i64 %flags) nounwind  {
+entry:
+       br i1 false, label %bb, label %bb40
+
+bb:            ; preds = %entry
+       tail call fastcc i64 @Perl_utf8n_to_uvuni( i8* null, i64 13, i64* null, i64 255 ) nounwind              ; <i64>:0 [#uses=1]
+       br i1 false, label %bb6, label %bb33
+
+bb6:           ; preds = %bb
+       br i1 false, label %bb30, label %bb31
+
+bb30:          ; preds = %bb6
+       unreachable
+
+bb31:          ; preds = %bb6
+       icmp eq i8 0, 0         ; <i1>:1 [#uses=0]
+       br label %bb33
+
+bb33:          ; preds = %bb31, %bb
+       tail call void (%struct.SV*, i8*, ...)* @Perl_sv_catpvf( %struct.SV* %dsv, i8* getelementptr ([8 x i8]* @"\01LC25", i32 0, i64 0), i64 %0 ) nounwind 
+       unreachable
+
+bb40:          ; preds = %entry
+       ret i8* null
+}