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

John McCall rjmccall at apple.com
Mon Aug 4 17:39:18 PDT 2014


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?

John.



More information about the cfe-commits mailing list