On SystemZ, int128 values are generally aligned to only 8 bytes per the ABI while 128 bit atomic ISA instructions exist with a full 16 byte alignment requirement. __sync builtins are emitted as atomicrmw instructions which always require the natural alignment (16 bytes in this case), and they always get it regardless of the alignment of the value being addressed. This patch improves this situation by giving a warning if the alignment is not known to be sufficient. This check is done in CodeGen instead of in Sema as this is currently the only place where the alignment can be computed. This could/should be moved into Sema in case the alignment computation could be made there eventually. Reviewed By: efriedma, jyknight, uweigand Differential Revision: https://reviews.llvm.org/D143813
28 lines
917 B
C
28 lines
917 B
C
// RUN: %clang_cc1 -triple s390x-linux-gnu -O1 -emit-llvm %s -o - 2>&1 | FileCheck %s
|
|
//
|
|
// Test that an underaligned 16 byte __sync gives a warning.
|
|
|
|
#include <stdint.h>
|
|
|
|
__int128 Ptr __attribute__((aligned(8)));
|
|
|
|
__int128 f1() {
|
|
// CHECK: warning: __sync builtin operation MUST have natural alignment (consider using __atomic). [-Wsync-alignment]
|
|
return __sync_fetch_and_add(&Ptr, 1);
|
|
}
|
|
|
|
__int128 f2() {
|
|
// CHECK: warning: __sync builtin operation MUST have natural alignment (consider using __atomic). [-Wsync-alignment]
|
|
return __sync_sub_and_fetch(&Ptr, 1);
|
|
}
|
|
|
|
__int128 f3() {
|
|
// CHECK: warning: __sync builtin operation MUST have natural alignment (consider using __atomic). [-Wsync-alignment]
|
|
return __sync_val_compare_and_swap(&Ptr, 0, 1);
|
|
}
|
|
|
|
void f4() {
|
|
// CHECK: warning: __sync builtin operation MUST have natural alignment (consider using __atomic). [-Wsync-alignment]
|
|
__sync_lock_release(&Ptr);
|
|
}
|