[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