1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
// RUN: %clang_cc1 -ast-dump %s | FileCheck %s
// RUN: %clang_cc1 -ast-dump -fcuda-is-device %s | FileCheck %s
// RUN: %clang_cc1 -ast-dump -fcuda-is-device %s \
// RUN: -fatomic-fine-grained-memory -fatomic-ignore-denormal-mode \
// RUN: | FileCheck %s
#include "Inputs/cuda.h"
// CHECK-LABEL: FunctionDecl {{.*}} test_default
// CHECK-NOT: AttributedStmt
// CHECK-NOT: AtomicAttr
// CHECK: CompoundStmt
// CHECK-NEXT: `-AtomicExpr
__device__ __host__ void test_default(float *a) {
__scoped_atomic_fetch_add(a, 1, __ATOMIC_RELAXED, __MEMORY_SCOPE_SYSTEM);
}
// CHECK-LABEL: FunctionDecl {{.*}} test_one
// CHECK: `-AttributedStmt
// CHECK-NEXT: |-AtomicAttr {{.*}} no_remote_memory{{$}}
// CHECK-NEXT: `-CompoundStmt
// CHECK-NEXT: `-AtomicExpr
__device__ __host__ void test_one(float *a) {
[[clang::atomic(no_remote_memory)]] {
__scoped_atomic_fetch_add(a, 1, __ATOMIC_RELAXED, __MEMORY_SCOPE_SYSTEM);
}
}
// CHECK-LABEL: FunctionDecl {{.*}} test_two
// CHECK: `-AttributedStmt
// CHECK-NEXT: |-AtomicAttr {{.*}} remote_memory ignore_denormal_mode{{$}}
// CHECK-NEXT: `-CompoundStmt
// CHECK-NEXT: `-AtomicExpr
__device__ __host__ void test_two(float *a) {
[[clang::atomic(remote_memory, ignore_denormal_mode)]] {
__scoped_atomic_fetch_add(a, 1, __ATOMIC_RELAXED, __MEMORY_SCOPE_SYSTEM);
}
}
// CHECK-LABEL: FunctionDecl {{.*}} test_three
// CHECK: `-AttributedStmt
// CHECK-NEXT: |-AtomicAttr {{.*}} no_remote_memory fine_grained_memory no_ignore_denormal_mode{{$}}
// CHECK-NEXT: `-CompoundStmt
// CHECK-NEXT: `-AtomicExpr
__device__ __host__ void test_three(float *a) {
[[clang::atomic(no_remote_memory, fine_grained_memory, no_ignore_denormal_mode)]] {
__scoped_atomic_fetch_add(a, 1, __ATOMIC_RELAXED, __MEMORY_SCOPE_SYSTEM);
}
}
// CHECK-LABEL: FunctionDecl {{.*}} test_duplicate
// CHECK: `-AttributedStmt
// CHECK-NEXT: |-AtomicAttr {{.*}} no_remote_memory{{$}}
// CHECK-NEXT: `-CompoundStmt
// CHECK-NEXT: `-AtomicExpr
__device__ __host__ void test_duplicate(float *a) {
[[clang::atomic(no_remote_memory, no_remote_memory)]] {
__scoped_atomic_fetch_add(a, 1, __ATOMIC_RELAXED, __MEMORY_SCOPE_SYSTEM);
}
}
// CHECK-LABEL: FunctionDecl {{.*}} test_conflict
// CHECK: `-AttributedStmt
// CHECK-NEXT: |-AtomicAttr {{.*}} remote_memory{{$}}
// CHECK-NEXT: `-CompoundStmt
// CHECK-NEXT: `-AtomicExpr
__device__ __host__ void test_conflict(float *a) {
[[clang::atomic(no_remote_memory, remote_memory)]] {
__scoped_atomic_fetch_add(a, 1, __ATOMIC_RELAXED, __MEMORY_SCOPE_SYSTEM);
}
}
// CHECK-LABEL: FunctionDecl {{.*}} test_multiple_attrs
// CHECK: `-AttributedStmt
// CHECK-NEXT: |-AtomicAttr {{.*}} no_remote_memory{{$}}
// CHECK-NEXT: |-AtomicAttr {{.*}} remote_memory{{$}}
// CHECK-NEXT: `-CompoundStmt
// CHECK-NEXT: `-AtomicExpr
__device__ __host__ void test_multiple_attrs(float *a) {
[[clang::atomic(no_remote_memory)]] [[clang::atomic(remote_memory)]] {
__scoped_atomic_fetch_add(a, 1, __ATOMIC_RELAXED, __MEMORY_SCOPE_SYSTEM);
}
}
// CHECK-LABEL: FunctionDecl {{.*}} test_nested
// CHECK: CompoundStmt
// CHECK: |-AtomicExpr
// CHECK: `-AttributedStmt
// CHECK-NEXT: |-AtomicAttr {{.*}} remote_memory fine_grained_memory no_ignore_denormal_mode{{$}}
// CHECK-NEXT: `-CompoundStmt
// CHECK: |-AtomicExpr
// CHECK: |-AttributedStmt
// CHECK-NEXT: |-AtomicAttr {{.*}} no_remote_memory{{$}}
// CHECK-NEXT: `-CompoundStmt
// CHECK-NEXT: `-AtomicExpr
// CHECK: `-AttributedStmt
// CHECK-NEXT: |-AtomicAttr {{.*}} no_fine_grained_memory{{$}}
// CHECK-NEXT: `-CompoundStmt
// CHECK-NEXT: `-AtomicExpr
__device__ __host__ void test_nested(float *a) {
__scoped_atomic_fetch_add(a, 1, __ATOMIC_RELAXED, __MEMORY_SCOPE_SYSTEM);
[[clang::atomic(remote_memory, fine_grained_memory, no_ignore_denormal_mode)]] {
__scoped_atomic_fetch_max(a, 2, __ATOMIC_SEQ_CST, __MEMORY_SCOPE_DEVICE);
[[clang::atomic(no_remote_memory)]] {
__scoped_atomic_fetch_min(a, 3, __ATOMIC_ACQUIRE, __MEMORY_SCOPE_WRKGRP);
}
[[clang::atomic(no_fine_grained_memory)]] {
__scoped_atomic_fetch_sub(a, 4, __ATOMIC_RELEASE, __MEMORY_SCOPE_WVFRNT);
}
}
}
// CHECK-LABEL: FunctionTemplateDecl {{.*}} test_template
// CHECK: |-FunctionDecl {{.*}} test_template 'void (T *)'
// CHECK: | |-CompoundStmt
// CHECK: | | `-AttributedStmt
// CHECK: | | |-AtomicAttr {{.*}} no_remote_memory fine_grained_memory no_ignore_denormal_mode{{$}}
// CHECK: | | `-CompoundStmt
// CHECK: | | `-CallExpr {{.*}} '<dependent type>'
// CHECK: `-FunctionDecl {{.*}} used test_template 'void (float *)' implicit_instantiation
// CHECK: |-CompoundStmt
// CHECK: | `-AttributedStmt
// CHECK: | |-AtomicAttr {{.*}} no_remote_memory fine_grained_memory no_ignore_denormal_mode{{$}}
// CHECK: | `-CompoundStmt
// CHECK: | `-AtomicExpr {{.*}} 'float'
template<typename T>
__device__ __host__ void test_template(T *a) {
[[clang::atomic(no_remote_memory, fine_grained_memory, no_ignore_denormal_mode)]] {
__scoped_atomic_fetch_add(a, 1, __ATOMIC_RELAXED, __MEMORY_SCOPE_SYSTEM);
}
}
__device__ __host__ void test_template_caller() {
float *p;
test_template(p);
}
|