Emit a better error when running out of registers on inline asm.
authorBenjamin Kramer <benny.kra@googlemail.com>
Sat, 5 Oct 2013 19:33:37 +0000 (19:33 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Sat, 5 Oct 2013 19:33:37 +0000 (19:33 +0000)
The most likely case where this error happens is when the user specifies
too many register operands. Don't make it look like an internal LLVM bug
when we can see that the error is coming from an inline asm instruction.
For other instructions we keep the "ran out of registers" error.

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

lib/CodeGen/RegAllocBase.cpp
lib/CodeGen/RegAllocFast.cpp
test/CodeGen/X86/inline-asm-error.ll

index a912414ad2b743505e38553ba73e4fe8b25eef54..3ee58d45d72cd4522f1b4f471f834c0f4f3aad19 100644 (file)
@@ -106,7 +106,6 @@ void RegAllocBase::allocatePhysRegs() {
 
     if (AvailablePhysReg == ~0u) {
       // selectOrSplit failed to find a register!
-      const char *Msg = "ran out of registers during register allocation";
       // Probably caused by an inline asm.
       MachineInstr *MI;
       for (MachineRegisterInfo::reg_iterator I = MRI->reg_begin(VirtReg->reg);
@@ -114,9 +113,9 @@ void RegAllocBase::allocatePhysRegs() {
         if (MI->isInlineAsm())
           break;
       if (MI)
-        MI->emitError(Msg);
+        MI->emitError("inline assembly requires more registers than available");
       else
-        report_fatal_error(Msg);
+        report_fatal_error("ran out of registers during register allocation");
       // Keep going after reporting the error.
       VRM->assignVirt2Phys(VirtReg->reg,
                  RegClassInfo.getOrder(MRI->getRegClass(VirtReg->reg)).front());
index 400025074ca29c022f88ead3875b38d551babd70..6c2e60b5c6e18b2d0ac7fc2b51a4fbdab8f40081 100644 (file)
@@ -569,7 +569,10 @@ RAFast::LiveRegMap::iterator RAFast::allocVirtReg(MachineInstr *MI,
   }
 
   // Nothing we can do. Report an error and keep going with a bad allocation.
-  MI->emitError("ran out of registers during register allocation");
+  if (MI->isInlineAsm())
+    MI->emitError("inline assembly requires more registers than available");
+  else
+    MI->emitError("ran out of registers during register allocation");
   definePhysReg(MI, *AO.begin(), regFree);
   return assignVirtToPhysReg(VirtReg, *AO.begin());
 }
index 747a5891cf04677de9555d62fcfe6949f027c804..31fb190daf83c6c1d674ca4b56e10855c142a2ac 100644 (file)
@@ -6,7 +6,7 @@
 ; RUN: FileCheck %s < %t3
 
 ; The register allocator must fail on this function.
-; CHECK: error: ran out of registers during register allocation
+; CHECK: error: inline assembly requires more registers than available
 
 define void @f(i32 %x0, i32 %x1, i32 %x2, i32 %x3, i32 %x4, i32 %x5, i32 %x6, i32 %x7, i32 %x8, i32 %x9) nounwind ssp {
 entry: