diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/IR/Function.cpp | 21 | ||||
| -rw-r--r-- | llvm/lib/IR/IRBuilder.cpp | 2 | 
2 files changed, 21 insertions, 2 deletions
diff --git a/llvm/lib/IR/Function.cpp b/llvm/lib/IR/Function.cpp index affd85e79ee..770524feace 100644 --- a/llvm/lib/IR/Function.cpp +++ b/llvm/lib/IR/Function.cpp @@ -700,7 +700,8 @@ enum IIT_Info {    IIT_STRUCT6 = 38,    IIT_STRUCT7 = 39,    IIT_STRUCT8 = 40, -  IIT_F128 = 41 +  IIT_F128 = 41, +  IIT_VEC_ELEMENT = 42  };  static void DecodeIITType(unsigned &NextElt, ArrayRef<unsigned char> Infos, @@ -865,6 +866,12 @@ static void DecodeIITType(unsigned &NextElt, ArrayRef<unsigned char> Infos,        DecodeIITType(NextElt, Infos, OutputTable);      return;    } +  case IIT_VEC_ELEMENT: { +    unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]); +    OutputTable.push_back(IITDescriptor::get(IITDescriptor::VecElementArgument, +                                             ArgInfo)); +    return; +  }    }    llvm_unreachable("unhandled");  } @@ -977,6 +984,12 @@ static Type *DecodeFixedType(ArrayRef<Intrinsic::IITDescriptor> &Infos,      Type *EltTy = VTy->getVectorElementType();      return PointerType::getUnqual(EltTy);    } +  case IITDescriptor::VecElementArgument: { +    Type *Ty = Tys[D.getArgumentNumber()]; +    if (VectorType *VTy = dyn_cast<VectorType>(Ty)) +      return VTy->getElementType(); +    llvm_unreachable("Expected an argument of Vector Type"); +  }    case IITDescriptor::VecOfAnyPtrsToElt:      // Return the overloaded type (which determines the pointers address space)      return Tys[D.getOverloadArgNumber()]; @@ -1237,6 +1250,12 @@ static bool matchIntrinsicType(        return ThisArgEltTy->getElementType() !=               ReferenceType->getVectorElementType();      } +    case IITDescriptor::VecElementArgument: { +      if (D.getArgumentNumber() >= ArgTys.size()) +        return IsDeferredCheck ? true : DeferCheck(Ty); +      auto *ReferenceType = dyn_cast<VectorType>(ArgTys[D.getArgumentNumber()]); +      return !ReferenceType || Ty != ReferenceType->getElementType(); +    }    }    llvm_unreachable("unhandled");  } diff --git a/llvm/lib/IR/IRBuilder.cpp b/llvm/lib/IR/IRBuilder.cpp index 36c823e7a10..0c6461c9078 100644 --- a/llvm/lib/IR/IRBuilder.cpp +++ b/llvm/lib/IR/IRBuilder.cpp @@ -313,7 +313,7 @@ static CallInst *getReductionIntrinsic(IRBuilderBase *Builder, Intrinsic::ID ID,                                      Value *Src) {    Module *M = Builder->GetInsertBlock()->getParent()->getParent();    Value *Ops[] = {Src}; -  Type *Tys[] = { Src->getType()->getVectorElementType(), Src->getType() }; +  Type *Tys[] = { Src->getType() };    auto Decl = Intrinsic::getDeclaration(M, ID, Tys);    return createCallHelper(Decl, Ops, Builder);  }  | 

