https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114995
--- Comment #6 from Pratik Chowdhury <pratikc at live dot co.uk> --- > [[assume((uintptr_t(x_array) & (32-1)) == 0)]]; The Parans in the & have definitely given someone sleepless nights LOL. I myself was saved by the warnings. > Right now we don't always prop back what information we get from the assume > attributes. Maybe with the recent prange addition, it can for pointers ... Aah Guess we will switch to assume in the future. I tried [something else just about now](https://gcc.godbolt.org/z/d8aPjzMhq) I think its a bit wrong. Clang seems to be able to handle it. Is this syntax even valid? ```cpp if(reinterpret_cast<::std::uintptr_t>(__builtin_assume_aligned((void*)(mul_array), 32)) != reinterpret_cast<::std::uintptr_t>(mul_array)) { __builtin_unreachable(); } if(reinterpret_cast<::std::uintptr_t>(__builtin_assume_aligned((void*)(add_array), 32)) != reinterpret_cast<::std::uintptr_t>(add_array)) { __builtin_unreachable(); } if(reinterpret_cast<::std::uintptr_t>(__builtin_assume_aligned((void*)(x_array), 32)) != reinterpret_cast<::std::uintptr_t>(x_array)) { __builtin_unreachable(); } ``` I have my doubts on the previous one But this should ideally be valid ```cpp if((reinterpret_cast<::std::uintptr_t>(__builtin_assume_aligned((void*)(mul_array), 32)) & (32-1)) != 0) { __builtin_unreachable(); } if((reinterpret_cast<::std::uintptr_t>(__builtin_assume_aligned((void*)(add_array), 32)) & (32-1)) != 0) { __builtin_unreachable(); } if((reinterpret_cast<::std::uintptr_t>(__builtin_assume_aligned((void*)(x_array), 32)) & (32-1)) != 0) { __builtin_unreachable(); } ``` But either of them are unable to change the Load Stores from Unaligned to Aligned. Maybe victims of aggressive Dead Code elimination here? GCC intrinsics believe that there can be no case its false and the code is deleted for the same? Because __builtin_assume_aligned should always be a multiple of 32 in the above cases. Or __builtin_assume_aligned does not support usage like this in GCC and in Clang it does? And due to that difference, we have a difference in behavior. Its pretty interesting either way.