forked from OSchip/llvm-project
Change Intrinsic::getDeclaration and friends to take an ArrayRef.
llvm-svn: 135154
This commit is contained in:
parent
512148fbeb
commit
e6e1933f31
|
@ -57,7 +57,7 @@ void BrainF::header(LLVMContext& C) {
|
|||
//declare void @llvm.memset.p0i8.i32(i8 *, i8, i32, i32, i1)
|
||||
Type *Tys[] = { Type::getInt8PtrTy(C), Type::getInt32Ty(C) };
|
||||
Function *memset_func = Intrinsic::getDeclaration(module, Intrinsic::memset,
|
||||
Tys, 2);
|
||||
Tys);
|
||||
|
||||
//declare i32 @getchar()
|
||||
getchar_func = cast<Function>(module->
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#ifndef LLVM_INTRINSICS_H
|
||||
#define LLVM_INTRINSICS_H
|
||||
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include <string>
|
||||
|
||||
namespace llvm {
|
||||
|
@ -44,12 +45,12 @@ namespace Intrinsic {
|
|||
|
||||
/// Intrinsic::getName(ID) - Return the LLVM name for an intrinsic, such as
|
||||
/// "llvm.ppc.altivec.lvx".
|
||||
std::string getName(ID id, Type **Tys = 0, unsigned numTys = 0);
|
||||
std::string getName(ID id, ArrayRef<Type*> Tys = ArrayRef<Type*>());
|
||||
|
||||
/// Intrinsic::getType(ID) - Return the function type for an intrinsic.
|
||||
///
|
||||
const FunctionType *getType(LLVMContext &Context, ID id,
|
||||
Type **Tys = 0, unsigned numTys = 0);
|
||||
ArrayRef<Type*> Tys = ArrayRef<Type*>());
|
||||
|
||||
/// Intrinsic::isOverloaded(ID) - Returns true if the intrinsic can be
|
||||
/// overloaded.
|
||||
|
@ -67,8 +68,8 @@ namespace Intrinsic {
|
|||
/// overloaded intrinsic, Tys should point to an array of numTys pointers to
|
||||
/// Type, and must provide exactly one type for each overloaded type in the
|
||||
/// intrinsic.
|
||||
Function *getDeclaration(Module *M, ID id, Type **Tys = 0,
|
||||
unsigned numTys = 0);
|
||||
Function *getDeclaration(Module *M, ID id,
|
||||
ArrayRef<Type*> Tys = ArrayRef<Type*>());
|
||||
|
||||
/// Map a GCC builtin name to an intrinsic ID.
|
||||
ID getIntrinsicForGCCBuiltin(const char *Prefix, const char *BuiltinName);
|
||||
|
|
|
@ -558,9 +558,8 @@ bool IntrinsicLowering::LowerToByteSwap(CallInst *CI) {
|
|||
return false;
|
||||
|
||||
// Okay, we can do this xform, do so now.
|
||||
Type *Tys[] = { Ty };
|
||||
Module *M = CI->getParent()->getParent()->getParent();
|
||||
Constant *Int = Intrinsic::getDeclaration(M, Intrinsic::bswap, Tys, 1);
|
||||
Constant *Int = Intrinsic::getDeclaration(M, Intrinsic::bswap, Ty);
|
||||
|
||||
Value *Op = CI->getArgOperand(0);
|
||||
Op = CallInst::Create(Int, Op, CI->getName(), CI);
|
||||
|
|
|
@ -1424,9 +1424,8 @@ Instruction *InstCombiner::MatchBSwap(BinaryOperator &I) {
|
|||
for (unsigned i = 1, e = ByteValues.size(); i != e; ++i)
|
||||
if (ByteValues[i] != V)
|
||||
return 0;
|
||||
Type *Tys[] = { ITy };
|
||||
Module *M = I.getParent()->getParent()->getParent();
|
||||
Function *F = Intrinsic::getDeclaration(M, Intrinsic::bswap, Tys, 1);
|
||||
Function *F = Intrinsic::getDeclaration(M, Intrinsic::bswap, ITy);
|
||||
return CallInst::Create(F, V);
|
||||
}
|
||||
|
||||
|
|
|
@ -220,7 +220,7 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
|
|||
Type *Tys[3] = { CI.getArgOperand(0)->getType(),
|
||||
CI.getArgOperand(1)->getType(),
|
||||
CI.getArgOperand(2)->getType() };
|
||||
CI.setCalledFunction(Intrinsic::getDeclaration(M, MemCpyID, Tys, 3));
|
||||
CI.setCalledFunction(Intrinsic::getDeclaration(M, MemCpyID, Tys));
|
||||
Changed = true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1684,7 +1684,7 @@ static Instruction *ProcessUGT_ADDCST_ADD(ICmpInst &I, Value *A, Value *B,
|
|||
|
||||
Type *NewType = IntegerType::get(OrigAdd->getContext(), NewWidth);
|
||||
Value *F = Intrinsic::getDeclaration(M, Intrinsic::sadd_with_overflow,
|
||||
&NewType, 1);
|
||||
NewType);
|
||||
|
||||
InstCombiner::BuilderTy *Builder = IC.Builder;
|
||||
|
||||
|
@ -1725,7 +1725,7 @@ static Instruction *ProcessUAddIdiom(Instruction &I, Value *OrigAddV,
|
|||
|
||||
Module *M = I.getParent()->getParent()->getParent();
|
||||
Type *Ty = LHS->getType();
|
||||
Value *F = Intrinsic::getDeclaration(M, Intrinsic::uadd_with_overflow, &Ty,1);
|
||||
Value *F = Intrinsic::getDeclaration(M, Intrinsic::uadd_with_overflow, Ty);
|
||||
CallInst *Call = Builder->CreateCall2(F, LHS, RHS, "uadd");
|
||||
Value *Add = Builder->CreateExtractValue(Call, 0);
|
||||
|
||||
|
|
|
@ -844,7 +844,7 @@ bool MemCpyOpt::processMemMove(MemMoveInst *M) {
|
|||
M->getRawSource()->getType(),
|
||||
M->getLength()->getType() };
|
||||
M->setCalledFunction(Intrinsic::getDeclaration(Mod, Intrinsic::memcpy,
|
||||
ArgTys, 3));
|
||||
ArgTys));
|
||||
|
||||
// MemDep may have over conservative information about this instruction, just
|
||||
// conservatively flush it from the cache.
|
||||
|
|
|
@ -994,7 +994,7 @@ struct FFSOpt : public LibCallOptimization {
|
|||
// ffs(x) -> x != 0 ? (i32)llvm.cttz(x)+1 : 0
|
||||
Type *ArgType = Op->getType();
|
||||
Value *F = Intrinsic::getDeclaration(Callee->getParent(),
|
||||
Intrinsic::cttz, &ArgType, 1);
|
||||
Intrinsic::cttz, ArgType);
|
||||
Value *V = B.CreateCall(F, Op, "cttz");
|
||||
V = B.CreateAdd(V, ConstantInt::get(V->getType(), 1), "tmp");
|
||||
V = B.CreateIntCast(V, B.getInt32Ty(), false, "tmp");
|
||||
|
|
|
@ -683,7 +683,7 @@ static Value *HandleByValArgument(Value *Arg, Instruction *TheCall,
|
|||
Type *Tys[3] = {VoidPtrTy, VoidPtrTy, Type::getInt64Ty(Context)};
|
||||
Function *MemCpyFn = Intrinsic::getDeclaration(Caller->getParent(),
|
||||
Intrinsic::memcpy,
|
||||
Tys, 3);
|
||||
Tys);
|
||||
Value *DestCast = new BitCastInst(NewAlloca, VoidPtrTy, "tmp", TheCall);
|
||||
Value *SrcCast = new BitCastInst(Arg, VoidPtrTy, "tmp", TheCall);
|
||||
|
||||
|
|
|
@ -333,7 +333,7 @@ unsigned Function::getIntrinsicID() const {
|
|||
return 0;
|
||||
}
|
||||
|
||||
std::string Intrinsic::getName(ID id, Type **Tys, unsigned numTys) {
|
||||
std::string Intrinsic::getName(ID id, ArrayRef<Type*> Tys) {
|
||||
assert(id < num_intrinsics && "Invalid intrinsic ID!");
|
||||
static const char * const Table[] = {
|
||||
"not_intrinsic",
|
||||
|
@ -341,10 +341,10 @@ std::string Intrinsic::getName(ID id, Type **Tys, unsigned numTys) {
|
|||
#include "llvm/Intrinsics.gen"
|
||||
#undef GET_INTRINSIC_NAME_TABLE
|
||||
};
|
||||
if (numTys == 0)
|
||||
if (Tys.empty())
|
||||
return Table[id];
|
||||
std::string Result(Table[id]);
|
||||
for (unsigned i = 0; i < numTys; ++i) {
|
||||
for (unsigned i = 0; i < Tys.size(); ++i) {
|
||||
if (const PointerType* PTyp = dyn_cast<PointerType>(Tys[i])) {
|
||||
Result += ".p" + llvm::utostr(PTyp->getAddressSpace()) +
|
||||
EVT::getEVT(PTyp->getElementType()).getEVTString();
|
||||
|
@ -356,8 +356,7 @@ std::string Intrinsic::getName(ID id, Type **Tys, unsigned numTys) {
|
|||
}
|
||||
|
||||
const FunctionType *Intrinsic::getType(LLVMContext &Context,
|
||||
ID id, Type **Tys,
|
||||
unsigned numTys) {
|
||||
ID id, ArrayRef<Type*> Tys) {
|
||||
const Type *ResultTy = NULL;
|
||||
std::vector<Type*> ArgTys;
|
||||
bool IsVarArg = false;
|
||||
|
@ -384,14 +383,12 @@ bool Intrinsic::isOverloaded(ID id) {
|
|||
#include "llvm/Intrinsics.gen"
|
||||
#undef GET_INTRINSIC_ATTRIBUTES
|
||||
|
||||
Function *Intrinsic::getDeclaration(Module *M, ID id, Type **Tys,
|
||||
unsigned numTys) {
|
||||
Function *Intrinsic::getDeclaration(Module *M, ID id, ArrayRef<Type*> Tys) {
|
||||
// There can never be multiple globals with the same name of different types,
|
||||
// because intrinsics must be a specific type.
|
||||
return
|
||||
cast<Function>(M->getOrInsertFunction(getName(id, Tys, numTys),
|
||||
getType(M->getContext(),
|
||||
id, Tys, numTys)));
|
||||
cast<Function>(M->getOrInsertFunction(getName(id, Tys),
|
||||
getType(M->getContext(), id, Tys)));
|
||||
}
|
||||
|
||||
// This defines the "Intrinsic::getIntrinsicForGCCBuiltin()" method.
|
||||
|
|
|
@ -67,7 +67,7 @@ CreateMemSet(Value *Ptr, Value *Val, Value *Size, unsigned Align,
|
|||
Value *Ops[] = { Ptr, Val, Size, getInt32(Align), getInt1(isVolatile) };
|
||||
Type *Tys[] = { Ptr->getType(), Size->getType() };
|
||||
Module *M = BB->getParent()->getParent();
|
||||
Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memset, Tys, 2);
|
||||
Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memset, Tys);
|
||||
|
||||
CallInst *CI = createCallHelper(TheFn, Ops, 5, this);
|
||||
|
||||
|
@ -87,7 +87,7 @@ CreateMemCpy(Value *Dst, Value *Src, Value *Size, unsigned Align,
|
|||
Value *Ops[] = { Dst, Src, Size, getInt32(Align), getInt1(isVolatile) };
|
||||
Type *Tys[] = { Dst->getType(), Src->getType(), Size->getType() };
|
||||
Module *M = BB->getParent()->getParent();
|
||||
Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memcpy, Tys, 3);
|
||||
Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memcpy, Tys);
|
||||
|
||||
CallInst *CI = createCallHelper(TheFn, Ops, 5, this);
|
||||
|
||||
|
@ -107,7 +107,7 @@ CreateMemMove(Value *Dst, Value *Src, Value *Size, unsigned Align,
|
|||
Value *Ops[] = { Dst, Src, Size, getInt32(Align), getInt1(isVolatile) };
|
||||
Type *Tys[] = { Dst->getType(), Src->getType(), Size->getType() };
|
||||
Module *M = BB->getParent()->getParent();
|
||||
Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memmove, Tys, 3);
|
||||
Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memmove, Tys);
|
||||
|
||||
CallInst *CI = createCallHelper(TheFn, Ops, 5, this);
|
||||
|
||||
|
|
|
@ -259,7 +259,7 @@ static void EmitTypeGenerate(raw_ostream &OS, const Record *ArgType,
|
|||
} else if (VT == MVT::iPTRAny) {
|
||||
// Make sure the user has passed us an argument type to overload. If not,
|
||||
// treat it as an ordinary (not overloaded) intrinsic.
|
||||
OS << "(" << ArgNo << " < numTys) ? Tys[" << ArgNo
|
||||
OS << "(" << ArgNo << " < Tys.size()) ? Tys[" << ArgNo
|
||||
<< "] : PointerType::getUnqual(";
|
||||
EmitTypeGenerate(OS, ArgType->getValueAsDef("ElTy"), ArgNo);
|
||||
OS << ")";
|
||||
|
|
Loading…
Reference in New Issue