From: John McCall Date: Tue, 29 Sep 2015 04:37:40 +0000 (+0000) Subject: Honor the casted-to alignment of an explicit cast even when X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6963521379311a80c849bf4b81fcfe4604483f0f;p=clang Honor the casted-to alignment of an explicit cast even when Sema thinks the cast is a no-op, as it does when (e.g.) the only thing that changes is an alignment attribute. Fixed PR24944. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@248775 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index c38dbdd7d3..ece83371db 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -814,7 +814,6 @@ Address CodeGenFunction::EmitPointerWithAlignment(const Expr *E, // If this is an explicit bitcast, and the source l-value is // opaque, honor the alignment of the casted-to type. if (isa(CE) && - CE->getCastKind() == CK_BitCast && InnerSource != AlignmentSource::Decl) { Addr = Address(Addr.getPointer(), getNaturalPointeeTypeAlignment(E->getType(), Source)); diff --git a/test/CodeGen/alignment.c b/test/CodeGen/alignment.c index 0a598010c8..c9f58136e3 100644 --- a/test/CodeGen/alignment.c +++ b/test/CodeGen/alignment.c @@ -59,3 +59,11 @@ void test4(float4align64 *p) { // CHECK: @test4( // CHECK: store <4 x float> {{.*}}, <4 x float>* {{.*}}, align 64 +// PR24944 - Typedef alignment not honored on no-op cast. +typedef float __attribute__((vector_size(16), aligned(16))) float4align16; +typedef float __attribute__((vector_size(16), aligned(2))) float4align2; +void test6(float4align64 *p) { + float4align64 vec = *(float4align2*) p; +} +// CHECK-LABEL: @test6 +// CHECK: load <4 x float>, <4 x float>* {{.*}}, align 2