Patch to force SuitableAlign's alignment when loading on object with larger alignment

jahanian fjahanian at apple.com
Tue Aug 5 11:47:35 PDT 2014


On Aug 4, 2014, at 5:39 PM, John McCall <rjmccall at apple.com> wrote:

> On Aug 4, 2014, at 2:58 PM, jahanian <fjahanian at apple.com> wrote:
>> New patch which is a simplified version of the previous patch. Simplified by using the existing
>> isAlignmentRequired. No other changes.
> 
> +VALUE_LANGOPT(MaxTypeAlign  , 32, 0,
> +              "default maximum alignment for types")
> 
> +def fmax_type_align_EQ : Joined<["-"], "fmax-type-align=">, Group<f_Group>, Flags<[CC1Option]>,
> +  HelpText<"Specify the default maximum alignment for types">;
> +def fno_max_type_align : Flag<["-"], "fno-max-type-align">, Group<f_Group>;
> 
> I wordsmithed the option name and help text a little with Doug, and we settled on this:
> 
>  -fmax-unknown-pointer-align=N
>    “Specify the maximum alignment to enforce on pointers lacking an explicit alignment"
> 
> You should also document this in docs/UsersManual.rst, in the Controlling
> Code Generation section.  I would recommend the following text:
> 
>  -fmax-unknown-pointer-align=[number]
>  -fno-max-unknown-pointer-align
>    Instruct the code generator to not enforce a higher alignment than the given
>    number (of bytes) when accessing memory via an opaque pointer or reference.
>    This cap is ignored when directly accessing a variable or when the pointee
>    type has an explicit “aligned” attribute.
> 
>    The value should usually be determined by the properties of the system allocator.
>    Some builtin types, especially vector types, have very high natural alignments;
>    when working with values of those types, Clang usually wants to use instructions
>    that take advantage of that alignment.  However, many system allocators do
>    not promise to return memory that is more than 8-byte or 16-byte-aligned.  Use
>    this option to limit the alignment that the compiler can assume for an arbitrary
>    pointer, which may point onto the heap.
> 
>    This option does not affect the ABI alignment of types; the layout of structs and
>    unions and the value returned by the alignof operator remain the same.
> 
>    This option can be overridden on a case-by-case basis by putting an explicit
>    “aligned” alignment on a struct, union, or typedef.  For example:
> 
>   ::
>       #include <immintrin.h>
>       // Make an aligned typedef of the AVX-512 16-int vector type.
>       typedef __v16si __aligned_v16si __attribute__((aligned(64)));
> 
>       void initialize_vector(__aligned_v16si *v) {
>         // The compiler may assume that ‘v’ is 64-byte aligned, regardless of the
>         // value of -fmax-unknown-pointer-align.
>       }
> 
> +  ASTContext &Context = CGM.getContext();
> +  if (const UnaryOperator *UOPE = dyn_cast<UnaryOperator>(E))
> +    if (UOPE->getOpcode() == UO_Deref) {
> 
> This is far too specific.  In your first patch, you were modifying
> MakeNaturalAlignAddrLValue, which I think was fine; why did you
> change your mind?

Checked in r214911. Please do a post-commit review.
- Thanks, Fariborz

> 
> John.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140805/a0446945/attachment.html>


More information about the cfe-commits mailing list