forked from OSchip/llvm-project
[SVE] Update EmitSVEPredicateCast to take a ScalableVectorType
Summary: Removes usage of VectorType::getNumElements identified by test located at CodeGen/aarch64-sve-intrinsics/acle_sve_abs.c. Since the type is an SVE predicate vector, it makes sense to specialize the code for scalable vectors only. Reviewers: rengolin, efriedma Reviewed By: efriedma Subscribers: tschuett, kristof.beyls, rkruppe, psnobl, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D78958
This commit is contained in:
parent
1e43cab3c6
commit
ef3678cfee
|
@ -7609,15 +7609,14 @@ static llvm::ScalableVectorType *getSVEVectorForElementType(llvm::Type *EltTy) {
|
||||||
// Reinterpret the input predicate so that it can be used to correctly isolate
|
// Reinterpret the input predicate so that it can be used to correctly isolate
|
||||||
// the elements of the specified datatype.
|
// the elements of the specified datatype.
|
||||||
Value *CodeGenFunction::EmitSVEPredicateCast(Value *Pred,
|
Value *CodeGenFunction::EmitSVEPredicateCast(Value *Pred,
|
||||||
llvm::VectorType *VTy) {
|
llvm::ScalableVectorType *VTy) {
|
||||||
llvm::VectorType *RTy = llvm::VectorType::get(
|
auto *RTy = llvm::VectorType::get(IntegerType::get(getLLVMContext(), 1), VTy);
|
||||||
IntegerType::get(getLLVMContext(), 1), VTy->getElementCount());
|
|
||||||
if (Pred->getType() == RTy)
|
if (Pred->getType() == RTy)
|
||||||
return Pred;
|
return Pred;
|
||||||
|
|
||||||
unsigned IntID;
|
unsigned IntID;
|
||||||
llvm::Type *IntrinsicTy;
|
llvm::Type *IntrinsicTy;
|
||||||
switch (VTy->getNumElements()) {
|
switch (VTy->getMinNumElements()) {
|
||||||
default:
|
default:
|
||||||
llvm_unreachable("unsupported element count!");
|
llvm_unreachable("unsupported element count!");
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -7948,7 +7947,7 @@ Value *CodeGenFunction::EmitAArch64SVEBuiltinExpr(unsigned BuiltinID,
|
||||||
// Predicate results must be converted to svbool_t.
|
// Predicate results must be converted to svbool_t.
|
||||||
if (auto PredTy = dyn_cast<llvm::VectorType>(Call->getType()))
|
if (auto PredTy = dyn_cast<llvm::VectorType>(Call->getType()))
|
||||||
if (PredTy->getScalarType()->isIntegerTy(1))
|
if (PredTy->getScalarType()->isIntegerTy(1))
|
||||||
Call = EmitSVEPredicateCast(Call, cast<llvm::VectorType>(Ty));
|
Call = EmitSVEPredicateCast(Call, cast<llvm::ScalableVectorType>(Ty));
|
||||||
|
|
||||||
return Call;
|
return Call;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3919,7 +3919,8 @@ public:
|
||||||
llvm::ScalableVectorType *getSVEType(const SVETypeFlags &TypeFlags);
|
llvm::ScalableVectorType *getSVEType(const SVETypeFlags &TypeFlags);
|
||||||
llvm::ScalableVectorType *getSVEPredType(SVETypeFlags TypeFlags);
|
llvm::ScalableVectorType *getSVEPredType(SVETypeFlags TypeFlags);
|
||||||
llvm::Value *EmitSVEDupX(llvm::Value *Scalar);
|
llvm::Value *EmitSVEDupX(llvm::Value *Scalar);
|
||||||
llvm::Value *EmitSVEPredicateCast(llvm::Value *Pred, llvm::VectorType *VTy);
|
llvm::Value *EmitSVEPredicateCast(llvm::Value *Pred,
|
||||||
|
llvm::ScalableVectorType *VTy);
|
||||||
llvm::Value *EmitSVEGatherLoad(SVETypeFlags TypeFlags,
|
llvm::Value *EmitSVEGatherLoad(SVETypeFlags TypeFlags,
|
||||||
llvm::SmallVectorImpl<llvm::Value *> &Ops,
|
llvm::SmallVectorImpl<llvm::Value *> &Ops,
|
||||||
unsigned IntID);
|
unsigned IntID);
|
||||||
|
|
Loading…
Reference in New Issue