Skip to content

Commit a4c6c2e

Browse files
boomanaiden154fmayer
authored andcommitted
[𝘀𝗽𝗿] changes introduced through rebase
Created using spr 1.3.7 [skip ci]
2 parents 60245f2 + 175168c commit a4c6c2e

File tree

19 files changed

+581
-124
lines changed

19 files changed

+581
-124
lines changed

clang/docs/LanguageExtensions.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4854,6 +4854,14 @@ memory scope argument. These are designed to be a generic alternative to the
48544854
``__opencl_atomic_*`` builtin functions for targets that support atomic memory
48554855
scopes.
48564856
4857+
Clang provides two additional __scoped_atomic builtins:
4858+
4859+
* ``__scoped_atomic_uinc_wrap``
4860+
* ``__scoped_atomic_udec_wrap``
4861+
4862+
See LLVM IR `atomicrmw <https://llvm.org/docs/LangRef.html#atomicrmw-instruction>`_
4863+
instruction for the semantics of uinc_wrap and udec_wrap.
4864+
48574865
Atomic memory scopes are designed to assist optimizations for systems with
48584866
several levels of memory hierarchy like GPUs. The following memory scopes are
48594867
currently supported:

clang/docs/ReleaseNotes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,8 @@ C23 Feature Support
230230

231231
Non-comprehensive list of changes in this release
232232
-------------------------------------------------
233+
- Added ``__scoped_atomic_uinc_wrap`` and ``__scoped_atomic_udec_wrap``.
234+
233235
- Removed OpenCL header-only feature macros (previously unconditionally enabled
234236
on SPIR-V and only selectively disabled via ``-D__undef_<feature>``). All
235237
OpenCL extensions and features are now centralized in OpenCLExtensions.def,

clang/include/clang/Basic/Builtins.td

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2290,6 +2290,18 @@ def ScopedAtomicMaxFetch : AtomicBuiltin {
22902290
let Prototype = "void(...)";
22912291
}
22922292

