Files
clang-p2996/clang/test/CodeGen/SystemZ/sync-builtins-i128-8Al.c
Jonas Paulsson 7501e53b8d [Clang] Give warning for an underaligned 128-bit __sync library call.
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
2023-03-15 12:46:06 +01:00

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);
}