forked from OSchip/llvm-project
implement rdar://10639962 by keeping track of increased alignment
information even in subscripting operations. llvm-svn: 147557
This commit is contained in:
parent
cc0cf90953
commit
36bc4f41bc
|
@ -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 &&
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue