r243425 - [CodeGen] Clean up CGBuiltin a bit.

Benjamin Kramer benny.kra at gmail.com
Wed Jul 29 04:41:50 PDT 2015


On Wed, Jul 29, 2015 at 2:25 AM, David Blaikie <dblaikie at gmail.com> wrote:
>
>
> On Tue, Jul 28, 2015 at 8:40 AM, Benjamin Kramer <benny.kra at googlemail.com>
> wrote:
>>
>> Author: d0k
>> Date: Tue Jul 28 10:40:11 2015
>> New Revision: 243425
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=243425&view=rev
>> Log:
>> [CodeGen] Clean up CGBuiltin a bit.
>>
>> - Use cached LLVM types
>> - Turn SmallVectors into Arrays/ArrayRef if the size is static
>> - Use ConstantInt::get's implicit splatting for vector types
>>
>> No functionality change intended.
>>
>> Modified:
>>     cfe/trunk/lib/CodeGen/CGBuiltin.cpp
>>
>> Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=243425&r1=243424&r2=243425&view=diff
>>
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Tue Jul 28 10:40:11 2015
>> @@ -1940,10 +1940,7 @@ Value *CodeGenFunction::EmitNeonCall(Fun
>>  Value *CodeGenFunction::EmitNeonShiftVector(Value *V, llvm::Type *Ty,
>>                                              bool neg) {
>>    int SV = cast<ConstantInt>(V)->getSExtValue();
>> -
>> -  llvm::VectorType *VTy = cast<llvm::VectorType>(Ty);
>> -  llvm::Constant *C = ConstantInt::get(VTy->getElementType(), neg ? -SV :
>> SV);
>> -  return llvm::ConstantVector::getSplat(VTy->getNumElements(), C);
>> +  return ConstantInt::get(Ty, neg ? -SV : SV);
>>  }
>>
>>  // \brief Right-shift a vector by a constant.
>> @@ -1962,8 +1959,7 @@ Value *CodeGenFunction::EmitNeonRShiftIm
>>    if (ShiftAmt == EltSize) {
>>      if (usgn) {
>>        // Right-shifting an unsigned value by its size yields 0.
>> -      llvm::Constant *Zero = ConstantInt::get(VTy->getElementType(), 0);
>> -      return llvm::ConstantVector::getSplat(VTy->getNumElements(), Zero);
>> +      return llvm::ConstantAggregateZero::get(VTy);
>>      } else {
>>        // Right-shifting a signed value by its size is equivalent
>>        // to a shift of size-1.
>> @@ -2782,9 +2778,8 @@ Value *CodeGenFunction::EmitCommonNeonBu
>>      Ops[0] = Builder.CreateAdd(Ops[0], Ops[1], "vaddhn");
>>
>>      // %high = lshr <4 x i32> %sum, <i32 16, i32 16, i32 16, i32 16>
>> -    Constant *ShiftAmt = ConstantInt::get(SrcTy->getElementType(),
>> -                                       SrcTy->getScalarSizeInBits() / 2);
>> -    ShiftAmt = ConstantVector::getSplat(VTy->getNumElements(), ShiftAmt);
>> +    Constant *ShiftAmt =
>> +        ConstantInt::get(SrcTy, SrcTy->getScalarSizeInBits() / 2);
>>      Ops[0] = Builder.CreateLShr(Ops[0], ShiftAmt, "vaddhn");
>>
>>      // %res = trunc <4 x i32> %high to <4 x i16>
>> @@ -3019,14 +3014,10 @@ Value *CodeGenFunction::EmitCommonNeonBu
>>    case NEON::BI__builtin_neon_vqdmlal_v:
>>    case NEON::BI__builtin_neon_vqdmlsl_v: {
>>      SmallVector<Value *, 2> MulOps(Ops.begin() + 1, Ops.end());
>> -    Value *Mul = EmitNeonCall(CGM.getIntrinsic(LLVMIntrinsic, Ty),
>> -                              MulOps, "vqdmlal");
>> -
>> -    SmallVector<Value *, 2> AccumOps;
>> -    AccumOps.push_back(Ops[0]);
>> -    AccumOps.push_back(Mul);
>> -    return EmitNeonCall(CGM.getIntrinsic(AltLLVMIntrinsic, Ty),
>> -                        AccumOps, NameHint);
>> +    Ops[1] =
>> +        EmitNeonCall(CGM.getIntrinsic(LLVMIntrinsic, Ty), MulOps,
>> "vqdmlal");
>> +    Ops.resize(2);
>> +    return EmitNeonCall(CGM.getIntrinsic(AltLLVMIntrinsic, Ty), Ops,
>> NameHint);
>>    }
>>    case NEON::BI__builtin_neon_vqshl_n_v:
>>    case NEON::BI__builtin_neon_vqshlq_n_v:
>> @@ -3101,9 +3092,8 @@ Value *CodeGenFunction::EmitCommonNeonBu
>>      Ops[0] = Builder.CreateSub(Ops[0], Ops[1], "vsubhn");
>>
>>      // %high = lshr <4 x i32> %sum, <i32 16, i32 16, i32 16, i32 16>
>> -    Constant *ShiftAmt = ConstantInt::get(SrcTy->getElementType(),
>> -                                       SrcTy->getScalarSizeInBits() / 2);
>> -    ShiftAmt = ConstantVector::getSplat(VTy->getNumElements(), ShiftAmt);
>> +    Constant *ShiftAmt =
>> +        ConstantInt::get(SrcTy, SrcTy->getScalarSizeInBits() / 2);
>>      Ops[0] = Builder.CreateLShr(Ops[0], ShiftAmt, "vsubhn");
>>
>>      // %res = trunc <4 x i32> %high to <4 x i16>
>> @@ -3252,33 +3242,37 @@ static Value *packTBLDVectorList(CodeGen
>>  }
>>
>>  Value *CodeGenFunction::GetValueForARMHint(unsigned BuiltinID) {
>> +  unsigned Value;
>>    switch (BuiltinID) {
>>    default:
>>      return nullptr;
>>    case ARM::BI__builtin_arm_nop:
>> -    return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_hint),
>> -                              llvm::ConstantInt::get(Int32Ty, 0));
>> +    Value = 0;
>> +    break;
>>    case ARM::BI__builtin_arm_yield:
>>    case ARM::BI__yield:
>> -    return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_hint),
>> -                              llvm::ConstantInt::get(Int32Ty, 1));
>> +    Value = 1;
>> +    break;
>>    case ARM::BI__builtin_arm_wfe:
>>    case ARM::BI__wfe:
>> -    return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_hint),
>> -                              llvm::ConstantInt::get(Int32Ty, 2));
>> +    Value = 2;
>> +    break;
>>    case ARM::BI__builtin_arm_wfi:
>>    case ARM::BI__wfi:
>> -    return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_hint),
>> -                              llvm::ConstantInt::get(Int32Ty, 3));
>> +    Value = 3;
>> +    break;
>>    case ARM::BI__builtin_arm_sev:
>>    case ARM::BI__sev:
>> -    return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_hint),
>> -                              llvm::ConstantInt::get(Int32Ty, 4));
>> +    Value = 4;
>> +    break;
>>    case ARM::BI__builtin_arm_sevl:
>>    case ARM::BI__sevl:
>> -    return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_hint),
>> -                              llvm::ConstantInt::get(Int32Ty, 5));
>> +    Value = 5;
>> +    break;
>>    }
>> +
>> +  return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_hint),
>> +                            llvm::ConstantInt::get(Int32Ty, Value));
>>  }
>>
>>  // Generates the IR for the read/write special register builtin,
>> @@ -3428,9 +3422,9 @@ Value *CodeGenFunction::EmitARMBuiltinEx
>>    if (BuiltinID == ARM::BI__clear_cache) {
>>      assert(E->getNumArgs() == 2 && "__clear_cache takes 2 arguments");
>>      const FunctionDecl *FD = E->getDirectCallee();
>> -    SmallVector<Value*, 2> Ops;
>> +    Value *Ops[2];
>>      for (unsigned i = 0; i < 2; i++)
>> -      Ops.push_back(EmitScalarExpr(E->getArg(i)));
>> +      Ops[i] = EmitScalarExpr(E->getArg(i));
>>      llvm::Type *Ty = CGM.getTypes().ConvertType(FD->getType());
>>      llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty);
>>      StringRef Name = FD->getName();
>> @@ -3809,7 +3803,7 @@ Value *CodeGenFunction::EmitARMBuiltinEx
>>      if (VTy->getElementType()->isIntegerTy(64)) {
>>        // Extract the other lane.
>>        Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
>> -      int Lane = cast<ConstantInt>(Ops[2])->getZExtValue();
>> +      uint32_t Lane = cast<ConstantInt>(Ops[2])->getZExtValue();
>>        Value *SV = llvm::ConstantVector::get(ConstantInt::get(Int32Ty,
>> 1-Lane));
>>        Ops[1] = Builder.CreateShuffleVector(Ops[1], Ops[1], SV);
>>        // Load the value as a one-element vector.
>> @@ -3817,10 +3811,8 @@ Value *CodeGenFunction::EmitARMBuiltinEx
>>        Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld1, Ty);
>>        Value *Ld = Builder.CreateCall(F, {Ops[0], Align});
>>        // Combine them.
>> -      SmallVector<Constant*, 2> Indices;
>> -      Indices.push_back(ConstantInt::get(Int32Ty, 1-Lane));
>> -      Indices.push_back(ConstantInt::get(Int32Ty, Lane));
>> -      SV = llvm::ConstantVector::get(Indices);
>> +      uint32_t Indices[] = {1 - Lane, Lane};
>> +      SV = llvm::ConstantDataVector::get(getLLVMContext(), Indices);
>>        return Builder.CreateShuffleVector(Ops[1], Ld, SV, "vld1q_lane");
>>      }
>>      // fall through
>> @@ -4029,52 +4021,41 @@ static Value *EmitAArch64TblBuiltinExpr(
>>
>>    // Determine the type of this overloaded NEON intrinsic.
>>    NeonTypeFlags Type(Result.getZExtValue());
>> -  llvm::VectorType *VTy = GetNeonType(&CGF, Type);
>> -  llvm::Type *Ty = VTy;
>> +  llvm::VectorType *Ty = GetNeonType(&CGF, Type);
>>    if (!Ty)
>>      return nullptr;
>>
>> -  unsigned nElts = VTy->getNumElements();
>> -
>>    CodeGen::CGBuilderTy &Builder = CGF.Builder;
>>
>>    // AArch64 scalar builtins are not overloaded, they do not have an
>> extra
>>    // argument that specifies the vector type, need to handle each case.
>> -  SmallVector<Value *, 2> TblOps;
>>    switch (BuiltinID) {
>>    case NEON::BI__builtin_neon_vtbl1_v: {
>> -    TblOps.push_back(Ops[0]);
>> -    return packTBLDVectorList(CGF, TblOps, nullptr, Ops[1], Ty,
>> -                              Intrinsic::aarch64_neon_tbl1, "vtbl1");
>> +    return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(0, 1),
>
>
> Does this slice the first element off Ops and pass it as an ArrayRef? Would
> it work to just write this argument as "Ops[0]" (ArrayRef has an implicit
> ctor from a T&)?
>
> I suppose there's some symmetry with the later cases in this switch, though.

Exactly, there is some (almost) copy pasted here and I wanted to keep
it as similar as possible.

> Would it make sense to declare an ArrayRef to Ops before the switch, since
> it seems makeArrayRef(Ops) is called in each of the cases?

Would make sense, not sure if it really helps readability though.

- Ben

>>
>> nullptr,
>> +                              Ops[1], Ty, Intrinsic::aarch64_neon_tbl1,
>> +                              "vtbl1");
>>    }
>>    case NEON::BI__builtin_neon_vtbl2_v: {
>> -    TblOps.push_back(Ops[0]);
>> -    TblOps.push_back(Ops[1]);
>> -    return packTBLDVectorList(CGF, TblOps, nullptr, Ops[2], Ty,
>> -                              Intrinsic::aarch64_neon_tbl1, "vtbl1");
>> +    return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(0, 2),
>> nullptr,
>> +                              Ops[2], Ty, Intrinsic::aarch64_neon_tbl1,
>> +                              "vtbl1");
>>    }
>>    case NEON::BI__builtin_neon_vtbl3_v: {
>> -    TblOps.push_back(Ops[0]);
>> -    TblOps.push_back(Ops[1]);
>> -    TblOps.push_back(Ops[2]);
>> -    return packTBLDVectorList(CGF, TblOps, nullptr, Ops[3], Ty,
>> -                              Intrinsic::aarch64_neon_tbl2, "vtbl2");
>> +    return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(0, 3),
>> nullptr,
>> +                              Ops[3], Ty, Intrinsic::aarch64_neon_tbl2,
>> +                              "vtbl2");
>>    }
>>    case NEON::BI__builtin_neon_vtbl4_v: {
>> -    TblOps.push_back(Ops[0]);
>> -    TblOps.push_back(Ops[1]);
>> -    TblOps.push_back(Ops[2]);
>> -    TblOps.push_back(Ops[3]);
>> -    return packTBLDVectorList(CGF, TblOps, nullptr, Ops[4], Ty,
>> -                              Intrinsic::aarch64_neon_tbl2, "vtbl2");
>> +    return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(0, 4),
>> nullptr,
>> +                              Ops[4], Ty, Intrinsic::aarch64_neon_tbl2,
>> +                              "vtbl2");
>>    }
>>    case NEON::BI__builtin_neon_vtbx1_v: {
>> -    TblOps.push_back(Ops[1]);
>> -    Value *TblRes = packTBLDVectorList(CGF, TblOps, nullptr, Ops[2], Ty,
>> -                                       Intrinsic::aarch64_neon_tbl1,
>> "vtbl1");
>> +    Value *TblRes =
>> +        packTBLDVectorList(CGF, makeArrayRef(Ops).slice(1, 1), nullptr,
>> Ops[2],
>> +                           Ty, Intrinsic::aarch64_neon_tbl1, "vtbl1");
>>
>> -    llvm::Constant *Eight = ConstantInt::get(VTy->getElementType(), 8);
>> -    Value* EightV = llvm::ConstantVector::getSplat(nElts, Eight);
>> +    llvm::Constant *EightV = ConstantInt::get(Ty, 8);
>>      Value *CmpRes = Builder.CreateICmp(ICmpInst::ICMP_UGE, Ops[2],
>> EightV);
>>      CmpRes = Builder.CreateSExt(CmpRes, Ty);
>>
>> @@ -4083,20 +4064,16 @@ static Value *EmitAArch64TblBuiltinExpr(
>>      return Builder.CreateOr(EltsFromInput, EltsFromTbl, "vtbx");
>>    }
>>    case NEON::BI__builtin_neon_vtbx2_v: {
>> -    TblOps.push_back(Ops[1]);
>> -    TblOps.push_back(Ops[2]);
>> -    return packTBLDVectorList(CGF, TblOps, Ops[0], Ops[3], Ty,
>> -                              Intrinsic::aarch64_neon_tbx1, "vtbx1");
>> +    return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(1, 2), Ops[0],
>> +                              Ops[3], Ty, Intrinsic::aarch64_neon_tbx1,
>> +                              "vtbx1");
>>    }
>>    case NEON::BI__builtin_neon_vtbx3_v: {
>> -    TblOps.push_back(Ops[1]);
>> -    TblOps.push_back(Ops[2]);
>> -    TblOps.push_back(Ops[3]);
>> -    Value *TblRes = packTBLDVectorList(CGF, TblOps, nullptr, Ops[4], Ty,
>> -                                       Intrinsic::aarch64_neon_tbl2,
>> "vtbl2");
>> +    Value *TblRes =
>> +        packTBLDVectorList(CGF, makeArrayRef(Ops).slice(1, 3), nullptr,
>> Ops[4],
>> +                           Ty, Intrinsic::aarch64_neon_tbl2, "vtbl2");
>>
>> -    llvm::Constant *TwentyFour = ConstantInt::get(VTy->getElementType(),
>> 24);
>> -    Value* TwentyFourV = llvm::ConstantVector::getSplat(nElts,
>> TwentyFour);
>> +    llvm::Constant *TwentyFourV = ConstantInt::get(Ty, 24);
>>      Value *CmpRes = Builder.CreateICmp(ICmpInst::ICMP_UGE, Ops[4],
>>                                             TwentyFourV);
>>      CmpRes = Builder.CreateSExt(CmpRes, Ty);
>> @@ -4106,12 +4083,9 @@ static Value *EmitAArch64TblBuiltinExpr(
>>      return Builder.CreateOr(EltsFromInput, EltsFromTbl, "vtbx");
>>    }
>>    case NEON::BI__builtin_neon_vtbx4_v: {
>> -    TblOps.push_back(Ops[1]);
>> -    TblOps.push_back(Ops[2]);
>> -    TblOps.push_back(Ops[3]);
>> -    TblOps.push_back(Ops[4]);
>> -    return packTBLDVectorList(CGF, TblOps, Ops[0], Ops[5], Ty,
>> -                              Intrinsic::aarch64_neon_tbx2, "vtbx2");
>> +    return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(1, 4), Ops[0],
>> +                              Ops[5], Ty, Intrinsic::aarch64_neon_tbx2,
>> +                              "vtbx2");
>>    }
>>    case NEON::BI__builtin_neon_vqtbl1_v:
>>    case NEON::BI__builtin_neon_vqtbl1q_v:
>> @@ -4236,9 +4210,9 @@ Value *CodeGenFunction::EmitAArch64Built
>>    if (BuiltinID == AArch64::BI__clear_cache) {
>>      assert(E->getNumArgs() == 2 && "__clear_cache takes 2 arguments");
>>      const FunctionDecl *FD = E->getDirectCallee();
>> -    SmallVector<Value*, 2> Ops;
>> +    Value *Ops[2];
>>      for (unsigned i = 0; i < 2; i++)
>> -      Ops.push_back(EmitScalarExpr(E->getArg(i)));
>> +      Ops[i] = EmitScalarExpr(E->getArg(i));
>>      llvm::Type *Ty = CGM.getTypes().ConvertType(FD->getType());
>>      llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty);
>>      StringRef Name = FD->getName();
>> @@ -4496,8 +4470,7 @@ Value *CodeGenFunction::EmitAArch64Built
>>      return Builder.CreateSIToFP(Ops[0], FTy);
>>    }
>>    case NEON::BI__builtin_neon_vpaddd_s64: {
>> -    llvm::Type *Ty =
>> -      llvm::VectorType::get(llvm::Type::getInt64Ty(getLLVMContext()), 2);
>> +    llvm::Type *Ty = llvm::VectorType::get(Int64Ty, 2);
>>      Value *Vec = EmitScalarExpr(E->getArg(0));
>>      // The vector is v2f64, so make sure it's bitcast to that.
>>      Vec = Builder.CreateBitCast(Vec, Ty, "v2i64");
>> @@ -4571,12 +4544,11 @@ Value *CodeGenFunction::EmitAArch64Built
>>          ICmpInst::FCMP_OLT, ICmpInst::ICMP_SLT, "vcltz");
>>
>>    case NEON::BI__builtin_neon_vceqzd_u64: {
>> -    llvm::Type *Ty = llvm::Type::getInt64Ty(getLLVMContext());
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>> -    Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
>> -    Ops[0] = Builder.CreateICmp(llvm::ICmpInst::ICMP_EQ, Ops[0],
>> -                                llvm::Constant::getNullValue(Ty));
>> -    return Builder.CreateSExt(Ops[0], Ty, "vceqzd");
>> +    Ops[0] = Builder.CreateBitCast(Ops[0], Int64Ty);
>> +    Ops[0] =
>> +        Builder.CreateICmpEQ(Ops[0],
>> llvm::Constant::getNullValue(Int64Ty));
>> +    return Builder.CreateSExt(Ops[0], Int64Ty, "vceqzd");
>>    }
>>    case NEON::BI__builtin_neon_vceqd_f64:
>>    case NEON::BI__builtin_neon_vcled_f64:
>> @@ -4650,14 +4622,13 @@ Value *CodeGenFunction::EmitAArch64Built
>>    }
>>    case NEON::BI__builtin_neon_vtstd_s64:
>>    case NEON::BI__builtin_neon_vtstd_u64: {
>> -    llvm::Type *Ty = llvm::Type::getInt64Ty(getLLVMContext());
>>      Ops.push_back(EmitScalarExpr(E->getArg(1)));
>> -    Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
>> -    Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
>> +    Ops[0] = Builder.CreateBitCast(Ops[0], Int64Ty);
>> +    Ops[1] = Builder.CreateBitCast(Ops[1], Int64Ty);
>>      Ops[0] = Builder.CreateAnd(Ops[0], Ops[1]);
>>      Ops[0] = Builder.CreateICmp(ICmpInst::ICMP_NE, Ops[0],
>> -                                llvm::Constant::getNullValue(Ty));
>> -    return Builder.CreateSExt(Ops[0], Ty, "vtstd");
>> +                                llvm::Constant::getNullValue(Int64Ty));
>> +    return Builder.CreateSExt(Ops[0], Int64Ty, "vtstd");
>>    }
>>    case NEON::BI__builtin_neon_vset_lane_i8:
>>    case NEON::BI__builtin_neon_vset_lane_i16:
>> @@ -4686,33 +4657,27 @@ Value *CodeGenFunction::EmitAArch64Built
>>
>>    case NEON::BI__builtin_neon_vget_lane_i8:
>>    case NEON::BI__builtin_neon_vdupb_lane_i8:
>> -    Ops[0] = Builder.CreateBitCast(Ops[0],
>> -        llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(),
>> 8), 8));
>> +    Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int8Ty,
>> 8));
>>      return Builder.CreateExtractElement(Ops[0],
>> EmitScalarExpr(E->getArg(1)),
>>                                          "vget_lane");
>>    case NEON::BI__builtin_neon_vgetq_lane_i8:
>>    case NEON::BI__builtin_neon_vdupb_laneq_i8:
>> -    Ops[0] = Builder.CreateBitCast(Ops[0],
>> -        llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(),
>> 8), 16));
>> +    Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int8Ty,
>> 16));
>>      return Builder.CreateExtractElement(Ops[0],
>> EmitScalarExpr(E->getArg(1)),
>>                                          "vgetq_lane");
>>    case NEON::BI__builtin_neon_vget_lane_i16:
>>    case NEON::BI__builtin_neon_vduph_lane_i16:
>> -    Ops[0] = Builder.CreateBitCast(Ops[0],
>> -        llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(),
>> 16), 4));
>> +    Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int16Ty,
>> 4));
>>      return Builder.CreateExtractElement(Ops[0],
>> EmitScalarExpr(E->getArg(1)),
>>                                          "vget_lane");
>>    case NEON::BI__builtin_neon_vgetq_lane_i16:
>>    case NEON::BI__builtin_neon_vduph_laneq_i16:
>> -    Ops[0] = Builder.CreateBitCast(Ops[0],
>> -        llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(),
>> 16), 8));
>> +    Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int16Ty,
>> 8));
>>      return Builder.CreateExtractElement(Ops[0],
>> EmitScalarExpr(E->getArg(1)),
>>                                          "vgetq_lane");
>>    case NEON::BI__builtin_neon_vget_lane_i32:
>>    case NEON::BI__builtin_neon_vdups_lane_i32:
>> -    Ops[0] = Builder.CreateBitCast(
>> -        Ops[0],
>> -        llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(),
>> 32), 2));
>> +    Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int32Ty,
>> 2));
>>      return Builder.CreateExtractElement(Ops[0],
>> EmitScalarExpr(E->getArg(1)),
>>                                          "vget_lane");
>>    case NEON::BI__builtin_neon_vdups_lane_f32:
>> @@ -4722,14 +4687,12 @@ Value *CodeGenFunction::EmitAArch64Built
>>                                          "vdups_lane");
>>    case NEON::BI__builtin_neon_vgetq_lane_i32:
>>    case NEON::BI__builtin_neon_vdups_laneq_i32:
>> -    Ops[0] = Builder.CreateBitCast(Ops[0],
>> -        llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(),
>> 32), 4));
>> +    Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int32Ty,
>> 4));
>>      return Builder.CreateExtractElement(Ops[0],
>> EmitScalarExpr(E->getArg(1)),
>>                                          "vgetq_lane");
>>    case NEON::BI__builtin_neon_vget_lane_i64:
>>    case NEON::BI__builtin_neon_vdupd_lane_i64:
>> -    Ops[0] = Builder.CreateBitCast(Ops[0],
>> -        llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(),
>> 64), 1));
>> +    Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int64Ty,
>> 1));
>>      return Builder.CreateExtractElement(Ops[0],
>> EmitScalarExpr(E->getArg(1)),
>>                                          "vget_lane");
>>    case NEON::BI__builtin_neon_vdupd_lane_f64:
>> @@ -4739,8 +4702,7 @@ Value *CodeGenFunction::EmitAArch64Built
>>                                          "vdupd_lane");
>>    case NEON::BI__builtin_neon_vgetq_lane_i64:
>>    case NEON::BI__builtin_neon_vdupd_laneq_i64:
>> -    Ops[0] = Builder.CreateBitCast(Ops[0],
>> -        llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(),
>> 64), 2));
>> +    Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int64Ty,
>> 2));
>>      return Builder.CreateExtractElement(Ops[0],
>> EmitScalarExpr(E->getArg(1)),
>>                                          "vgetq_lane");
>>    case NEON::BI__builtin_neon_vget_lane_f32:
>> @@ -5343,232 +5305,192 @@ Value *CodeGenFunction::EmitAArch64Built
>>      // FALLTHROUGH
>>    case NEON::BI__builtin_neon_vaddv_s8: {
>>      Int = usgn ? Intrinsic::aarch64_neon_uaddv :
>> Intrinsic::aarch64_neon_saddv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8),
>> 8);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int8Ty, 8);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 8));
>> +    return Builder.CreateTrunc(Ops[0], Int8Ty);
>>    }
>>    case NEON::BI__builtin_neon_vaddv_u16:
>>      usgn = true;
>>      // FALLTHROUGH
>>    case NEON::BI__builtin_neon_vaddv_s16: {
>>      Int = usgn ? Intrinsic::aarch64_neon_uaddv :
>> Intrinsic::aarch64_neon_saddv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16),
>> 4);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int16Ty, 4);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 16));
>> +    return Builder.CreateTrunc(Ops[0], Int16Ty);
>>    }
>>    case NEON::BI__builtin_neon_vaddvq_u8:
>>      usgn = true;
>>      // FALLTHROUGH
>>    case NEON::BI__builtin_neon_vaddvq_s8: {
>>      Int = usgn ? Intrinsic::aarch64_neon_uaddv :
>> Intrinsic::aarch64_neon_saddv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8),
>> 16);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int8Ty, 16);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 8));
>> +    return Builder.CreateTrunc(Ops[0], Int8Ty);
>>    }
>>    case NEON::BI__builtin_neon_vaddvq_u16:
>>      usgn = true;
>>      // FALLTHROUGH
>>    case NEON::BI__builtin_neon_vaddvq_s16: {
>>      Int = usgn ? Intrinsic::aarch64_neon_uaddv :
>> Intrinsic::aarch64_neon_saddv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16),
>> 8);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int16Ty, 8);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 16));
>> +    return Builder.CreateTrunc(Ops[0], Int16Ty);
>>    }
>>    case NEON::BI__builtin_neon_vmaxv_u8: {
>>      Int = Intrinsic::aarch64_neon_umaxv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8),
>> 8);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int8Ty, 8);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 8));
>> +    return Builder.CreateTrunc(Ops[0], Int8Ty);
>>    }
>>    case NEON::BI__builtin_neon_vmaxv_u16: {
>>      Int = Intrinsic::aarch64_neon_umaxv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16),
>> 4);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int16Ty, 4);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 16));
>> +    return Builder.CreateTrunc(Ops[0], Int16Ty);
>>    }
>>    case NEON::BI__builtin_neon_vmaxvq_u8: {
>>      Int = Intrinsic::aarch64_neon_umaxv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8),
>> 16);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int8Ty, 16);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 8));
>> +    return Builder.CreateTrunc(Ops[0], Int8Ty);
>>    }
>>    case NEON::BI__builtin_neon_vmaxvq_u16: {
>>      Int = Intrinsic::aarch64_neon_umaxv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16),
>> 8);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int16Ty, 8);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 16));
>> +    return Builder.CreateTrunc(Ops[0], Int16Ty);
>>    }
>>    case NEON::BI__builtin_neon_vmaxv_s8: {
>>      Int = Intrinsic::aarch64_neon_smaxv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8),
>> 8);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int8Ty, 8);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 8));
>> +    return Builder.CreateTrunc(Ops[0], Int8Ty);
>>    }
>>    case NEON::BI__builtin_neon_vmaxv_s16: {
>>      Int = Intrinsic::aarch64_neon_smaxv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16),
>> 4);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int16Ty, 4);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 16));
>> +    return Builder.CreateTrunc(Ops[0], Int16Ty);
>>    }
>>    case NEON::BI__builtin_neon_vmaxvq_s8: {
>>      Int = Intrinsic::aarch64_neon_smaxv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8),
>> 16);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int8Ty, 16);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 8));
>> +    return Builder.CreateTrunc(Ops[0], Int8Ty);
>>    }
>>    case NEON::BI__builtin_neon_vmaxvq_s16: {
>>      Int = Intrinsic::aarch64_neon_smaxv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16),
>> 8);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int16Ty, 8);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 16));
>> +    return Builder.CreateTrunc(Ops[0], Int16Ty);
>>    }
>>    case NEON::BI__builtin_neon_vminv_u8: {
>>      Int = Intrinsic::aarch64_neon_uminv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8),
>> 8);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int8Ty, 8);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 8));
>> +    return Builder.CreateTrunc(Ops[0], Int8Ty);
>>    }
>>    case NEON::BI__builtin_neon_vminv_u16: {
>>      Int = Intrinsic::aarch64_neon_uminv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16),
>> 4);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int16Ty, 4);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 16));
>> +    return Builder.CreateTrunc(Ops[0], Int16Ty);
>>    }
>>    case NEON::BI__builtin_neon_vminvq_u8: {
>>      Int = Intrinsic::aarch64_neon_uminv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8),
>> 16);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int8Ty, 16);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 8));
>> +    return Builder.CreateTrunc(Ops[0], Int8Ty);
>>    }
>>    case NEON::BI__builtin_neon_vminvq_u16: {
>>      Int = Intrinsic::aarch64_neon_uminv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16),
>> 8);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int16Ty, 8);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 16));
>> +    return Builder.CreateTrunc(Ops[0], Int16Ty);
>>    }
>>    case NEON::BI__builtin_neon_vminv_s8: {
>>      Int = Intrinsic::aarch64_neon_sminv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8),
>> 8);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int8Ty, 8);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 8));
>> +    return Builder.CreateTrunc(Ops[0], Int8Ty);
>>    }
>>    case NEON::BI__builtin_neon_vminv_s16: {
>>      Int = Intrinsic::aarch64_neon_sminv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16),
>> 4);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int16Ty, 4);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 16));
>> +    return Builder.CreateTrunc(Ops[0], Int16Ty);
>>    }
>>    case NEON::BI__builtin_neon_vminvq_s8: {
>>      Int = Intrinsic::aarch64_neon_sminv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8),
>> 16);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int8Ty, 16);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 8));
>> +    return Builder.CreateTrunc(Ops[0], Int8Ty);
>>    }
>>    case NEON::BI__builtin_neon_vminvq_s16: {
>>      Int = Intrinsic::aarch64_neon_sminv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16),
>> 8);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int16Ty, 8);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 16));
>> +    return Builder.CreateTrunc(Ops[0], Int16Ty);
>>    }
>>    case NEON::BI__builtin_neon_vmul_n_f64: {
>>      Ops[0] = Builder.CreateBitCast(Ops[0], DoubleTy);
>> @@ -5577,80 +5499,68 @@ Value *CodeGenFunction::EmitAArch64Built
>>    }
>>    case NEON::BI__builtin_neon_vaddlv_u8: {
>>      Int = Intrinsic::aarch64_neon_uaddlv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8),
>> 8);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int8Ty, 8);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 16));
>> +    return Builder.CreateTrunc(Ops[0], Int16Ty);
>>    }
>>    case NEON::BI__builtin_neon_vaddlv_u16: {
>>      Int = Intrinsic::aarch64_neon_uaddlv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16),
>> 4);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int16Ty, 4);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
>>    }
>>    case NEON::BI__builtin_neon_vaddlvq_u8: {
>>      Int = Intrinsic::aarch64_neon_uaddlv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8),
>> 16);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int8Ty, 16);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 16));
>> +    return Builder.CreateTrunc(Ops[0], Int16Ty);
>>    }
>>    case NEON::BI__builtin_neon_vaddlvq_u16: {
>>      Int = Intrinsic::aarch64_neon_uaddlv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16),
>> 8);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int16Ty, 8);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
>>    }
>>    case NEON::BI__builtin_neon_vaddlv_s8: {
>>      Int = Intrinsic::aarch64_neon_saddlv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8),
>> 8);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int8Ty, 8);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 16));
>> +    return Builder.CreateTrunc(Ops[0], Int16Ty);
>>    }
>>    case NEON::BI__builtin_neon_vaddlv_s16: {
>>      Int = Intrinsic::aarch64_neon_saddlv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16),
>> 4);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int16Ty, 4);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
>>    }
>>    case NEON::BI__builtin_neon_vaddlvq_s8: {
>>      Int = Intrinsic::aarch64_neon_saddlv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8),
>> 16);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int8Ty, 16);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
>> -    return Builder.CreateTrunc(Ops[0],
>> -             llvm::IntegerType::get(getLLVMContext(), 16));
>> +    return Builder.CreateTrunc(Ops[0], Int16Ty);
>>    }
>>    case NEON::BI__builtin_neon_vaddlvq_s16: {
>>      Int = Intrinsic::aarch64_neon_saddlv;
>> -    Ty = llvm::IntegerType::get(getLLVMContext(), 32);
>> -    VTy =
>> -      llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16),
>> 8);
>> +    Ty = Int32Ty;
>> +    VTy = llvm::VectorType::get(Int16Ty, 8);
>>      llvm::Type *Tys[2] = { Ty, VTy };
>>      Ops.push_back(EmitScalarExpr(E->getArg(0)));
>>      return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");
>> @@ -5738,9 +5648,8 @@ Value *CodeGenFunction::EmitAArch64Built
>>        Int = Intrinsic::aarch64_neon_st1x4;
>>        break;
>>      }
>> -    SmallVector<Value *, 4> IntOps(Ops.begin()+1, Ops.end());
>> -    IntOps.push_back(Ops[0]);
>> -    return EmitNeonCall(CGM.getIntrinsic(Int, Tys), IntOps, "");
>> +    std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end());
>> +    return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "");
>>    }
>>    case NEON::BI__builtin_neon_vld1_v:
>>    case NEON::BI__builtin_neon_vld1q_v:
>> @@ -5851,8 +5760,7 @@ Value *CodeGenFunction::EmitAArch64Built
>>      Ops.erase(Ops.begin()+1);
>>      Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
>>      Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
>> -    Ops[3] = Builder.CreateZExt(Ops[3],
>> -                llvm::IntegerType::get(getLLVMContext(), 64));
>> +    Ops[3] = Builder.CreateZExt(Ops[3], Int64Ty);
>>      Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1),
>> "vld2_lane");
>>      Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
>>      Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
>> @@ -5867,8 +5775,7 @@ Value *CodeGenFunction::EmitAArch64Built
>>      Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
>>      Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
>>      Ops[3] = Builder.CreateBitCast(Ops[3], Ty);
>> -    Ops[4] = Builder.CreateZExt(Ops[4],
>> -                llvm::IntegerType::get(getLLVMContext(), 64));
>> +    Ops[4] = Builder.CreateZExt(Ops[4], Int64Ty);
>>      Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1),
>> "vld3_lane");
>>      Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
>>      Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
>> @@ -5884,8 +5791,7 @@ Value *CodeGenFunction::EmitAArch64Built
>>      Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
>>      Ops[3] = Builder.CreateBitCast(Ops[3], Ty);
>>      Ops[4] = Builder.CreateBitCast(Ops[4], Ty);
>> -    Ops[5] = Builder.CreateZExt(Ops[5],
>> -                llvm::IntegerType::get(getLLVMContext(), 64));
>> +    Ops[5] = Builder.CreateZExt(Ops[5], Int64Ty);
>>      Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1),
>> "vld4_lane");
>>      Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
>>      Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
>> @@ -5903,8 +5809,7 @@ Value *CodeGenFunction::EmitAArch64Built
>>    case NEON::BI__builtin_neon_vst2q_lane_v: {
>>      Ops.push_back(Ops[0]);
>>      Ops.erase(Ops.begin());
>> -    Ops[2] = Builder.CreateZExt(Ops[2],
>> -                llvm::IntegerType::get(getLLVMContext(), 64));
>> +    Ops[2] = Builder.CreateZExt(Ops[2], Int64Ty);
>>      llvm::Type *Tys[2] = { VTy, Ops[3]->getType() };
>>      return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st2lane,
>> Tys),
>>                          Ops, "");
>> @@ -5921,8 +5826,7 @@ Value *CodeGenFunction::EmitAArch64Built
>>    case NEON::BI__builtin_neon_vst3q_lane_v: {
>>      Ops.push_back(Ops[0]);
>>      Ops.erase(Ops.begin());
>> -    Ops[3] = Builder.CreateZExt(Ops[3],
>> -                llvm::IntegerType::get(getLLVMContext(), 64));
>> +    Ops[3] = Builder.CreateZExt(Ops[3], Int64Ty);
>>      llvm::Type *Tys[2] = { VTy, Ops[4]->getType() };
>>      return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st3lane,
>> Tys),
>>                          Ops, "");
>> @@ -5939,8 +5843,7 @@ Value *CodeGenFunction::EmitAArch64Built
>>    case NEON::BI__builtin_neon_vst4q_lane_v: {
>>      Ops.push_back(Ops[0]);
>>      Ops.erase(Ops.begin());
>> -    Ops[4] = Builder.CreateZExt(Ops[4],
>> -                llvm::IntegerType::get(getLLVMContext(), 64));
>> +    Ops[4] = Builder.CreateZExt(Ops[4], Int64Ty);
>>      llvm::Type *Tys[2] = { VTy, Ops[5]->getType() };
>>      return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st4lane,
>> Tys),
>>                          Ops, "");
>> @@ -6247,18 +6150,19 @@ Value *CodeGenFunction::EmitX86BuiltinEx
>>        Ops[0] = llvm::Constant::getNullValue(Ops[0]->getType());
>>      }
>>
>> -    SmallVector<llvm::Constant*, 32> Indices;
>> +    uint32_t Indices[32];
>>      // 256-bit palignr operates on 128-bit lanes so we need to handle
>> that
>>      for (unsigned l = 0; l != NumElts; l += NumLaneElts) {
>>        for (unsigned i = 0; i != NumLaneElts; ++i) {
>>          unsigned Idx = ShiftVal + i;
>>          if (Idx >= NumLaneElts)
>>            Idx += NumElts - NumLaneElts; // End of lane, switch operand.
>> -        Indices.push_back(llvm::ConstantInt::get(Int32Ty, Idx + l));
>> +        Indices[l + i] = Idx + l;
>>        }
>>      }
>>
>> -    Value* SV = llvm::ConstantVector::get(Indices);
>> +    Value *SV = llvm::ConstantDataVector::get(getLLVMContext(),
>> +                                              makeArrayRef(Indices,
>> NumElts));
>>      return Builder.CreateShuffleVector(Ops[1], Ops[0], SV, "palignr");
>>    }
>>    case X86::BI__builtin_ia32_pslldqi256: {
>> @@ -6269,13 +6173,13 @@ Value *CodeGenFunction::EmitX86BuiltinEx
>>      if (shiftVal >= 16)
>>        return llvm::Constant::getNullValue(ConvertType(E->getType()));
>>
>> -    SmallVector<llvm::Constant*, 32> Indices;
>> +    uint32_t Indices[32];
>>      // 256-bit pslldq operates on 128-bit lanes so we need to handle that
>>      for (unsigned l = 0; l != 32; l += 16) {
>>        for (unsigned i = 0; i != 16; ++i) {
>>          unsigned Idx = 32 + i - shiftVal;
>>          if (Idx < 32) Idx -= 16; // end of lane, switch operand.
>> -        Indices.push_back(llvm::ConstantInt::get(Int32Ty, Idx + l));
>> +        Indices[l + i] = Idx + l;
>>        }
>>      }
>>
>> @@ -6283,7 +6187,7 @@ Value *CodeGenFunction::EmitX86BuiltinEx
>>      Ops[0] = Builder.CreateBitCast(Ops[0], VecTy, "cast");
>>      Value *Zero = llvm::Constant::getNullValue(VecTy);
>>
>> -    Value *SV = llvm::ConstantVector::get(Indices);
>> +    Value *SV = llvm::ConstantDataVector::get(getLLVMContext(), Indices);
>>      SV = Builder.CreateShuffleVector(Zero, Ops[0], SV, "pslldq");
>>      llvm::Type *ResultType = ConvertType(E->getType());
>>      return Builder.CreateBitCast(SV, ResultType, "cast");
>> @@ -6296,13 +6200,13 @@ Value *CodeGenFunction::EmitX86BuiltinEx
>>      if (shiftVal >= 16)
>>        return llvm::Constant::getNullValue(ConvertType(E->getType()));
>>
>> -    SmallVector<llvm::Constant*, 32> Indices;
>> +    uint32_t Indices[32];
>>      // 256-bit psrldq operates on 128-bit lanes so we need to handle that
>>      for (unsigned l = 0; l != 32; l += 16) {
>>        for (unsigned i = 0; i != 16; ++i) {
>>          unsigned Idx = i + shiftVal;
>>          if (Idx >= 16) Idx += 16; // end of lane, switch operand.
>> -        Indices.push_back(llvm::ConstantInt::get(Int32Ty, Idx + l));
>> +        Indices[l + i] = Idx + l;
>>        }
>>      }
>>
>> @@ -6310,7 +6214,7 @@ Value *CodeGenFunction::EmitX86BuiltinEx
>>      Ops[0] = Builder.CreateBitCast(Ops[0], VecTy, "cast");
>>      Value *Zero = llvm::Constant::getNullValue(VecTy);
>>
>> -    Value *SV = llvm::ConstantVector::get(Indices);
>> +    Value *SV = llvm::ConstantDataVector::get(getLLVMContext(), Indices);
>>      SV = Builder.CreateShuffleVector(Ops[0], Zero, SV, "psrldq");
>>      llvm::Type *ResultType = ConvertType(E->getType());
>>      return Builder.CreateBitCast(SV, ResultType, "cast");
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>



More information about the cfe-commits mailing list