2293+
def ScopedAtomicUIncWrap : AtomicBuiltin {
2294+
let Spellings = ["__scoped_atomic_uinc_wrap"];
2295+
let Attributes = [CustomTypeChecking];
2296+
let Prototype = "void(...)";
2297+
}
2298+
2299+
def ScopedAtomicUDecWrap : AtomicBuiltin {
2300+
let Spellings = ["__scoped_atomic_udec_wrap"];
2301+
let Attributes = [CustomTypeChecking];
2302+
let Prototype = "void(...)";
2303+
}
2304+
22932305
// OpenCL 2.0 atomic builtins.
22942306
def OpenCLAtomicInit : AtomicBuiltin {
22952307
let Spellings = ["__opencl_atomic_init"];

clang/lib/AST/Expr.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5213,6 +5213,8 @@ unsigned AtomicExpr::getNumSubExprs(AtomicOp Op) {
52135213
case AO__scoped_atomic_fetch_min:
52145214
case AO__scoped_atomic_fetch_max:
52155215
case AO__scoped_atomic_exchange_n:
5216+
case AO__scoped_atomic_uinc_wrap:
5217+
case AO__scoped_atomic_udec_wrap:
52165218
case AO__hip_atomic_exchange:
52175219
case AO__hip_atomic_fetch_add:
52185220
case AO__hip_atomic_fetch_sub:

clang/lib/Analysis/ThreadSafety.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2820,7 +2820,7 @@ void ThreadSafetyAnalyzer::runAnalysis(AnalysisDeclContext &AC) {
28202820
case CFGElement::AutomaticObjectDtor: {
28212821
CFGAutomaticObjDtor AD = BI.castAs<CFGAutomaticObjDtor>();
28222822
const auto *DD = AD.getDestructorDecl(AC.getASTContext());
2823-
if (!DD->hasAttrs())
2823+
if (!DD || !DD->hasAttrs())
28242824
break;
28252825

28262826
LocksetBuilder.handleCall(

clang/lib/CodeGen/CGAtomic.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,6 +767,13 @@ static void EmitAtomicOp(CodeGenFunction &CGF, AtomicExpr *E, Address Dest,
767767
Op = llvm::AtomicRMWInst::Nand;
768768
break;
769769

770+
case AtomicExpr::AO__scoped_atomic_uinc_wrap:
771+
Op = llvm::AtomicRMWInst::UIncWrap;
772+
break;
773+
case AtomicExpr::AO__scoped_atomic_udec_wrap:
774+
Op = llvm::AtomicRMWInst::UDecWrap;
775+
break;
776+
770777
case AtomicExpr::AO__atomic_test_and_set: {
771778
llvm::AtomicRMWInst *RMWI =
772779
CGF.emitAtomicRMWInst(llvm::AtomicRMWInst::Xchg, Ptr,
@@ -1071,6 +1078,8 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E) {
10711078
case AtomicExpr::AO__scoped_atomic_xor_fetch:
10721079
case AtomicExpr::AO__scoped_atomic_store_n:
10731080
case AtomicExpr::AO__scoped_atomic_exchange_n:
1081+
case AtomicExpr::AO__scoped_atomic_uinc_wrap:
1082+
case AtomicExpr::AO__scoped_atomic_udec_wrap:
10741083
Val1 = EmitValToTemp(*this, E->getVal1());
10751084
break;
10761085
}
@@ -1269,6 +1278,8 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E) {
12691278
case AtomicExpr::AO__opencl_atomic_fetch_max:
12701279
case AtomicExpr::AO__scoped_atomic_fetch_max:
12711280
case AtomicExpr::AO__scoped_atomic_max_fetch:
1281+
case AtomicExpr::AO__scoped_atomic_uinc_wrap:
1282+
case AtomicExpr::AO__scoped_atomic_udec_wrap:
12721283
case AtomicExpr::AO__atomic_test_and_set:
12731284
case AtomicExpr::AO__atomic_clear:
12741285
llvm_unreachable("Integral atomic operations always become atomicrmw!");

clang/lib/Sema/SemaChecking.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4482,6 +4482,8 @@ ExprResult Sema::BuildAtomicExpr(SourceRange CallRange, SourceRange ExprRange,
44824482
case AtomicExpr::AO__scoped_atomic_or_fetch:
44834483
case AtomicExpr::AO__scoped_atomic_xor_fetch:
44844484
case AtomicExpr::AO__scoped_atomic_nand_fetch:
4485+
case AtomicExpr::AO__scoped_atomic_uinc_wrap:
4486+
case AtomicExpr::AO__scoped_atomic_udec_wrap:
44854487
Form = Arithmetic;
44864488
break;
44874489

clang/test/CodeGen/cfi-icall-trap-recover-runtime.c

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111

1212
// RUN: %clang_cc1 -fsanitize=cfi-icall -fno-sanitize-trap=cfi-icall -fsanitize-recover=cfi-icall -fsanitize-minimal-runtime -fsanitize-handler-preserve-all-regs -flto -fvisibility=hidden -triple x86_64-unknown-linux -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=PRESERVE_MIN %s
1313

14-
// RUN: %clang_cc1 -fsanitize=cfi-icall -fno-sanitize-trap=cfi-icall -fsanitize-recover=cfi-icall -fsanitize-minimal-runtime -fsanitize-handler-preserve-all-regs -flto -fvisibility=hidden -triple riscv64-unknown-linux -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=RECOVER_MIN_I386 %s
15-
1614
// RUN: %clang_cc1 -fsanitize=cfi-icall -fno-sanitize-trap=cfi-icall -fsanitize-minimal-runtime -fsanitize-handler-preserve-all-regs -flto -fvisibility=hidden -triple x86_64-unknown-linux -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=ABORT_MIN %s
1715

1816

@@ -46,11 +44,6 @@
4644
// PRESERVE_MIN-NEXT: [[ENTRY:.*:]]
4745
// PRESERVE_MIN-NEXT: ret void
4846
//
49-
// RECOVER_MIN_I386-LABEL: define hidden void @f(
50-
// RECOVER_MIN_I386-SAME: ) #[[ATTR0:[0-9]+]] !type [[META10:![0-9]+]] !type [[META11:![0-9]+]] {
51-
// RECOVER_MIN_I386-NEXT: [[ENTRY:.*:]]
52-
// RECOVER_MIN_I386-NEXT: ret void
53-
//
5447
void f() {
5548
}
5649

@@ -184,27 +177,6 @@ void xf();
184177
// PRESERVE_MIN-NEXT: call void (...) [[TMP2]]()
185178
// PRESERVE_MIN-NEXT: ret void
186179
//
187-
// RECOVER_MIN_I386-LABEL: define hidden void @g(
188-
// RECOVER_MIN_I386-SAME: i32 noundef signext [[B:%.*]]) #[[ATTR0]] !type [[META12:![0-9]+]] !type [[META13:![0-9]+]] {
189-
// RECOVER_MIN_I386-NEXT: [[ENTRY:.*:]]
190-
// RECOVER_MIN_I386-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4
191-
// RECOVER_MIN_I386-NEXT: [[FP:%.*]] = alloca ptr, align 8
192-
// RECOVER_MIN_I386-NEXT: store i32 [[B]], ptr [[B_ADDR]], align 4
193-
// RECOVER_MIN_I386-NEXT: [[TMP0:%.*]] = load i32, ptr [[B_ADDR]], align 4
194-
// RECOVER_MIN_I386-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP0]], 0
195-
// RECOVER_MIN_I386-NEXT: [[TMP1:%.*]] = zext i1 [[TOBOOL]] to i64
196-
// RECOVER_MIN_I386-NEXT: [[COND:%.*]] = select i1 [[TOBOOL]], ptr @f, ptr @xf
197-
// RECOVER_MIN_I386-NEXT: store ptr [[COND]], ptr [[FP]], align 8
198-
// RECOVER_MIN_I386-NEXT: [[TMP2:%.*]] = load ptr, ptr [[FP]], align 8
199-
// RECOVER_MIN_I386-NEXT: [[TMP3:%.*]] = call i1 @llvm.type.test(ptr [[TMP2]], metadata !"_ZTSFvE"), !nosanitize [[META14:![0-9]+]]
200-
// RECOVER_MIN_I386-NEXT: br i1 [[TMP3]], label %[[CONT:.*]], label %[[HANDLER_CFI_CHECK_FAIL:.*]], !prof [[PROF15:![0-9]+]], !nosanitize [[META14]]
201-
// RECOVER_MIN_I386: [[HANDLER_CFI_CHECK_FAIL]]:
202-
// RECOVER_MIN_I386-NEXT: call void @__ubsan_handle_cfi_check_fail_minimal() #[[ATTR4:[0-9]+]], !nosanitize [[META14]]
203-
// RECOVER_MIN_I386-NEXT: br label %[[CONT]], !nosanitize [[META14]]
204-
// RECOVER_MIN_I386: [[CONT]]:
205-
// RECOVER_MIN_I386-NEXT: call void [[TMP2]]()
206-
// RECOVER_MIN_I386-NEXT: ret void
207-
//
208180
void g(int b) {
209181
void (*fp)() = b ? f : xf;
210182
fp();
@@ -252,10 +224,3 @@ void g(int b) {
252224
// PRESERVE_MIN: [[META10]] = !{}
253225
// PRESERVE_MIN: [[PROF11]] = !{!"branch_weights", i32 1048575, i32 1}
254226
//.
255-
// RECOVER_MIN_I386: [[META10]] = !{i64 0, !"_ZTSFvE"}
256-
// RECOVER_MIN_I386: [[META11]] = !{i64 0, !"_ZTSFvE.generalized"}
257-
// RECOVER_MIN_I386: [[META12]] = !{i64 0, !"_ZTSFviE"}
258-
// RECOVER_MIN_I386: [[META13]] = !{i64 0, !"_ZTSFviE.generalized"}
259-
// RECOVER_MIN_I386: [[META14]] = !{}
260-
// RECOVER_MIN_I386: [[PROF15]] = !{!"branch_weights", i32 1048575, i32 1}
261-
//.

clang/test/CodeGen/scoped-atomic-ops.c

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4539,6 +4539,111 @@ _Bool fi7e(_Bool *c) {
45394539
return __scoped_atomic_exchange_n(c, 1, __ATOMIC_RELAXED,
45404540
__MEMORY_SCOPE_SINGLE);
45414541
}
4542+
4543+
// AMDGCN_CL_DEF-LABEL: define hidden void @fi8a(
4544+
// AMDGCN_CL_DEF-SAME: ptr noundef [[A:%.*]], ptr noundef [[B:%.*]]) #[[ATTR0]] {
4545+
// AMDGCN_CL_DEF-NEXT: [[ENTRY:.*:]]
4546+
// AMDGCN_CL_DEF-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
4547+
// AMDGCN_CL_DEF-NEXT: [[B_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
4548+
// AMDGCN_CL_DEF-NEXT: [[DOTATOMICTMP:%.*]] = alloca i32, align 4, addrspace(5)
4549+
// AMDGCN_CL_DEF-NEXT: [[ATOMIC_TEMP:%.*]] = alloca i32, align 4, addrspace(5)
4550+
// AMDGCN_CL_DEF-NEXT: [[DOTATOMICTMP1:%.*]] = alloca i32, align 4, addrspace(5)
4551+
// AMDGCN_CL_DEF-NEXT: [[ATOMIC_TEMP2:%.*]] = alloca i32, align 4, addrspace(5)
4552+
// AMDGCN_CL_DEF-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr
4553+
// AMDGCN_CL_DEF-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr
4554+
// AMDGCN_CL_DEF-NEXT: [[DOTATOMICTMP_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTATOMICTMP]] to ptr
4555+
// AMDGCN_CL_DEF-NEXT: [[ATOMIC_TEMP_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[ATOMIC_TEMP]] to ptr
4556+
// AMDGCN_CL_DEF-NEXT: [[DOTATOMICTMP1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTATOMICTMP1]] to ptr
4557+
// AMDGCN_CL_DEF-NEXT: [[ATOMIC_TEMP2_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[ATOMIC_TEMP2]] to ptr
4558+
// AMDGCN_CL_DEF-NEXT: store ptr [[A]], ptr [[A_ADDR_ASCAST]], align 8
4559+
// AMDGCN_CL_DEF-NEXT: store ptr [[B]], ptr [[B_ADDR_ASCAST]], align 8
4560+
// AMDGCN_CL_DEF-NEXT: [[TMP0:%.*]] = load ptr, ptr [[B_ADDR_ASCAST]], align 8
4561+
// AMDGCN_CL_DEF-NEXT: store i32 -1, ptr [[DOTATOMICTMP_ASCAST]], align 4
4562+
// AMDGCN_CL_DEF-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTATOMICTMP_ASCAST]], align 4
4563+
// AMDGCN_CL_DEF-NEXT: [[TMP2:%.*]] = atomicrmw uinc_wrap ptr [[TMP0]], i32 [[TMP1]] syncscope("agent") monotonic, align 4, !amdgpu.no.fine.grained.memory [[META3]], !amdgpu.no.remote.memory [[META3]]
4564+
// AMDGCN_CL_DEF-NEXT: store i32 [[TMP2]], ptr [[ATOMIC_TEMP_ASCAST]], align 4
4565+
// AMDGCN_CL_DEF-NEXT: [[TMP3:%.*]] = load i32, ptr [[ATOMIC_TEMP_ASCAST]], align 4
4566+
// AMDGCN_CL_DEF-NEXT: [[TMP4:%.*]] = load ptr, ptr [[B_ADDR_ASCAST]], align 8
4567+
// AMDGCN_CL_DEF-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
4568+
// AMDGCN_CL_DEF-NEXT: [[TMP5:%.*]] = load ptr, ptr [[A_ADDR_ASCAST]], align 8
4569+
// AMDGCN_CL_DEF-NEXT: store i32 -1, ptr [[DOTATOMICTMP1_ASCAST]], align 4
4570+
// AMDGCN_CL_DEF-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTATOMICTMP1_ASCAST]], align 4
4571+
// AMDGCN_CL_DEF-NEXT: [[TMP7:%.*]] = atomicrmw udec_wrap ptr [[TMP5]], i32 [[TMP6]] syncscope("agent") monotonic, align 4, !amdgpu.no.fine.grained.memory [[META3]], !amdgpu.no.remote.memory [[META3]]
4572+
// AMDGCN_CL_DEF-NEXT: store i32 [[TMP7]], ptr [[ATOMIC_TEMP2_ASCAST]], align 4
4573+
// AMDGCN_CL_DEF-NEXT: [[TMP8:%.*]] = load i32, ptr [[ATOMIC_TEMP2_ASCAST]], align 4
4574+
// AMDGCN_CL_DEF-NEXT: [[TMP9:%.*]] = load ptr, ptr [[A_ADDR_ASCAST]], align 8
4575+
// AMDGCN_CL_DEF-NEXT: store i32 [[TMP8]], ptr [[TMP9]], align 4
4576+
// AMDGCN_CL_DEF-NEXT: ret void
4577+
//
4578+
// AMDGCN_CL_20-LABEL: define hidden void @fi8a(
4579+
// AMDGCN_CL_20-SAME: ptr noundef [[A:%.*]], ptr noundef [[B:%.*]]) #[[ATTR0]] {
4580+
// AMDGCN_CL_20-NEXT: [[ENTRY:.*:]]
4581+
// AMDGCN_CL_20-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
4582+
// AMDGCN_CL_20-NEXT: [[B_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
4583+
// AMDGCN_CL_20-NEXT: [[DOTATOMICTMP:%.*]] = alloca i32, align 4, addrspace(5)
4584+
// AMDGCN_CL_20-NEXT: [[ATOMIC_TEMP:%.*]] = alloca i32, align 4, addrspace(5)
4585+
// AMDGCN_CL_20-NEXT: [[DOTATOMICTMP1:%.*]] = alloca i32, align 4, addrspace(5)
4586+
// AMDGCN_CL_20-NEXT: [[ATOMIC_TEMP2:%.*]] = alloca i32, align 4, addrspace(5)
4587+
// AMDGCN_CL_20-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr
4588+
// AMDGCN_CL_20-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr
4589+
// AMDGCN_CL_20-NEXT: [[DOTATOMICTMP_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTATOMICTMP]] to ptr
4590+
// AMDGCN_CL_20-NEXT: [[ATOMIC_TEMP_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[ATOMIC_TEMP]] to ptr
4591+
// AMDGCN_CL_20-NEXT: [[DOTATOMICTMP1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTATOMICTMP1]] to ptr
4592+
// AMDGCN_CL_20-NEXT: [[ATOMIC_TEMP2_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[ATOMIC_TEMP2]] to ptr
4593+
// AMDGCN_CL_20-NEXT: store ptr [[A]], ptr [[A_ADDR_ASCAST]], align 8
4594+
// AMDGCN_CL_20-NEXT: store ptr [[B]], ptr [[B_ADDR_ASCAST]], align 8
4595+
// AMDGCN_CL_20-NEXT: [[TMP0:%.*]] = load ptr, ptr [[B_ADDR_ASCAST]], align 8
4596+
// AMDGCN_CL_20-NEXT: store i32 -1, ptr [[DOTATOMICTMP_ASCAST]], align 4
4597+
// AMDGCN_CL_20-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTATOMICTMP_ASCAST]], align 4
4598+
// AMDGCN_CL_20-NEXT: [[TMP2:%.*]] = atomicrmw uinc_wrap ptr [[TMP0]], i32 [[TMP1]] syncscope("agent") monotonic, align 4, !amdgpu.no.fine.grained.memory [[META4]], !amdgpu.no.remote.memory [[META4]]
4599+
// AMDGCN_CL_20-NEXT: store i32 [[TMP2]], ptr [[ATOMIC_TEMP_ASCAST]], align 4
4600+
// AMDGCN_CL_20-NEXT: [[TMP3:%.*]] = load i32, ptr [[ATOMIC_TEMP_ASCAST]], align 4
4601+
// AMDGCN_CL_20-NEXT: [[TMP4:%.*]] = load ptr, ptr [[B_ADDR_ASCAST]], align 8
4602+
// AMDGCN_CL_20-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
4603+
// AMDGCN_CL_20-NEXT: [[TMP5:%.*]] = load ptr, ptr [[A_ADDR_ASCAST]], align 8
4604+
// AMDGCN_CL_20-NEXT: store i32 -1, ptr [[DOTATOMICTMP1_ASCAST]], align 4
4605+
// AMDGCN_CL_20-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTATOMICTMP1_ASCAST]], align 4
4606+
// AMDGCN_CL_20-NEXT: [[TMP7:%.*]] = atomicrmw udec_wrap ptr [[TMP5]], i32 [[TMP6]] syncscope("agent") monotonic, align 4, !amdgpu.no.fine.grained.memory [[META4]], !amdgpu.no.remote.memory [[META4]]
4607+
// AMDGCN_CL_20-NEXT: store i32 [[TMP7]], ptr [[ATOMIC_TEMP2_ASCAST]], align 4
4608+
// AMDGCN_CL_20-NEXT: [[TMP8:%.*]] = load i32, ptr [[ATOMIC_TEMP2_ASCAST]], align 4
4609+
// AMDGCN_CL_20-NEXT: [[TMP9:%.*]] = load ptr, ptr [[A_ADDR_ASCAST]], align 8
4610+
// AMDGCN_CL_20-NEXT: store i32 [[TMP8]], ptr [[TMP9]], align 4
4611+
// AMDGCN_CL_20-NEXT: ret void
4612+
//
4613+
// SPIRV-LABEL: define hidden spir_func void @fi8a(
4614+
// SPIRV-SAME: ptr noundef [[A:%.*]], ptr noundef [[B:%.*]]) #[[ATTR0]] {
4615+
// SPIRV-NEXT: [[ENTRY:.*:]]
4616+
// SPIRV-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8
4617+
// SPIRV-NEXT: [[B_ADDR:%.*]] = alloca ptr, align 8
4618+
// SPIRV-NEXT: [[DOTATOMICTMP:%.*]] = alloca i32, align 4
4619+
// SPIRV-NEXT: [[ATOMIC_TEMP:%.*]] = alloca i32, align 4
4620+
// SPIRV-NEXT: [[DOTATOMICTMP1:%.*]] = alloca i32, align 4
4621+
// SPIRV-NEXT: [[ATOMIC_TEMP2:%.*]] = alloca i32, align 4
4622+
// SPIRV-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 8
4623+
// SPIRV-NEXT: store ptr [[B]], ptr [[B_ADDR]], align 8
4624+
// SPIRV-NEXT: [[TMP0:%.*]] = load ptr, ptr [[B_ADDR]], align 8
4625+
// SPIRV-NEXT: store i32 -1, ptr [[DOTATOMICTMP]], align 4
4626+
// SPIRV-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTATOMICTMP]], align 4
4627+
// SPIRV-NEXT: [[TMP2:%.*]] = atomicrmw uinc_wrap ptr [[TMP0]], i32 [[TMP1]] syncscope("device") monotonic, align 4
4628+
// SPIRV-NEXT: store i32 [[TMP2]], ptr [[ATOMIC_TEMP]], align 4
4629+
// SPIRV-NEXT: [[TMP3:%.*]] = load i32, ptr [[ATOMIC_TEMP]], align 4
4630+
// SPIRV-NEXT: [[TMP4:%.*]] = load ptr, ptr [[B_ADDR]], align 8
4631+
// SPIRV-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
4632+
// SPIRV-NEXT: [[TMP5:%.*]] = load ptr, ptr [[A_ADDR]], align 8
4633+
// SPIRV-NEXT: store i32 -1, ptr [[DOTATOMICTMP1]], align 4
4634+
// SPIRV-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTATOMICTMP1]], align 4
4635+
// SPIRV-NEXT: [[TMP7:%.*]] = atomicrmw udec_wrap ptr [[TMP5]], i32 [[TMP6]] syncscope("device") monotonic, align 4
4636+
// SPIRV-NEXT: store i32 [[TMP7]], ptr [[ATOMIC_TEMP2]], align 4
4637+
// SPIRV-NEXT: [[TMP8:%.*]] = load i32, ptr [[ATOMIC_TEMP2]], align 4
4638+
// SPIRV-NEXT: [[TMP9:%.*]] = load ptr, ptr [[A_ADDR]], align 8
4639+
// SPIRV-NEXT: store i32 [[TMP8]], ptr [[TMP9]], align 4
4640+
// SPIRV-NEXT: ret void
4641+
//
4642+
void fi8a(unsigned int *a, unsigned int *b) {
4643+
*b = __scoped_atomic_uinc_wrap(b, ~0U, __ATOMIC_RELAXED, __MEMORY_SCOPE_DEVICE);
4644+
*a = __scoped_atomic_udec_wrap(a, ~0U, __ATOMIC_RELAXED, __MEMORY_SCOPE_DEVICE);
4645+
}
4646+
45424647
//.
45434648
// AMDGCN_CL_DEF: [[META3]] = !{}
45444649
//.

clang/test/CodeGenCXX/cfi-vcall-trap-recover-runtime.cpp

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111

1212
// RUN: %clang_cc1 -fsanitize=cfi-vcall -fno-sanitize-trap=cfi-vcall -fsanitize-recover=cfi-vcall -fsanitize-minimal-runtime -flto -fvisibility=hidden -triple x86_64-unknown-linux -fwhole-program-vtables -fsanitize-handler-preserve-all-regs -emit-llvm -o - %s | FileCheck --check-prefix=PRESERVE_MIN %s
1313

14-
// RUN: %clang_cc1 -fsanitize=cfi-vcall -fno-sanitize-trap=cfi-vcall -fsanitize-recover=cfi-vcall -fsanitize-minimal-runtime -flto -fvisibility=hidden -triple i386-unknown-linux -fwhole-program-vtables -fsanitize-handler-preserve-all-regs -emit-llvm -o - %s | FileCheck --check-prefix=RECOVER_MIN_I386 %s
15-
1614
// RUN: %clang_cc1 -fsanitize=cfi-vcall -fno-sanitize-trap=cfi-vcall -fsanitize-minimal-runtime -flto -fvisibility=hidden -triple x86_64-unknown-linux -fwhole-program-vtables -fsanitize-handler-preserve-all-regs -emit-llvm -o - %s | FileCheck --check-prefix=ABORT_MIN %s
1715

1816

@@ -137,25 +135,6 @@ struct S1 {
137135
// PRESERVE_MIN-NEXT: call void [[TMP3]](ptr noundef nonnull align 8 dereferenceable(8) [[TMP0]])
138136
// PRESERVE_MIN-NEXT: ret void
139137
//
140-
// RECOVER_MIN_I386-LABEL: define hidden void @_Z3s1fP2S1(
141-
// RECOVER_MIN_I386-SAME: ptr noundef [[S1:%.*]]) #[[ATTR0:[0-9]+]] {
142-
// RECOVER_MIN_I386-NEXT: [[ENTRY:.*:]]
143-
// RECOVER_MIN_I386-NEXT: [[S1_ADDR:%.*]] = alloca ptr, align 4
144-
// RECOVER_MIN_I386-NEXT: store ptr [[S1]], ptr [[S1_ADDR]], align 4
145-
// RECOVER_MIN_I386-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S1_ADDR]], align 4
146-
// RECOVER_MIN_I386-NEXT: [[VTABLE:%.*]] = load ptr, ptr [[TMP0]], align 4
147-
// RECOVER_MIN_I386-NEXT: [[TMP1:%.*]] = call i1 @llvm.type.test(ptr [[VTABLE]], metadata !"_ZTS2S1"), !nosanitize [[META6:![0-9]+]]
148-
// RECOVER_MIN_I386-NEXT: [[TMP2:%.*]] = call i1 @llvm.type.test(ptr [[VTABLE]], metadata !"all-vtables"), !nosanitize [[META6]]
149-
// RECOVER_MIN_I386-NEXT: br i1 [[TMP1]], label %[[CONT:.*]], label %[[HANDLER_CFI_CHECK_FAIL:.*]], !prof [[PROF7:![0-9]+]], !nosanitize [[META6]]
150-
// RECOVER_MIN_I386: [[HANDLER_CFI_CHECK_FAIL]]:
151-
// RECOVER_MIN_I386-NEXT: call void @__ubsan_handle_cfi_check_fail_minimal() #[[ATTR3:[0-9]+]], !nosanitize [[META6]]
152-
// RECOVER_MIN_I386-NEXT: br label %[[CONT]], !nosanitize [[META6]]
153-
// RECOVER_MIN_I386: [[CONT]]:
154-
// RECOVER_MIN_I386-NEXT: [[VFN:%.*]] = getelementptr inbounds ptr, ptr [[VTABLE]], i64 0
155-
// RECOVER_MIN_I386-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VFN]], align 4
156-
// RECOVER_MIN_I386-NEXT: call void [[TMP3]](ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]])
157-
// RECOVER_MIN_I386-NEXT: ret void
158-
//
159138
void s1f(S1 *s1) {
160139
s1->f();
161140
}
@@ -178,6 +157,3 @@ void s1f(S1 *s1) {
178157
// PRESERVE_MIN: [[META5]] = !{}
179158
// PRESERVE_MIN: [[PROF6]] = !{!"branch_weights", i32 1048575, i32 1}
180159
//.
181-
// RECOVER_MIN_I386: [[META6]] = !{}
182-
// RECOVER_MIN_I386: [[PROF7]] = !{!"branch_weights", i32 1048575, i32 1}
183-
//.

0 commit comments

Comments
 (0)