mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-26 12:20:42 +00:00
Change handling of illegal vector types to widen when possible instead of
expanding: e.g. <2 x float> -> <4 x float> instead of -> 2 floats. This
affects two places in the code: handling cross block values and handling
function return and arguments. Since vectors are already widened by
legalizetypes, this gives us much better code and unblocks x86-64 abi
and SPU abi work.
For example, this (which is a silly example of a cross-block value):
define <4 x float> @test2(<4 x float> %A) nounwind {
%B = shufflevector <4 x float> %A, <4 x float> undef, <2 x i32> <i32 0, i32 1>
%C = fadd <2 x float> %B, %B
br label %BB
BB:
%D = fadd <2 x float> %C, %C
%E = shufflevector <2 x float> %D, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
ret <4 x float> %E
}
Now compiles into:
_test2: ## @test2
## BB#0:
addps %xmm0, %xmm0
addps %xmm0, %xmm0
ret
previously it compiled into:
_test2: ## @test2
## BB#0:
addps %xmm0, %xmm0
pshufd $1, %xmm0, %xmm1
## kill: XMM0<def> XMM0<kill> XMM0<def>
insertps $0, %xmm0, %xmm0
insertps $16, %xmm1, %xmm0
addps %xmm0, %xmm0
ret
This implements rdar://8230384
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@112101 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -697,6 +697,7 @@ TargetLowering::findRepresentativeClass(EVT VT) const {
|
||||
return std::make_pair(BestRC, 1);
|
||||
}
|
||||
|
||||
|
||||
/// computeRegisterProperties - Once all of the register classes are added,
|
||||
/// this allows us to compute derived properties we expose.
|
||||
void TargetLowering::computeRegisterProperties() {
|
||||
@@ -782,6 +783,28 @@ void TargetLowering::computeRegisterProperties() {
|
||||
MVT VT = (MVT::SimpleValueType)i;
|
||||
if (isTypeLegal(VT)) continue;
|
||||
|
||||
// Determine if there is a legal wider type. If so, we should promote to
|
||||
// that wider vector type.
|
||||
EVT EltVT = VT.getVectorElementType();
|
||||
unsigned NElts = VT.getVectorNumElements();
|
||||
if (NElts != 1) {
|
||||
bool IsLegalWiderType = false;
|
||||
for (unsigned nVT = i+1; nVT <= MVT::LAST_VECTOR_VALUETYPE; ++nVT) {
|
||||
EVT SVT = (MVT::SimpleValueType)nVT;
|
||||
if (SVT.getVectorElementType() == EltVT &&
|
||||
SVT.getVectorNumElements() > NElts &&
|
||||
isTypeSynthesizable(SVT)) {
|
||||
TransformToType[i] = SVT;
|
||||
RegisterTypeForVT[i] = SVT;
|
||||
NumRegistersForVT[i] = 1;
|
||||
ValueTypeActions.setTypeAction(VT, Promote);
|
||||
IsLegalWiderType = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (IsLegalWiderType) continue;
|
||||
}
|
||||
|
||||
MVT IntermediateVT;
|
||||
EVT RegisterVT;
|
||||
unsigned NumIntermediates;
|
||||
@@ -790,30 +813,14 @@ void TargetLowering::computeRegisterProperties() {
|
||||
RegisterVT, this);
|
||||
RegisterTypeForVT[i] = RegisterVT;
|
||||
|
||||
// Determine if there is a legal wider type.
|
||||
bool IsLegalWiderType = false;
|
||||
EVT EltVT = VT.getVectorElementType();
|
||||
unsigned NElts = VT.getVectorNumElements();
|
||||
for (unsigned nVT = i+1; nVT <= MVT::LAST_VECTOR_VALUETYPE; ++nVT) {
|
||||
EVT SVT = (MVT::SimpleValueType)nVT;
|
||||
if (isTypeSynthesizable(SVT) && SVT.getVectorElementType() == EltVT &&
|
||||
SVT.getVectorNumElements() > NElts && NElts != 1) {
|
||||
TransformToType[i] = SVT;
|
||||
ValueTypeActions.setTypeAction(VT, Promote);
|
||||
IsLegalWiderType = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!IsLegalWiderType) {
|
||||
EVT NVT = VT.getPow2VectorType();
|
||||
if (NVT == VT) {
|
||||
// Type is already a power of 2. The default action is to split.
|
||||
TransformToType[i] = MVT::Other;
|
||||
ValueTypeActions.setTypeAction(VT, Expand);
|
||||
} else {
|
||||
TransformToType[i] = NVT;
|
||||
ValueTypeActions.setTypeAction(VT, Promote);
|
||||
}
|
||||
EVT NVT = VT.getPow2VectorType();
|
||||
if (NVT == VT) {
|
||||
// Type is already a power of 2. The default action is to split.
|
||||
TransformToType[i] = MVT::Other;
|
||||
ValueTypeActions.setTypeAction(VT, Expand);
|
||||
} else {
|
||||
TransformToType[i] = NVT;
|
||||
ValueTypeActions.setTypeAction(VT, Promote);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -857,8 +864,21 @@ unsigned TargetLowering::getVectorTypeBreakdown(LLVMContext &Context, EVT VT,
|
||||
EVT &IntermediateVT,
|
||||
unsigned &NumIntermediates,
|
||||
EVT &RegisterVT) const {
|
||||
// Figure out the right, legal destination reg to copy into.
|
||||
unsigned NumElts = VT.getVectorNumElements();
|
||||
|
||||
// If there is a wider vector type with the same element type as this one,
|
||||
// we should widen to that legal vector type. This handles things like
|
||||
// <2 x float> -> <4 x float>.
|
||||
if (NumElts != 1 && getTypeAction(Context, VT) == Promote) {
|
||||
RegisterVT = getTypeToTransformTo(Context, VT);
|
||||
if (isTypeLegal(RegisterVT)) {
|
||||
IntermediateVT = RegisterVT;
|
||||
NumIntermediates = 1;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Figure out the right, legal destination reg to copy into.
|
||||
EVT EltTy = VT.getVectorElementType();
|
||||
|
||||
unsigned NumVectorRegs = 1;
|
||||
@@ -887,16 +907,12 @@ unsigned TargetLowering::getVectorTypeBreakdown(LLVMContext &Context, EVT VT,
|
||||
|
||||
EVT DestVT = getRegisterType(Context, NewVT);
|
||||
RegisterVT = DestVT;
|
||||
if (DestVT.bitsLT(NewVT)) {
|
||||
// Value is expanded, e.g. i64 -> i16.
|
||||
if (DestVT.bitsLT(NewVT)) // Value is expanded, e.g. i64 -> i16.
|
||||
return NumVectorRegs*(NewVT.getSizeInBits()/DestVT.getSizeInBits());
|
||||
} else {
|
||||
// Otherwise, promotion or legal types use the same number of registers as
|
||||
// the vector decimated to the appropriate level.
|
||||
return NumVectorRegs;
|
||||
}
|
||||
|
||||
return 1;
|
||||
// Otherwise, promotion or legal types use the same number of registers as
|
||||
// the vector decimated to the appropriate level.
|
||||
return NumVectorRegs;
|
||||
}
|
||||
|
||||
/// Get the EVTs and ArgFlags collections that represent the legalized return
|
||||
|
||||
Reference in New Issue
Block a user