diff options
Diffstat (limited to 'lib/CodeGen/RegAllocBasic.cpp')
| -rw-r--r-- | lib/CodeGen/RegAllocBasic.cpp | 30 | 
1 files changed, 16 insertions, 14 deletions
| diff --git a/lib/CodeGen/RegAllocBasic.cpp b/lib/CodeGen/RegAllocBasic.cpp index 1d77b29e2a2e..5ea26adc7644 100644 --- a/lib/CodeGen/RegAllocBasic.cpp +++ b/lib/CodeGen/RegAllocBasic.cpp @@ -20,6 +20,7 @@  #include "RenderMachineFunction.h"  #include "Spiller.h"  #include "VirtRegMap.h" +#include "RegisterCoalescer.h"  #include "llvm/ADT/OwningPtr.h"  #include "llvm/ADT/Statistic.h"  #include "llvm/Analysis/AliasAnalysis.h" @@ -34,7 +35,6 @@  #include "llvm/CodeGen/MachineRegisterInfo.h"  #include "llvm/CodeGen/Passes.h"  #include "llvm/CodeGen/RegAllocRegistry.h" -#include "llvm/CodeGen/RegisterCoalescer.h"  #include "llvm/Target/TargetMachine.h"  #include "llvm/Target/TargetOptions.h"  #include "llvm/Target/TargetRegisterInfo.h" @@ -141,7 +141,7 @@ RABasic::RABasic(): MachineFunctionPass(ID) {    initializeLiveIntervalsPass(*PassRegistry::getPassRegistry());    initializeSlotIndexesPass(*PassRegistry::getPassRegistry());    initializeStrongPHIEliminationPass(*PassRegistry::getPassRegistry()); -  initializeRegisterCoalescerAnalysisGroup(*PassRegistry::getPassRegistry()); +  initializeRegisterCoalescerPass(*PassRegistry::getPassRegistry());    initializeCalculateSpillWeightsPass(*PassRegistry::getPassRegistry());    initializeLiveStacksPass(*PassRegistry::getPassRegistry());    initializeMachineDominatorTreePass(*PassRegistry::getPassRegistry()); @@ -324,19 +324,21 @@ void RegAllocBase::allocatePhysRegs() {      if (AvailablePhysReg == ~0u) {        // selectOrSplit failed to find a register! -      std::string msg; -      raw_string_ostream Msg(msg); -      Msg << "Ran out of registers during register allocation!" -             "\nCannot allocate: " << *VirtReg; +      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); -      MachineInstr *MI = I.skipInstruction();) { -        if (!MI->isInlineAsm()) -          continue; -        Msg << "\nPlease check your inline asm statement for " -          "invalid constraints:\n"; -        MI->print(Msg, &VRM->getMachineFunction().getTarget()); -      } -      report_fatal_error(Msg.str()); +           (MI = I.skipInstruction());) +        if (MI->isInlineAsm()) +          break; +      if (MI) +        MI->emitError(Msg); +      else +        report_fatal_error(Msg); +      // Keep going after reporting the error. +      VRM->assignVirt2Phys(VirtReg->reg, +                 RegClassInfo.getOrder(MRI->getRegClass(VirtReg->reg)).front()); +      continue;      }      if (AvailablePhysReg) | 
