25#define DEBUG_TYPE "ppc-lower-massv-entries"
32#define TLI_DEFINE_MASSV_VECFUNCS
33#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, VABI_PREFIX) VEC,
34#include "llvm/Analysis/VecFuncs.def"
35#undef TLI_DEFINE_MASSV_VECFUNCS
38class PPCLowerMASSVEntries :
public ModulePass {
44 bool runOnModule(
Module &M)
override;
46 StringRef getPassName()
const override {
return "PPC Lower MASS Entries"; }
55 static std::string createMASSVFuncName(
Function &Func,
66bool PPCLowerMASSVEntries::isMASSVFunc(
StringRef Name) {
75StringRef PPCLowerMASSVEntries::getCPUSuffix(
const PPCSubtarget *Subtarget) {
80 if (Subtarget->
isAIXABI() && Subtarget->hasP10Vector())
82 if (Subtarget->hasP9Vector())
84 if (Subtarget->hasP8Vector())
90 "Mininum subtarget for -vector-library=MASSV option is Power8 on Linux "
91 "and Power7 on AIX when vectorization is not disabled.");
97PPCLowerMASSVEntries::createMASSVFuncName(Function &Func,
98 const PPCSubtarget *Subtarget) {
99 StringRef Suffix = getCPUSuffix(Subtarget);
100 auto GenericName =
Func.getName().str();
101 std::string MASSVEntryName = GenericName + Suffix.
str();
102 return MASSVEntryName;
107bool PPCLowerMASSVEntries::handlePowSpecialCases(CallInst *CI, Function &Func,
109 if (
Func.getName() !=
"__powf4" &&
Func.getName() !=
"__powd2")
119 if (!CFP->isExactlyValue(0.75) && !CFP->isExactlyValue(0.25))
136bool PPCLowerMASSVEntries::lowerMASSVCall(CallInst *CI, Function &Func,
138 const PPCSubtarget *Subtarget) {
143 if (handlePowSpecialCases(CI, Func, M))
146 std::string MASSVEntryName = createMASSVFuncName(Func, Subtarget);
147 FunctionCallee FCache =
M.getOrInsertFunction(
148 MASSVEntryName,
Func.getFunctionType(),
Func.getAttributes());
155bool PPCLowerMASSVEntries::runOnModule(
Module &M) {
158 auto *TPC = getAnalysisIfAvailable<TargetPassConfig>();
162 auto &
TM = TPC->getTM<PPCTargetMachine>();
163 const PPCSubtarget *Subtarget;
165 for (Function &Func : M) {
166 if (!
Func.isDeclaration())
169 if (!isMASSVFunc(
Func.getName()))
177 for (
auto *User : MASSVUsers) {
183 Changed |= lowerMASSVCall(CI, Func, M, Subtarget);
190char PPCLowerMASSVEntries::ID = 0;
198 return new PPCLowerMASSVEntries();
static const Function * getParent(const Value *V)
Module.h This file contains the declarations for the Module class.
Machine Check Debug Module
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Target-Independent Code Generator Pass Configuration Options pass.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
Value * getArgOperand(unsigned i) const
void setCalledFunction(Function *Fn)
Sets the function called, including updating the function type.
This class represents a function call, abstracting a target machine's calling convention.
LLVM_ABI bool hasNoInfs() const LLVM_READONLY
Determine whether the no-infs flag is set.
LLVM_ABI bool hasNoSignedZeros() const LLVM_READONLY
Determine whether the no-signed-zeros flag is set.
LLVM_ABI bool hasApproxFunc() const LLVM_READONLY
Determine whether the approximate-math-functions flag is set.
ModulePass class - This class is used to implement unstructured interprocedural optimizations and ana...
A Module instance is used to store all the information related to an LLVM module.
StringRef - Represent a constant reference to a string, i.e.
std::string str() const
str - Get the contents as an std::string.
Type * getType() const
All values are typed, get the type of this value.
const ParentTy * getParent() const
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > Tys={})
Look up the Function declaration of the intrinsic id in the Module M.
NodeAddr< FuncNode * > Func
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
auto dyn_cast_or_null(const Y &Val)
ModulePass * createPPCLowerMASSVEntriesPass()
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
char & PPCLowerMASSVEntriesID
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.