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.

llvm-svn: 248775
This commit is contained in:
John McCall 2015-09-29 04:37:40 +00:00
parent 8674c5cf70
commit 8460bcaa33
2 changed files with 8 additions and 1 deletions

View File

@ -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<ExplicitCastExpr>(CE) &&
CE->getCastKind() == CK_BitCast &&
InnerSource != AlignmentSource::Decl) {
Addr = Address(Addr.getPointer(),
getNaturalPointeeTypeAlignment(E->getType(), Source));

View File

@ -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