mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-23 16:19:52 +00:00
[fast-isel] Cleaner fix for when we're unable to handle a non-double multi-reg
retval. Hoists check before emitting the call to avoid unnecessary work. rdar://11430407 PR12796 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@156628 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -2014,7 +2014,8 @@ bool ARMFastISel::FinishCall(MVT RetVT, SmallVectorImpl<unsigned> &UsedRegs,
|
||||
|
||||
// Finally update the result.
|
||||
UpdateValueMap(I, ResultReg);
|
||||
} else if (RVLocs.size() == 1) {
|
||||
} else {
|
||||
assert(RVLocs.size() == 1 &&"Can't handle non-double multi-reg retvals!");
|
||||
EVT CopyVT = RVLocs[0].getValVT();
|
||||
|
||||
// Special handling for extended integers.
|
||||
@@ -2030,9 +2031,6 @@ bool ARMFastISel::FinishCall(MVT RetVT, SmallVectorImpl<unsigned> &UsedRegs,
|
||||
|
||||
// Finally update the result.
|
||||
UpdateValueMap(I, ResultReg);
|
||||
} else {
|
||||
// Can't handle non-double multi-reg retvals.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2144,6 +2142,15 @@ bool ARMFastISel::ARMEmitLibcall(const Instruction *I, RTLIB::Libcall Call) {
|
||||
// TODO: For now if we have long calls specified we don't handle the call.
|
||||
if (EnableARMLongCalls) return false;
|
||||
|
||||
// Can't handle non-double multi-reg retvals.
|
||||
if (RetVT != MVT::isVoid && RetVT != MVT::i32) {
|
||||
SmallVector<CCValAssign, 16> RVLocs;
|
||||
CCState CCInfo(CC, false, *FuncInfo.MF, TM, RVLocs, *Context);
|
||||
CCInfo.AnalyzeCallResult(RetVT, CCAssignFnForCall(CC, true));
|
||||
if (RVLocs.size() >= 2 && RetVT != MVT::f64)
|
||||
return false;
|
||||
}
|
||||
|
||||
// Set up the argument vectors.
|
||||
SmallVector<Value*, 8> Args;
|
||||
SmallVector<unsigned, 8> ArgRegs;
|
||||
@@ -2247,6 +2254,16 @@ bool ARMFastISel::SelectCall(const Instruction *I,
|
||||
// TODO: For now if we have long calls specified we don't handle the call.
|
||||
if (EnableARMLongCalls) return false;
|
||||
|
||||
// Can't handle non-double multi-reg retvals.
|
||||
if (RetVT != MVT::isVoid && RetVT != MVT::i1 && RetVT != MVT::i8 &&
|
||||
RetVT != MVT::i16 && RetVT != MVT::i32) {
|
||||
SmallVector<CCValAssign, 16> RVLocs;
|
||||
CCState CCInfo(CC, false, *FuncInfo.MF, TM, RVLocs, *Context);
|
||||
CCInfo.AnalyzeCallResult(RetVT, CCAssignFnForCall(CC, true));
|
||||
if (RVLocs.size() >= 2 && RetVT != MVT::f64)
|
||||
return false;
|
||||
}
|
||||
|
||||
// Set up the argument vectors.
|
||||
SmallVector<Value*, 8> Args;
|
||||
SmallVector<unsigned, 8> ArgRegs;
|
||||
|
||||
Reference in New Issue
Block a user