X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FIR%2FIRBuilder.cpp;h=194f01e26ae5a74fa798f3b724cb0f54b4fa08cc;hb=e37f2a0dc69326363cbe0b1e7a4120e71814deaf;hp=9782ecc4d14a3f49f106819dab5b09cc9c05c5b7;hpb=e46577f2b2890ef108f2ffb03a6d7a29609cb26f;p=oota-llvm.git diff --git a/lib/IR/IRBuilder.cpp b/lib/IR/IRBuilder.cpp index 9782ecc4d14..194f01e26ae 100644 --- a/lib/IR/IRBuilder.cpp +++ b/lib/IR/IRBuilder.cpp @@ -185,37 +185,56 @@ CallInst *IRBuilderBase::CreateAssumption(Value *Cond) { } /// Create a call to a Masked Load intrinsic. -/// Ops - an array of operands. -CallInst *IRBuilderBase::CreateMaskedLoad(ArrayRef Ops) { - // The only one overloaded type - the type of passthru value in this case - Type *DataTy = Ops[3]->getType(); - return CreateMaskedIntrinsic(Intrinsic::masked_load, Ops, DataTy); +/// Ptr - the base pointer for the load +/// Align - alignment of the source location +/// Mask - an vector of booleans which indicates what vector lanes should +/// be accessed in memory +/// PassThru - a pass-through value that is used to fill the masked-off lanes +/// of the result +/// Name - name of the result variable +CallInst *IRBuilderBase::CreateMaskedLoad(Value *Ptr, unsigned Align, + Value *Mask, Value *PassThru, + const Twine &Name) { + assert(Ptr->getType()->isPointerTy() && "Ptr must be of pointer type"); + // DataTy is the overloaded type + Type *DataTy = cast(Ptr->getType())->getElementType(); + assert(DataTy->isVectorTy() && "Ptr should point to a vector"); + if (!PassThru) + PassThru = UndefValue::get(DataTy); + Value *Ops[] = { Ptr, getInt32(Align), Mask, PassThru}; + return CreateMaskedIntrinsic(Intrinsic::masked_load, Ops, DataTy, Name); } /// Create a call to a Masked Store intrinsic. -/// Ops - an array of operands. -CallInst *IRBuilderBase::CreateMaskedStore(ArrayRef Ops) { - // DataTy - type of the data to be stored - the only one overloaded type - Type *DataTy = Ops[0]->getType(); - return CreateMaskedIntrinsic(Intrinsic::masked_store, Ops, DataTy); +/// Val - the data to be stored, +/// Ptr - the base pointer for the store +/// Align - alignment of the destination location +/// Mask - an vector of booleans which indicates what vector lanes should +/// be accessed in memory +CallInst *IRBuilderBase::CreateMaskedStore(Value *Val, Value *Ptr, + unsigned Align, Value *Mask) { + Value *Ops[] = { Val, Ptr, getInt32(Align), Mask }; + // Type of the data to be stored - the only one overloaded type + return CreateMaskedIntrinsic(Intrinsic::masked_store, Ops, Val->getType()); } /// Create a call to a Masked intrinsic, with given intrinsic Id, /// an array of operands - Ops, and one overloaded type - DataTy CallInst *IRBuilderBase::CreateMaskedIntrinsic(unsigned Id, ArrayRef Ops, - Type *DataTy) { + Type *DataTy, + const Twine &Name) { Module *M = BB->getParent()->getParent(); Type *OverloadedTypes[] = { DataTy }; Value *TheFn = Intrinsic::getDeclaration(M, (Intrinsic::ID)Id, OverloadedTypes); - return createCallHelper(TheFn, Ops, this); + return createCallHelper(TheFn, Ops, this, Name); } CallInst *IRBuilderBase::CreateGCStatepoint(Value *ActualCallee, - ArrayRef CallArgs, - ArrayRef DeoptArgs, - ArrayRef GCArgs, - const Twine& Name) { + ArrayRef CallArgs, + ArrayRef DeoptArgs, + ArrayRef GCArgs, + const Twine &Name) { // Extract out the type of the callee. PointerType *FuncPtrType = cast(ActualCallee->getType()); assert(isa(FuncPtrType->getElementType()) && @@ -244,16 +263,7 @@ CallInst *IRBuilderBase::CreateGCStatepoint(Value *ActualCallee, CallInst *IRBuilderBase::CreateGCResult(Instruction *Statepoint, Type *ResultType, const Twine &Name) { - Intrinsic::ID ID; - if (ResultType->isIntegerTy()) { - ID = Intrinsic::experimental_gc_result_int; - } else if (ResultType->isFloatingPointTy()) { - ID = Intrinsic::experimental_gc_result_float; - } else if (ResultType->isPointerTy()) { - ID = Intrinsic::experimental_gc_result_ptr; - } else { - llvm_unreachable("unimplemented result type for gc.result"); - } + Intrinsic::ID ID = Intrinsic::experimental_gc_result; Module *M = BB->getParent()->getParent(); Type *Types[] = {ResultType}; Value *FnGCResult = Intrinsic::getDeclaration(M, ID, Types);