Changeset View
Changeset View
Standalone View
Standalone View
llvm/lib/Analysis/VectorUtils.cpp
Show First 20 Lines • Show All 85 Lines • ▼ Show 20 Lines | bool llvm::isTriviallyVectorizable(Intrinsic::ID ID) { | ||||
case Intrinsic::roundeven: | case Intrinsic::roundeven: | ||||
case Intrinsic::pow: | case Intrinsic::pow: | ||||
case Intrinsic::fma: | case Intrinsic::fma: | ||||
case Intrinsic::fmuladd: | case Intrinsic::fmuladd: | ||||
case Intrinsic::powi: | case Intrinsic::powi: | ||||
case Intrinsic::canonicalize: | case Intrinsic::canonicalize: | ||||
case Intrinsic::fptosi_sat: | case Intrinsic::fptosi_sat: | ||||
case Intrinsic::fptoui_sat: | case Intrinsic::fptoui_sat: | ||||
case Intrinsic::is_fpclass: | |||||
return true; | return true; | ||||
default: | default: | ||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
/// Identifies if the vector form of the intrinsic has a scalar operand. | /// Identifies if the vector form of the intrinsic has a scalar operand. | ||||
bool llvm::isVectorIntrinsicWithScalarOpAtArg(Intrinsic::ID ID, | bool llvm::isVectorIntrinsicWithScalarOpAtArg(Intrinsic::ID ID, | ||||
unsigned ScalarOpdIdx) { | unsigned ScalarOpdIdx) { | ||||
switch (ID) { | switch (ID) { | ||||
case Intrinsic::abs: | case Intrinsic::abs: | ||||
case Intrinsic::ctlz: | case Intrinsic::ctlz: | ||||
case Intrinsic::cttz: | case Intrinsic::cttz: | ||||
case Intrinsic::powi: | case Intrinsic::powi: | ||||
case Intrinsic::is_fpclass: | |||||
return (ScalarOpdIdx == 1); | return (ScalarOpdIdx == 1); | ||||
case Intrinsic::smul_fix: | case Intrinsic::smul_fix: | ||||
case Intrinsic::smul_fix_sat: | case Intrinsic::smul_fix_sat: | ||||
case Intrinsic::umul_fix: | case Intrinsic::umul_fix: | ||||
case Intrinsic::umul_fix_sat: | case Intrinsic::umul_fix_sat: | ||||
return (ScalarOpdIdx == 2); | return (ScalarOpdIdx == 2); | ||||
default: | default: | ||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
bool llvm::isVectorIntrinsicWithOverloadTypeAtArg(Intrinsic::ID ID, | bool llvm::isVectorIntrinsicWithOverloadTypeAtArg(Intrinsic::ID ID, | ||||
unsigned OpdIdx) { | unsigned OpdIdx) { | ||||
switch (ID) { | switch (ID) { | ||||
case Intrinsic::fptosi_sat: | case Intrinsic::fptosi_sat: | ||||
case Intrinsic::fptoui_sat: | case Intrinsic::fptoui_sat: | ||||
case Intrinsic::is_fpclass: | |||||
return OpdIdx == 0; | return OpdIdx == 0; | ||||
case Intrinsic::powi: | case Intrinsic::powi: | ||||
return OpdIdx == 1; | return OpdIdx == 1; | ||||
default: | default: | ||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
bool llvm::isVectorIntrinsicWithReturnOverloadType(Intrinsic::ID ID) { | |||||
switch (ID) { | |||||
case Intrinsic::is_fpclass: // The return element type is i1 and the vector | |||||
// width of return type matches with the first | |||||
// operand. | |||||
return false; | |||||
default: | |||||
return true; | |||||
} | |||||
} | |||||
/// Returns intrinsic ID for call. | /// Returns intrinsic ID for call. | ||||
/// For the input call instruction it finds mapping intrinsic and returns | /// For the input call instruction it finds mapping intrinsic and returns | ||||
/// its ID, in case it does not found it return not_intrinsic. | /// its ID, in case it does not found it return not_intrinsic. | ||||
Intrinsic::ID llvm::getVectorIntrinsicIDForCall(const CallInst *CI, | Intrinsic::ID llvm::getVectorIntrinsicIDForCall(const CallInst *CI, | ||||
const TargetLibraryInfo *TLI) { | const TargetLibraryInfo *TLI) { | ||||
Intrinsic::ID ID = getIntrinsicForCallSite(*CI, TLI); | Intrinsic::ID ID = getIntrinsicForCallSite(*CI, TLI); | ||||
if (ID == Intrinsic::not_intrinsic) | if (ID == Intrinsic::not_intrinsic) | ||||
return Intrinsic::not_intrinsic; | return Intrinsic::not_intrinsic; | ||||
▲ Show 20 Lines • Show All 1,415 Lines • Show Last 20 Lines |