mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 04:33:05 +00:00
Generate an error message instead of asserting or segfaulting when we have a
scalar-to-vector conversion that we cannot handle. For instance, when an invalid constraint is used in an inline asm statement. <rdar://problem/12284092> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@164662 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4e9485d732
commit
f18eb5887f
@ -328,20 +328,20 @@ static SDValue getCopyFromPartsVector(SelectionDAG &DAG, DebugLoc DL,
|
||||
|
||||
static void getCopyToPartsVector(SelectionDAG &DAG, DebugLoc dl,
|
||||
SDValue Val, SDValue *Parts, unsigned NumParts,
|
||||
EVT PartVT);
|
||||
EVT PartVT, const Value *V);
|
||||
|
||||
/// getCopyToParts - Create a series of nodes that contain the specified value
|
||||
/// split into legal parts. If the parts contain more bits than Val, then, for
|
||||
/// integers, ExtendKind can be used to specify how to generate the extra bits.
|
||||
static void getCopyToParts(SelectionDAG &DAG, DebugLoc DL,
|
||||
SDValue Val, SDValue *Parts, unsigned NumParts,
|
||||
EVT PartVT,
|
||||
EVT PartVT, const Value *V,
|
||||
ISD::NodeType ExtendKind = ISD::ANY_EXTEND) {
|
||||
EVT ValueVT = Val.getValueType();
|
||||
|
||||
// Handle the vector case separately.
|
||||
if (ValueVT.isVector())
|
||||
return getCopyToPartsVector(DAG, DL, Val, Parts, NumParts, PartVT);
|
||||
return getCopyToPartsVector(DAG, DL, Val, Parts, NumParts, PartVT, V);
|
||||
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
unsigned PartBits = PartVT.getSizeInBits();
|
||||
@ -393,7 +393,19 @@ static void getCopyToParts(SelectionDAG &DAG, DebugLoc DL,
|
||||
"Failed to tile the value with PartVT!");
|
||||
|
||||
if (NumParts == 1) {
|
||||
assert(PartVT == ValueVT && "Type conversion failed!");
|
||||
if (PartVT != ValueVT) {
|
||||
LLVMContext &Ctx = *DAG.getContext();
|
||||
Twine ErrMsg("scalar-to-vector conversion failed");
|
||||
if (const Instruction *I = dyn_cast_or_null<Instruction>(V)) {
|
||||
if (const CallInst *CI = dyn_cast<CallInst>(I))
|
||||
if (isa<InlineAsm>(CI->getCalledValue()))
|
||||
ErrMsg = ErrMsg + ", possible invalid constraint for vector type";
|
||||
Ctx.emitError(I, ErrMsg);
|
||||
} else {
|
||||
Ctx.emitError(ErrMsg);
|
||||
}
|
||||
}
|
||||
|
||||
Parts[0] = Val;
|
||||
return;
|
||||
}
|
||||
@ -408,7 +420,7 @@ static void getCopyToParts(SelectionDAG &DAG, DebugLoc DL,
|
||||
unsigned OddParts = NumParts - RoundParts;
|
||||
SDValue OddVal = DAG.getNode(ISD::SRL, DL, ValueVT, Val,
|
||||
DAG.getIntPtrConstant(RoundBits));
|
||||
getCopyToParts(DAG, DL, OddVal, Parts + RoundParts, OddParts, PartVT);
|
||||
getCopyToParts(DAG, DL, OddVal, Parts + RoundParts, OddParts, PartVT, V);
|
||||
|
||||
if (TLI.isBigEndian())
|
||||
// The odd parts were reversed by getCopyToParts - unreverse them.
|
||||
@ -454,7 +466,7 @@ static void getCopyToParts(SelectionDAG &DAG, DebugLoc DL,
|
||||
/// value split into legal parts.
|
||||
static void getCopyToPartsVector(SelectionDAG &DAG, DebugLoc DL,
|
||||
SDValue Val, SDValue *Parts, unsigned NumParts,
|
||||
EVT PartVT) {
|
||||
EVT PartVT, const Value *V) {
|
||||
EVT ValueVT = Val.getValueType();
|
||||
assert(ValueVT.isVector() && "Not a vector");
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
@ -540,7 +552,7 @@ static void getCopyToPartsVector(SelectionDAG &DAG, DebugLoc DL,
|
||||
// If the register was not expanded, promote or copy the value,
|
||||
// as appropriate.
|
||||
for (unsigned i = 0; i != NumParts; ++i)
|
||||
getCopyToParts(DAG, DL, Ops[i], &Parts[i], 1, PartVT);
|
||||
getCopyToParts(DAG, DL, Ops[i], &Parts[i], 1, PartVT, V);
|
||||
} else if (NumParts > 0) {
|
||||
// If the intermediate type was expanded, split each the value into
|
||||
// legal parts.
|
||||
@ -548,13 +560,10 @@ static void getCopyToPartsVector(SelectionDAG &DAG, DebugLoc DL,
|
||||
"Must expand into a divisible number of parts!");
|
||||
unsigned Factor = NumParts / NumIntermediates;
|
||||
for (unsigned i = 0; i != NumIntermediates; ++i)
|
||||
getCopyToParts(DAG, DL, Ops[i], &Parts[i*Factor], Factor, PartVT);
|
||||
getCopyToParts(DAG, DL, Ops[i], &Parts[i*Factor], Factor, PartVT, V);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
namespace {
|
||||
/// RegsForValue - This struct represents the registers (physical or virtual)
|
||||
/// that a particular set of values is assigned, and the type information
|
||||
@ -640,7 +649,7 @@ namespace {
|
||||
/// Chain/Flag as the input and updates them for the output Chain/Flag.
|
||||
/// If the Flag pointer is NULL, no flag is used.
|
||||
void getCopyToRegs(SDValue Val, SelectionDAG &DAG, DebugLoc dl,
|
||||
SDValue &Chain, SDValue *Flag) const;
|
||||
SDValue &Chain, SDValue *Flag, const Value *V) const;
|
||||
|
||||
/// AddInlineAsmOperands - Add this value to the specified inlineasm node
|
||||
/// operand list. This adds the code marker, matching input operand index
|
||||
@ -749,7 +758,8 @@ SDValue RegsForValue::getCopyFromRegs(SelectionDAG &DAG,
|
||||
/// Chain/Flag as the input and updates them for the output Chain/Flag.
|
||||
/// If the Flag pointer is NULL, no flag is used.
|
||||
void RegsForValue::getCopyToRegs(SDValue Val, SelectionDAG &DAG, DebugLoc dl,
|
||||
SDValue &Chain, SDValue *Flag) const {
|
||||
SDValue &Chain, SDValue *Flag,
|
||||
const Value *V) const {
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
|
||||
// Get the list of the values's legal parts.
|
||||
@ -761,7 +771,7 @@ void RegsForValue::getCopyToRegs(SDValue Val, SelectionDAG &DAG, DebugLoc dl,
|
||||
EVT RegisterVT = RegVTs[Value];
|
||||
|
||||
getCopyToParts(DAG, dl, Val.getValue(Val.getResNo() + Value),
|
||||
&Parts[Part], NumParts, RegisterVT);
|
||||
&Parts[Part], NumParts, RegisterVT, V);
|
||||
Part += NumParts;
|
||||
}
|
||||
|
||||
@ -1230,7 +1240,7 @@ void SelectionDAGBuilder::visitRet(const ReturnInst &I) {
|
||||
SmallVector<SDValue, 4> Parts(NumParts);
|
||||
getCopyToParts(DAG, getCurDebugLoc(),
|
||||
SDValue(RetOp.getNode(), RetOp.getResNo() + j),
|
||||
&Parts[0], NumParts, PartVT, ExtendKind);
|
||||
&Parts[0], NumParts, PartVT, &I, ExtendKind);
|
||||
|
||||
// 'inreg' on function refers to return value
|
||||
ISD::ArgFlagsTy Flags = ISD::ArgFlagsTy();
|
||||
@ -6235,7 +6245,7 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
|
||||
// Use the produced MatchedRegs object to
|
||||
MatchedRegs.getCopyToRegs(InOperandVal, DAG, getCurDebugLoc(),
|
||||
Chain, &Flag);
|
||||
Chain, &Flag, CS.getInstruction());
|
||||
MatchedRegs.AddInlineAsmOperands(InlineAsm::Kind_RegUse,
|
||||
true, OpInfo.getMatchedOperand(),
|
||||
DAG, AsmNodeOperands);
|
||||
@ -6317,7 +6327,7 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
}
|
||||
|
||||
OpInfo.AssignedRegs.getCopyToRegs(InOperandVal, DAG, getCurDebugLoc(),
|
||||
Chain, &Flag);
|
||||
Chain, &Flag, CS.getInstruction());
|
||||
|
||||
OpInfo.AssignedRegs.AddInlineAsmOperands(InlineAsm::Kind_RegUse, false, 0,
|
||||
DAG, AsmNodeOperands);
|
||||
@ -6503,7 +6513,7 @@ TargetLowering::LowerCallTo(TargetLowering::CallLoweringInfo &CLI) const {
|
||||
ExtendKind = ISD::ZERO_EXTEND;
|
||||
|
||||
getCopyToParts(CLI.DAG, CLI.DL, Op, &Parts[0], NumParts,
|
||||
PartVT, ExtendKind);
|
||||
PartVT, CLI.CS ? CLI.CS->getInstruction() : 0, ExtendKind);
|
||||
|
||||
for (unsigned j = 0; j != NumParts; ++j) {
|
||||
// if it isn't first piece, alignment must be 1
|
||||
@ -6623,7 +6633,7 @@ SelectionDAGBuilder::CopyValueToVirtualRegister(const Value *V, unsigned Reg) {
|
||||
|
||||
RegsForValue RFV(V->getContext(), TLI, Reg, V->getType());
|
||||
SDValue Chain = DAG.getEntryNode();
|
||||
RFV.getCopyToRegs(Op, DAG, getCurDebugLoc(), Chain, 0);
|
||||
RFV.getCopyToRegs(Op, DAG, getCurDebugLoc(), Chain, 0, V);
|
||||
PendingExports.push_back(Chain);
|
||||
}
|
||||
|
||||
|
11
test/CodeGen/ARM/2012-09-25-InlineAsmScalarToVectorConv2.ll
Normal file
11
test/CodeGen/ARM/2012-09-25-InlineAsmScalarToVectorConv2.ll
Normal file
@ -0,0 +1,11 @@
|
||||
; RUN: llc < %s -march=arm -mcpu=cortex-a8 2>&1 | FileCheck %s
|
||||
|
||||
; Check for error message:
|
||||
; CHECK: scalar-to-vector conversion failed, possible invalid constraint for vector type
|
||||
|
||||
define hidden void @f(i32* %corr, i32 %order) nounwind ssp {
|
||||
tail call void asm sideeffect "vst1.s32 { ${1:q}, ${2:q} }, [$0]", "r,{q0},{q1}"(i32* %corr, <2 x i64>* undef, <2 x i64>* undef) nounwind, !srcloc !0
|
||||
ret void
|
||||
}
|
||||
|
||||
!0 = metadata !{i32 257}
|
Loading…
Reference in New Issue
Block a user