diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2012-08-23 03:10:17 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2012-08-23 03:10:17 +0000 |
commit | ea93e40785ffeadfac66b948c95f9490ec26207a (patch) | |
tree | 6a362e4eb0dc758c46b2c6a2b14d261000b41500 /lib/CodeGen/CGBuiltin.cpp | |
parent | 2d5a1de741c94f15461b06cd09a65081c7ce3d70 (diff) |
Use the alignment from lvalue emission to more accurately compute the alignment
of a pointer for builtin emission, instead of just depending on the type of the
pointee. <rdar://problem/11314941>.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@162425 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGBuiltin.cpp')
-rw-r--r-- | lib/CodeGen/CGBuiltin.cpp | 230 |
1 files changed, 144 insertions, 86 deletions
diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp index 59ed313616..4ea2908c54 100644 --- a/lib/CodeGen/CGBuiltin.cpp +++ b/lib/CodeGen/CGBuiltin.cpp @@ -573,38 +573,41 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, } case Builtin::BIbzero: case Builtin::BI__builtin_bzero: { - Value *Address = EmitScalarExpr(E->getArg(0)); + std::pair<llvm::Value*, unsigned> Dest = + EmitPointerWithAlignment(E->getArg(0)); Value *SizeVal = EmitScalarExpr(E->getArg(1)); - unsigned Align = GetPointeeAlignment(E->getArg(0)); - Builder.CreateMemSet(Address, Builder.getInt8(0), SizeVal, Align, false); - return RValue::get(Address); + Builder.CreateMemSet(Dest.first, Builder.getInt8(0), SizeVal, + Dest.second, false); + return RValue::get(Dest.first); } case Builtin::BImemcpy: case Builtin::BI__builtin_memcpy: { - Value *Address = EmitScalarExpr(E->getArg(0)); - Value *SrcAddr = EmitScalarExpr(E->getArg(1)); + std::pair<llvm::Value*, unsigned> Dest = + EmitPointerWithAlignment(E->getArg(0)); + std::pair<llvm::Value*, unsigned> Src = + EmitPointerWithAlignment(E->getArg(1)); Value *SizeVal = EmitScalarExpr(E->getArg(2)); - unsigned Align = std::min(GetPointeeAlignment(E->getArg(0)), - GetPointeeAlignment(E->getArg(1))); - Builder.CreateMemCpy(Address, SrcAddr, SizeVal, Align, false); - return RValue::get(Address); + unsigned Align = std::min(Dest.second, Src.second); + Builder.CreateMemCpy(Dest.first, Src.first, SizeVal, Align, false); + return RValue::get(Dest.first); } case Builtin::BI__builtin___memcpy_chk: { - // fold __builtin_memcpy_chk(x, y, cst1, cst2) to memset iff cst1<=cst2. + // fold __builtin_memcpy_chk(x, y, cst1, cst2) to memcpy iff cst1<=cst2. llvm::APSInt Size, DstSize; if (!E->getArg(2)->EvaluateAsInt(Size, CGM.getContext()) || !E->getArg(3)->EvaluateAsInt(DstSize, CGM.getContext())) break; if (Size.ugt(DstSize)) break; - Value *Dest = EmitScalarExpr(E->getArg(0)); - Value *Src = EmitScalarExpr(E->getArg(1)); + std::pair<llvm::Value*, unsigned> Dest = + EmitPointerWithAlignment(E->getArg(0)); + std::pair<llvm::Value*, unsigned> Src = + EmitPointerWithAlignment(E->getArg(1)); Value *SizeVal = llvm::ConstantInt::get(Builder.getContext(), Size); - unsigned Align = std::min(GetPointeeAlignment(E->getArg(0)), - GetPointeeAlignment(E->getArg(1))); - Builder.CreateMemCpy(Dest, Src, SizeVal, Align, false); - return RValue::get(Dest); + unsigned Align = std::min(Dest.second, Src.second); + Builder.CreateMemCpy(Dest.first, Src.first, SizeVal, Align, false); + return RValue::get(Dest.first); } case Builtin::BI__builtin_objc_memmove_collectable: { @@ -617,41 +620,43 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, } case Builtin::BI__builtin___memmove_chk: { - // fold __builtin_memmove_chk(x, y, cst1, cst2) to memset iff cst1<=cst2. + // fold __builtin_memmove_chk(x, y, cst1, cst2) to memmove iff cst1<=cst2. llvm::APSInt Size, DstSize; if (!E->getArg(2)->EvaluateAsInt(Size, CGM.getContext()) || !E->getArg(3)->EvaluateAsInt(DstSize, CGM.getContext())) break; if (Size.ugt(DstSize)) break; - Value *Dest = EmitScalarExpr(E->getArg(0)); - Value *Src = EmitScalarExpr(E->getArg(1)); + std::pair<llvm::Value*, unsigned> Dest = + EmitPointerWithAlignment(E->getArg(0)); + std::pair<llvm::Value*, unsigned> Src = + EmitPointerWithAlignment(E->getArg(1)); Value *SizeVal = llvm::ConstantInt::get(Builder.getContext(), Size); - unsigned Align = std::min(GetPointeeAlignment(E->getArg(0)), - GetPointeeAlignment(E->getArg(1))); - Builder.CreateMemMove(Dest, Src, SizeVal, Align, false); - return RValue::get(Dest); + unsigned Align = std::min(Dest.second, Src.second); + Builder.CreateMemMove(Dest.first, Src.first, SizeVal, Align, false); + return RValue::get(Dest.first); } case Builtin::BImemmove: case Builtin::BI__builtin_memmove: { - Value *Address = EmitScalarExpr(E->getArg(0)); - Value *SrcAddr = EmitScalarExpr(E->getArg(1)); + std::pair<llvm::Value*, unsigned> Dest = + EmitPointerWithAlignment(E->getArg(0)); + std::pair<llvm::Value*, unsigned> Src = + EmitPointerWithAlignment(E->getArg(1)); Value *SizeVal = EmitScalarExpr(E->getArg(2)); - unsigned Align = std::min(GetPointeeAlignment(E->getArg(0)), - GetPointeeAlignment(E->getArg(1))); - Builder.CreateMemMove(Address, SrcAddr, SizeVal, Align, false); - return RValue::get(Address); + unsigned Align = std::min(Dest.second, Src.second); + Builder.CreateMemMove(Dest.first, Src.first, SizeVal, Align, false); + return RValue::get(Dest.first); } case Builtin::BImemset: case Builtin::BI__builtin_memset: { - Value *Address = EmitScalarExpr(E->getArg(0)); + std::pair<llvm::Value*, unsigned> Dest = + EmitPointerWithAlignment(E->getArg(0)); Value *ByteVal = Builder.CreateTrunc(EmitScalarExpr(E->getArg(1)), Builder.getInt8Ty()); Value *SizeVal = EmitScalarExpr(E->getArg(2)); - unsigned Align = GetPointeeAlignment(E->getArg(0)); - Builder.CreateMemSet(Address, ByteVal, SizeVal, Align, false); - return RValue::get(Address); + Builder.CreateMemSet(Dest.first, ByteVal, SizeVal, Dest.second, false); + return RValue::get(Dest.first); } case Builtin::BI__builtin___memset_chk: { // fold __builtin_memset_chk(x, y, cst1, cst2) to memset iff cst1<=cst2. @@ -661,14 +666,13 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, break; if (Size.ugt(DstSize)) break; - Value *Address = EmitScalarExpr(E->getArg(0)); + std::pair<llvm::Value*, unsigned> Dest = + EmitPointerWithAlignment(E->getArg(0)); Value *ByteVal = Builder.CreateTrunc(EmitScalarExpr(E->getArg(1)), Builder.getInt8Ty()); Value *SizeVal = llvm::ConstantInt::get(Builder.getContext(), Size); - unsigned Align = GetPointeeAlignment(E->getArg(0)); - Builder.CreateMemSet(Address, ByteVal, SizeVal, Align, false); - - return RValue::get(Address); + Builder.CreateMemSet(Dest.first, ByteVal, SizeVal, Dest.second, false); + return RValue::get(Dest.first); } case Builtin::BI__builtin_dwarf_cfa: { // The offset in bytes from the first argument to the CFA. @@ -1469,34 +1473,35 @@ Value *CodeGenFunction::EmitNeonShiftVector(Value *V, llvm::Type *Ty, /// GetPointeeAlignment - Given an expression with a pointer type, find the /// alignment of the type referenced by the pointer. Skip over implicit /// casts. -unsigned CodeGenFunction::GetPointeeAlignment(const Expr *Addr) { - unsigned Align = 1; - // Check if the type is a pointer. The implicit cast operand might not be. - while (Addr->getType()->isPointerType()) { - QualType PtTy = Addr->getType()->getPointeeType(); - - // Can't get alignment of incomplete types. - if (!PtTy->isIncompleteType()) { - unsigned NewA = getContext().getTypeAlignInChars(PtTy).getQuantity(); - if (NewA > Align) - Align = NewA; +std::pair<llvm::Value*, unsigned> +CodeGenFunction::EmitPointerWithAlignment(const Expr *Addr) { + assert(Addr->getType()->isPointerType()); + Addr = Addr->IgnoreParens(); + if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Addr)) { + if (ICE->getCastKind() == CK_BitCast || ICE->getCastKind() == CK_NoOp) { + std::pair<llvm::Value*, unsigned> Ptr = + EmitPointerWithAlignment(ICE->getSubExpr()); + Ptr.first = Builder.CreateBitCast(Ptr.first, + ConvertType(Addr->getType())); + return Ptr; + } else if (ICE->getCastKind() == CK_ArrayToPointerDecay) { + LValue LV = EmitLValue(ICE->getSubExpr()); + return std::make_pair(LV.getAddress(), LV.getAlignment().getQuantity()); } - - // If the address is an implicit cast, repeat with the cast operand. - if (const ImplicitCastExpr *CastAddr = dyn_cast<ImplicitCastExpr>(Addr)) { - Addr = CastAddr->getSubExpr(); - continue; + } + if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(Addr)) { + if (UO->getOpcode() == UO_AddrOf) { + LValue LV = EmitLValue(UO->getSubExpr()); + return std::make_pair(LV.getAddress(), LV.getAlignment().getQuantity()); } - break; } - return Align; -} -/// GetPointeeAlignmentValue - Given an expression with a pointer type, find -/// the alignment of the type referenced by the pointer. Skip over implicit -/// casts. Return the alignment as an llvm::Value. -Value *CodeGenFunction::GetPointeeAlignmentValue(const Expr *Addr) { - return llvm::ConstantInt::get(Int32Ty, GetPointeeAlignment(Addr)); + unsigned Align = 1; + QualType PtTy = Addr->getType()->getPointeeType(); + if (!PtTy->isIncompleteType()) + Align = getContext().getTypeAlignInChars(PtTy).getQuantity(); + + return std::make_pair(EmitScalarExpr(Addr), Align); } Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, @@ -1549,8 +1554,69 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, } SmallVector<Value*, 4> Ops; - for (unsigned i = 0, e = E->getNumArgs() - 1; i != e; i++) + llvm::Value *Align = 0; + for (unsigned i = 0, e = E->getNumArgs() - 1; i != e; i++) { + if (i == 0) { + switch (BuiltinID) { + case ARM::BI__builtin_neon_vld1_v: + case ARM::BI__builtin_neon_vld1q_v: + case ARM::BI__builtin_neon_vld1q_lane_v: + case ARM::BI__builtin_neon_vld1_lane_v: + case ARM::BI__builtin_neon_vld1_dup_v: + case ARM::BI__builtin_neon_vld1q_dup_v: + case ARM::BI__builtin_neon_vst1_v: + case ARM::BI__builtin_neon_vst1q_v: + case ARM::BI__builtin_neon_vst1q_lane_v: + case ARM::BI__builtin_neon_vst1_lane_v: + case ARM::BI__builtin_neon_vst2_v: + case ARM::BI__builtin_neon_vst2q_v: + case ARM::BI__builtin_neon_vst2_lane_v: + case ARM::BI__builtin_neon_vst2q_lane_v: + case ARM::BI__builtin_neon_vst3_v: + case ARM::BI__builtin_neon_vst3q_v: + case ARM::BI__builtin_neon_vst3_lane_v: + case ARM::BI__builtin_neon_vst3q_lane_v: + case ARM::BI__builtin_neon_vst4_v: + case ARM::BI__builtin_neon_vst4q_v: + case ARM::BI__builtin_neon_vst4_lane_v: + case ARM::BI__builtin_neon_vst4q_lane_v: + // Get the alignment for the argument in addition to the value; + // we'll use it later. + std::pair<llvm::Value*, unsigned> Src = + EmitPointerWithAlignment(E->getArg(0)); + Ops.push_back(Src.first); + Align = Builder.getInt32(Src.second); + continue; + } + } + if (i == 1) { + switch (BuiltinID) { + case ARM::BI__builtin_neon_vld2_v: + case ARM::BI__builtin_neon_vld2q_v: + case ARM::BI__builtin_neon_vld3_v: + case ARM::BI__builtin_neon_vld3q_v: + case ARM::BI__builtin_neon_vld4_v: + case ARM::BI__builtin_neon_vld4q_v: + case ARM::BI__builtin_neon_vld2_lane_v: + case ARM::BI__builtin_neon_vld2q_lane_v: + case ARM::BI__builtin_neon_vld3_lane_v: + case ARM::BI__builtin_neon_vld3q_lane_v: + case ARM::BI__builtin_neon_vld4_lane_v: + case ARM::BI__builtin_neon_vld4q_lane_v: + case ARM::BI__builtin_neon_vld2_dup_v: + case ARM::BI__builtin_neon_vld3_dup_v: + case ARM::BI__builtin_neon_vld4_dup_v: + // Get the alignment for the argument in addition to the value; + // we'll use it later. + std::pair<llvm::Value*, unsigned> Src = + EmitPointerWithAlignment(E->getArg(1)); + Ops.push_back(Src.first); + Align = Builder.getInt32(Src.second); + continue; + } + } Ops.push_back(EmitScalarExpr(E->getArg(i))); + } // vget_lane and vset_lane are not overloaded and do not have an extra // argument that specifies the vector type. @@ -1746,7 +1812,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vhsub"); case ARM::BI__builtin_neon_vld1_v: case ARM::BI__builtin_neon_vld1q_v: - Ops.push_back(GetPointeeAlignmentValue(E->getArg(0))); + Ops.push_back(Align); return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vld1, Ty), Ops, "vld1"); case ARM::BI__builtin_neon_vld1q_lane_v: @@ -1761,8 +1827,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, // Load the value as a one-element vector. Ty = llvm::VectorType::get(VTy->getElementType(), 1); Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld1, Ty); - Value *Ld = Builder.CreateCall2(F, Ops[0], - GetPointeeAlignmentValue(E->getArg(0))); + Value *Ld = Builder.CreateCall2(F, Ops[0], Align); // Combine them. SmallVector<Constant*, 2> Indices; Indices.push_back(ConstantInt::get(Int32Ty, 1-Lane)); @@ -1776,7 +1841,6 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, Ty = llvm::PointerType::getUnqual(VTy->getElementType()); Ops[0] = Builder.CreateBitCast(Ops[0], Ty); LoadInst *Ld = Builder.CreateLoad(Ops[0]); - Value *Align = GetPointeeAlignmentValue(E->getArg(0)); Ld->setAlignment(cast<ConstantInt>(Align)->getZExtValue()); return Builder.CreateInsertElement(Ops[1], Ld, Ops[2], "vld1_lane"); } @@ -1786,7 +1850,6 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, Ty = llvm::PointerType::getUnqual(VTy->getElementType()); Ops[0] = Builder.CreateBitCast(Ops[0], Ty); LoadInst *Ld = Builder.CreateLoad(Ops[0]); - Value *Align = GetPointeeAlignmentValue(E->getArg(0)); Ld->setAlignment(cast<ConstantInt>(Align)->getZExtValue()); llvm::Constant *CI = ConstantInt::get(Int32Ty, 0); Ops[0] = Builder.CreateInsertElement(V, Ld, CI); @@ -1795,7 +1858,6 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, case ARM::BI__builtin_neon_vld2_v: case ARM::BI__builtin_neon_vld2q_v: { Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld2, Ty); - Value *Align = GetPointeeAlignmentValue(E->getArg(1)); Ops[1] = Builder.CreateCall2(F, Ops[1], Align, "vld2"); Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); Ops[0] = Builder.CreateBitCast(Ops[0], Ty); @@ -1804,7 +1866,6 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, case ARM::BI__builtin_neon_vld3_v: case ARM::BI__builtin_neon_vld3q_v: { Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld3, Ty); - Value *Align = GetPointeeAlignmentValue(E->getArg(1)); Ops[1] = Builder.CreateCall2(F, Ops[1], Align, "vld3"); Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); Ops[0] = Builder.CreateBitCast(Ops[0], Ty); @@ -1813,7 +1874,6 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, case ARM::BI__builtin_neon_vld4_v: case ARM::BI__builtin_neon_vld4q_v: { Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld4, Ty); - Value *Align = GetPointeeAlignmentValue(E->getArg(1)); Ops[1] = Builder.CreateCall2(F, Ops[1], Align, "vld4"); Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); Ops[0] = Builder.CreateBitCast(Ops[0], Ty); @@ -1824,7 +1884,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld2lane, Ty); Ops[2] = Builder.CreateBitCast(Ops[2], Ty); Ops[3] = Builder.CreateBitCast(Ops[3], Ty); - Ops.push_back(GetPointeeAlignmentValue(E->getArg(1))); + Ops.push_back(Align); 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); @@ -1836,7 +1896,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, Ops[2] = Builder.CreateBitCast(Ops[2], Ty); Ops[3] = Builder.CreateBitCast(Ops[3], Ty); Ops[4] = Builder.CreateBitCast(Ops[4], Ty); - Ops.push_back(GetPointeeAlignmentValue(E->getArg(1))); + Ops.push_back(Align); 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); @@ -1849,7 +1909,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, Ops[3] = Builder.CreateBitCast(Ops[3], Ty); Ops[4] = Builder.CreateBitCast(Ops[4], Ty); Ops[5] = Builder.CreateBitCast(Ops[5], Ty); - Ops.push_back(GetPointeeAlignmentValue(E->getArg(1))); + Ops.push_back(Align); 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); @@ -1873,7 +1933,6 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, default: llvm_unreachable("unknown vld_dup intrinsic?"); } Function *F = CGM.getIntrinsic(Int, Ty); - Value *Align = GetPointeeAlignmentValue(E->getArg(1)); Ops[1] = Builder.CreateCall2(F, Ops[1], Align, "vld_dup"); Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); Ops[0] = Builder.CreateBitCast(Ops[0], Ty); @@ -1900,7 +1959,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, llvm::Constant *CI = ConstantInt::get(Int32Ty, 0); Args.push_back(CI); - Args.push_back(GetPointeeAlignmentValue(E->getArg(1))); + Args.push_back(Align); Ops[1] = Builder.CreateCall(F, Args, "vld_dup"); // splat lane 0 to all elts in each vector of the result. @@ -2133,7 +2192,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, return Builder.CreateAdd(Ops[0], Ops[1]); case ARM::BI__builtin_neon_vst1_v: case ARM::BI__builtin_neon_vst1q_v: - Ops.push_back(GetPointeeAlignmentValue(E->getArg(0))); + Ops.push_back(Align); return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst1, Ty), Ops, ""); case ARM::BI__builtin_neon_vst1q_lane_v: @@ -2143,7 +2202,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, Ops[1] = Builder.CreateBitCast(Ops[1], Ty); Value *SV = llvm::ConstantVector::get(cast<llvm::Constant>(Ops[2])); Ops[1] = Builder.CreateShuffleVector(Ops[1], Ops[1], SV); - Ops[2] = GetPointeeAlignmentValue(E->getArg(0)); + Ops[2] = Align; return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst1, Ops[1]->getType()), Ops); } @@ -2154,38 +2213,37 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, Ty = llvm::PointerType::getUnqual(Ops[1]->getType()); StoreInst *St = Builder.CreateStore(Ops[1], Builder.CreateBitCast(Ops[0], Ty)); - Value *Align = GetPointeeAlignmentValue(E->getArg(0)); St->setAlignment(cast<ConstantInt>(Align)->getZExtValue()); return St; } case ARM::BI__builtin_neon_vst2_v: case ARM::BI__builtin_neon_vst2q_v: - Ops.push_back(GetPointeeAlignmentValue(E->getArg(0))); + Ops.push_back(Align); return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst2, Ty), Ops, ""); case ARM::BI__builtin_neon_vst2_lane_v: case ARM::BI__builtin_neon_vst2q_lane_v: - Ops.push_back(GetPointeeAlignmentValue(E->getArg(0))); + Ops.push_back(Align); return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst2lane, Ty), Ops, ""); case ARM::BI__builtin_neon_vst3_v: case ARM::BI__builtin_neon_vst3q_v: - Ops.push_back(GetPointeeAlignmentValue(E->getArg(0))); + Ops.push_back(Align); return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst3, Ty), Ops, ""); case ARM::BI__builtin_neon_vst3_lane_v: case ARM::BI__builtin_neon_vst3q_lane_v: - Ops.push_back(GetPointeeAlignmentValue(E->getArg(0))); + Ops.push_back(Align); return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst3lane, Ty), Ops, ""); case ARM::BI__builtin_neon_vst4_v: case ARM::BI__builtin_neon_vst4q_v: - Ops.push_back(GetPointeeAlignmentValue(E->getArg(0))); + Ops.push_back(Align); return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst4, Ty), Ops, ""); case ARM::BI__builtin_neon_vst4_lane_v: case ARM::BI__builtin_neon_vst4q_lane_v: - Ops.push_back(GetPointeeAlignmentValue(E->getArg(0))); + Ops.push_back(Align); return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vst4lane, Ty), Ops, ""); case ARM::BI__builtin_neon_vsubhn_v: |