__builtin_assume_aligned semantics

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I'm trying to put together a macro to abstract away some compiler
differences, but I'm having trouble with __builtin_assume_aligned, and
I'm not sure how to generate a reliable test case.

For ICC there is __assume_aligned.  This is what I'm looking to
emulate; you just pass it a pointer and the desired alignment:

    __assume_aligned(arg, 16)
    /* Compiler knows arg is 16-byte aligned */

For MSVC there is __assume, which is a bit of a pain to use, but
basically you pass an expression (which evaluates to true if the
variable is aligned as expected).  Something like

    __assume((((char*) arg) - ((char*) 0)) % (16) == 0)
    /* Compiler knows arg is 16-byte aligned */

GCC 4.7+, OTOH, does things a bit different.  It returns a value, and
you're supposed to use the returned value:

    void* x = __builtin_assume_aligned(arg, 16);
    /* Compiler knows x is 16-byte aligned */

My question is, with __builtin_assume_aligned, does GCC know that *arg*
(not x) is 16-byte aligned?  Basically, can I use it like
__assume_aligned?

Also, for 4.5+ (when __builtin_unreachable was added), if I do
something like

    #define assume_aligned(arg, align) \
      ((((char*) ptr) - ((char*) 0)) % (align) == 0) ? \
        (0) : __builtin_unreachable()

Would GCC know that arg is aligned?


-Evan



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux