[all-commits] [llvm/llvm-project] 408a26: [CUDA] Ignore __CLANG_ATOMIC_LLONG_LOCK_FREE on i386

Ryan Prichard via All-commits all-commits at lists.llvm.org
Thu Jul 21 17:24:48 PDT 2022


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 408a2638fda63b381f8750e16c78bc3c845cfdfd
      https://github.com/llvm/llvm-project/commit/408a2638fda63b381f8750e16c78bc3c845cfdfd
  Author: Ryan Prichard <rprichard at google.com>
  Date:   2022-07-21 (Thu, 21 Jul 2022)

  Changed paths:
    M clang/test/Preprocessor/cuda-types.cu

  Log Message:
  -----------
  [CUDA] Ignore __CLANG_ATOMIC_LLONG_LOCK_FREE on i386

The default host CPU for an i386 triple is typically at least an i586,
which has cmpxchg8b (Clang feature, "cx8"). Therefore,
`__CLANG_ATOMIC_LLONG_LOCK_FREE` is 2 on the host, but the value should
be 1 for the device.

Also, grep for `__CLANG_ATOMIC_*` instead of `__GCC_ATOMIC_*`. The CLANG
macros are always emitted, but the GCC macros are omitted for the
*-windows-msvc targets. The `__GCC_HAVE_SYNC_COMPARE_AND_SWAP` macro
always has GCC in its name, not CLANG, however.

Reviewed By: tra

Differential Revision: https://reviews.llvm.org/D127465


  Commit: 02a25279aedcd959d060bba585adc0fe1cec3782
      https://github.com/llvm/llvm-project/commit/02a25279aedcd959d060bba585adc0fe1cec3782
  Author: Ryan Prichard <rprichard at google.com>
  Date:   2022-07-21 (Thu, 21 Jul 2022)

  Changed paths:
    M clang/lib/Frontend/InitPreprocessor.cpp
    M clang/test/Preprocessor/init-x86.c
    M clang/test/Sema/atomic-ops.c

  Log Message:
  -----------
  [Frontend] Correct values of ATOMIC_*_LOCK_FREE to match builtin

Correct the logic used to set `ATOMIC_*_LOCK_FREE` preprocessor macros not
to rely on the ABI alignment of types. Instead, just assume all those
types are aligned correctly by default since clang uses safe alignment
for `_Atomic` types even if the underlying types are aligned to a lower
boundary by default.

For example, the `long long` and `double` types on x86 are aligned to
32-bit boundary by default. However, `_Atomic long long` and `_Atomic
double` are aligned to 64-bit boundary, therefore satisfying
the requirements of lock-free atomic operations.

This fixes PR #19355 by correcting the value of
`__GCC_ATOMIC_LLONG_LOCK_FREE` on x86, and therefore also fixing
the assumption made in libc++ tests. This also fixes PR #30581 by
applying a consistent logic between the functions used to implement
both interfaces.

Reviewed By: hfinkel, efriedma

Differential Revision: https://reviews.llvm.org/D28213


Compare: https://github.com/llvm/llvm-project/compare/b8e1544b9df0...02a25279aedc


More information about the All-commits mailing list