forked from OSchip/llvm-project
[RegAllocGreedy][Last Chance Recoloring] Emit diagnostics when last chance
recoloring cut-offs are encountered and register allocation failed. This is related to PR18747 Patch by MAYUR PANDEY <mayur.p@samsung.com>. llvm-svn: 205601
This commit is contained in:
parent
9c816f39ad
commit
96bd2a1490
|
@ -37,6 +37,7 @@
|
|||
#include "llvm/CodeGen/RegAllocRegistry.h"
|
||||
#include "llvm/CodeGen/RegisterClassInfo.h"
|
||||
#include "llvm/CodeGen/VirtRegMap.h"
|
||||
#include "llvm/IR/LLVMContext.h"
|
||||
#include "llvm/PassAnalysisSupport.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
|
@ -147,6 +148,22 @@ class RAGreedy : public MachineFunctionPass,
|
|||
RS_Done
|
||||
};
|
||||
|
||||
// Enum CutOffStage to keep a track whether the register allocation failed
|
||||
// because of the cutoffs encountered in last chance recoloring.
|
||||
// Note: This is used as bitmask. New value should be next power of 2.
|
||||
enum CutOffStage {
|
||||
// No cutoffs encountered
|
||||
CO_None = 0,
|
||||
|
||||
// lcr-max-depth cutoff encountered
|
||||
CO_Depth = 1,
|
||||
|
||||
// lcr-max-interf cutoff encountered
|
||||
CO_Interf = 2
|
||||
};
|
||||
|
||||
uint8_t CutOffInfo;
|
||||
|
||||
#ifndef NDEBUG
|
||||
static const char *const StageName[];
|
||||
#endif
|
||||
|
@ -1912,6 +1929,7 @@ RAGreedy::mayRecolorAllInterferences(unsigned PhysReg, LiveInterval &VirtReg,
|
|||
if (Q.collectInterferingVRegs(LastChanceRecoloringMaxInterference) >=
|
||||
LastChanceRecoloringMaxInterference) {
|
||||
DEBUG(dbgs() << "Early abort: too many interferences.\n");
|
||||
CutOffInfo |= CO_Interf;
|
||||
return false;
|
||||
}
|
||||
for (unsigned i = Q.interferingVRegs().size(); i; --i) {
|
||||
|
@ -1984,6 +2002,7 @@ unsigned RAGreedy::tryLastChanceRecoloring(LiveInterval &VirtReg,
|
|||
// Indeed, in that case we may want to cut the search space earlier.
|
||||
if (Depth >= LastChanceRecoloringMaxDepth) {
|
||||
DEBUG(dbgs() << "Abort because max depth has been reached.\n");
|
||||
CutOffInfo |= CO_Depth;
|
||||
return ~0u;
|
||||
}
|
||||
|
||||
|
@ -2108,8 +2127,23 @@ bool RAGreedy::tryRecoloringCandidates(PQueue &RecoloringQueue,
|
|||
|
||||
unsigned RAGreedy::selectOrSplit(LiveInterval &VirtReg,
|
||||
SmallVectorImpl<unsigned> &NewVRegs) {
|
||||
CutOffInfo = CO_None;
|
||||
LLVMContext &Ctx = MF->getFunction()->getContext();
|
||||
SmallVirtRegSet FixedRegisters;
|
||||
return selectOrSplitImpl(VirtReg, NewVRegs, FixedRegisters);
|
||||
unsigned Reg = selectOrSplitImpl(VirtReg, NewVRegs, FixedRegisters);
|
||||
if (Reg == ~0U && (CutOffInfo != CO_None)) {
|
||||
uint8_t CutOffEncountered = CutOffInfo & (CO_Depth | CO_Interf);
|
||||
if (CutOffEncountered == CO_Depth)
|
||||
Ctx.emitError(
|
||||
"register allocation failed: maximum depth for recoloring reached");
|
||||
else if (CutOffEncountered == CO_Interf)
|
||||
Ctx.emitError("register allocation failed: maximum interference for "
|
||||
"recoloring reached");
|
||||
else if (CutOffEncountered == (CO_Depth | CO_Interf))
|
||||
Ctx.emitError("register allocation failed: maximum interference and "
|
||||
"depth for recoloring reached");
|
||||
}
|
||||
return Reg;
|
||||
}
|
||||
|
||||
/// Using a CSR for the first time has a cost because it causes push|pop
|
||||
|
|
|
@ -2,6 +2,12 @@
|
|||
; Without the last chance recoloring, this test fails with:
|
||||
; "ran out of registers".
|
||||
|
||||
; RUN: not llc -regalloc=greedy -relocation-model=pic -lcr-max-depth=0 < %s 2>&1 | FileCheck %s --check-prefix=CHECK-DEPTH
|
||||
; Test whether failure due to cutoff for depth is reported
|
||||
|
||||
; RUN: not llc -regalloc=greedy -relocation-model=pic -lcr-max-interf=1 < %s 2>&1 | FileCheck %s --check-prefix=CHECK-INTERF
|
||||
; Test whether failure due to cutoff for interference is reported
|
||||
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32-S128"
|
||||
target triple = "i386-apple-macosx"
|
||||
|
||||
|
@ -12,6 +18,8 @@ target triple = "i386-apple-macosx"
|
|||
|
||||
; Function Attrs: nounwind ssp
|
||||
; CHECK-NOT: ran out of registers during register allocation
|
||||
; CHECK-INTERF: error: register allocation failed: maximum interference for recoloring reached
|
||||
; CHECK-DEPTH: error: register allocation failed: maximum depth for recoloring reached
|
||||
define void @fp_dh_f870bf31fd8ffe068450366e3f05389a(i8* %arg) #0 {
|
||||
bb:
|
||||
indirectbr i8* undef, [label %bb85, label %bb206]
|
||||
|
|
Loading…
Reference in New Issue