123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- //===- llvm/Transforms/Utils/VectorUtils.h - Vector utilities -*- C++ -*-=====//
- //
- // The LLVM Compiler Infrastructure
- //
- // This file is distributed under the University of Illinois Open Source
- // License. See LICENSE.TXT for details.
- //
- //===----------------------------------------------------------------------===//
- //
- // This file defines some vectorizer utilities.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_TRANSFORMS_UTILS_VECTORUTILS_H
- #define LLVM_TRANSFORMS_UTILS_VECTORUTILS_H
- #include "llvm/Analysis/TargetLibraryInfo.h"
- #include "llvm/IR/IntrinsicInst.h"
- #include "llvm/IR/Intrinsics.h"
- namespace llvm {
- class GetElementPtrInst;
- class Loop;
- class ScalarEvolution;
- class Type;
- class Value;
- /// \brief Identify if the intrinsic is trivially vectorizable.
- /// This method returns true if the intrinsic's argument types are all
- /// scalars for the scalar form of the intrinsic and all vectors for
- /// the vector form of the intrinsic.
- bool isTriviallyVectorizable(Intrinsic::ID ID);
- /// \brief Identifies if the intrinsic has a scalar operand. It checks for
- /// ctlz,cttz and powi special intrinsics whose argument is scalar.
- bool hasVectorInstrinsicScalarOpd(Intrinsic::ID ID, unsigned ScalarOpdIdx);
- /// \brief Identify if call has a unary float signature
- /// It returns input intrinsic ID if call has a single argument,
- /// argument type and call instruction type should be floating
- /// point type and call should only reads memory.
- /// else return not_intrinsic.
- Intrinsic::ID checkUnaryFloatSignature(const CallInst &I,
- Intrinsic::ID ValidIntrinsicID);
- /// \brief Identify if call has a binary float signature
- /// It returns input intrinsic ID if call has two arguments,
- /// arguments type and call instruction type should be floating
- /// point type and call should only reads memory.
- /// else return not_intrinsic.
- Intrinsic::ID checkBinaryFloatSignature(const CallInst &I,
- Intrinsic::ID ValidIntrinsicID);
- /// \brief Returns intrinsic ID for call.
- /// For the input call instruction it finds mapping intrinsic and returns
- /// its intrinsic ID, in case it does not found it return not_intrinsic.
- Intrinsic::ID getIntrinsicIDForCall(CallInst *CI, const TargetLibraryInfo *TLI);
- /// \brief Find the operand of the GEP that should be checked for consecutive
- /// stores. This ignores trailing indices that have no effect on the final
- /// pointer.
- unsigned getGEPInductionOperand(const GetElementPtrInst *Gep);
- /// \brief If the argument is a GEP, then returns the operand identified by
- /// getGEPInductionOperand. However, if there is some other non-loop-invariant
- /// operand, it returns that instead.
- Value *stripGetElementPtr(Value *Ptr, ScalarEvolution *SE, Loop *Lp);
- /// \brief If a value has only one user that is a CastInst, return it.
- Value *getUniqueCastUse(Value *Ptr, Loop *Lp, Type *Ty);
- /// \brief Get the stride of a pointer access in a loop. Looks for symbolic
- /// strides "a[i*stride]". Returns the symbolic stride, or null otherwise.
- Value *getStrideFromPointer(Value *Ptr, ScalarEvolution *SE, Loop *Lp);
- /// \brief Given a vector and an element number, see if the scalar value is
- /// already around as a register, for example if it were inserted then extracted
- /// from the vector.
- Value *findScalarElement(Value *V, unsigned EltNo);
- } // llvm namespace
- #endif
|