[llvm-commits] PATCH: clang ext_vector_type alignment in packed structure
Eli Friedman
eli.friedman at gmail.com
Wed Mar 14 11:41:59 PDT 2012
On Wed, Mar 14, 2012 at 11:41 AM, Eli Friedman <eli.friedman at gmail.com> wrote:
> On Wed, Mar 14, 2012 at 11:10 AM, Schoedel, Kevin P
> <kevin.p.schoedel at intel.com> wrote:
>> This time with the patch....
>>
>> When an ext_vector_type appears inside a structure, clang's CodeGen
>> does not supply an alignment on loads and stores. Because of this,
>> InstCombine subsequently adds an alignment based purely on the type,
>> which is incorrect in the case that the structure is packed.
>>
>> For example,
>>
>> typedef float float4 __attribute__((ext_vector_type(4)));
>>
>> struct __attribute__((packed, aligned(4))) packed_struct {
>> unsigned int use_some_space; float4 position;
>> };
>>
>> static float f(struct packed_struct *p) {
>> return p->position.x;
>> }
>>
>> yields
>>
>> %1 = load <4 x float>* %position
>>
>> which after InstCombine becomes
>>
>> %1 = load <4 x float>* %position, align 16
>>
>> even though the 'position' member is aligned only to 4 bytes.
>>
>> The attached patch adds code to CGExpr.cpp to propagate the (estimated)
>> alignment of the underlying element. Please review and commit if
>> appropriate.
>
> Might want to add a comment to CGValue.h explicitly stating that the
> alignment associated with a VectorElt lvalue is the alignment of the
> whole vector. Otherwise, looks fine.
Oh, and in the future, please send clang patches to cfe-commits.
-Eli
More information about the llvm-commits
mailing list