From 44a239973dfe86a0d2432ca2502b7878fadfe23e Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 4 Jan 2012 22:35:55 +0000 Subject: [PATCH] implement rdar://10639962 by keeping track of increased alignment information even in subscripting operations. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147557 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGExpr.cpp | 6 +++++- test/CodeGen/alignment.c | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index 4c23c061a7..c6ba65c03c 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -1702,13 +1702,17 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E) { assert(!T.isNull() && "CodeGenFunction::EmitArraySubscriptExpr(): Illegal base type"); + // Limit the alignment to that of the result type. + LValue LV; if (!ArrayAlignment.isZero()) { CharUnits Align = getContext().getTypeAlignInChars(T); ArrayAlignment = std::min(Align, ArrayAlignment); + LV = MakeAddrLValue(Address, T, ArrayAlignment); + } else { + LV = MakeNaturalAlignAddrLValue(Address, T); } - LValue LV = MakeAddrLValue(Address, T, ArrayAlignment); LV.getQuals().setAddressSpace(E->getBase()->getType().getAddressSpace()); if (getContext().getLangOptions().ObjC1 && diff --git a/test/CodeGen/alignment.c b/test/CodeGen/alignment.c index e1c9e9eb55..9384ec83d1 100644 --- a/test/CodeGen/alignment.c +++ b/test/CodeGen/alignment.c @@ -47,3 +47,13 @@ void test3(packedfloat3 *p) { // CHECK: ret void + +typedef float __attribute__((vector_size(16), aligned(64))) float4align64; + +// rdar://10639962 - Typedef alignment lost in p[]-style dereferencing +void test4(float4align64 *p) { + p[0] = (float4align64){ 3.2f, 2.3f, 0.1f, 0.0f }; +} +// CHECK: @test4( +// CHECK: store <4 x float> {{.*}}, <4 x float>* %arrayidx, align 64 + -- 2.40.0