Skip to content

Commit ccfab4e

Browse files
committed
builder: implement pointer atomics (missing in SPIR-V) via integers.
1 parent 003dde7 commit ccfab4e

File tree

1 file changed

+25
-5
lines changed

1 file changed

+25
-5
lines changed

crates/rustc_codegen_spirv/src/builder/builder_methods.rs

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1850,7 +1850,12 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
18501850
order: AtomicOrdering,
18511851
_size: Size,
18521852
) -> Self::Value {
1853-
let (ptr, access_ty) = self.adjust_pointer_for_typed_access(ptr, ty);
1853+
// HACK(eddyb) SPIR-V lacks pointer atomics, have to use integers instead.
1854+
let atomic_ty = match self.lookup_type(ty) {
1855+
SpirvType::Pointer { .. } => self.type_usize(),
1856+
_ => ty,
1857+
};
1858+
let (ptr, access_ty) = self.adjust_pointer_for_typed_access(ptr, atomic_ty);
18541859

18551860
// TODO: Default to device scope
18561861
let memory = self.constant_u32(self.span(), Scope::Device as u32);
@@ -1988,7 +1993,12 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
19881993
order: AtomicOrdering,
19891994
_size: Size,
19901995
) {
1991-
let (ptr, access_ty) = self.adjust_pointer_for_typed_access(ptr, val.ty);
1996+
// HACK(eddyb) SPIR-V lacks pointer atomics, have to use integers instead.
1997+
let atomic_ty = match self.lookup_type(val.ty) {
1998+
SpirvType::Pointer { .. } => self.type_usize(),
1999+
_ => val.ty,
2000+
};
2001+
let (ptr, access_ty) = self.adjust_pointer_for_typed_access(ptr, atomic_ty);
19922002
let val = self.bitcast(val, access_ty);
19932003

19942004
// TODO: Default to device scope
@@ -3089,7 +3099,12 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
30893099
assert_ty_eq!(self, cmp.ty, src.ty);
30903100
let ty = src.ty;
30913101

3092-
let (dst, access_ty) = self.adjust_pointer_for_typed_access(dst, ty);
3102+
// HACK(eddyb) SPIR-V lacks pointer atomics, have to use integers instead.
3103+
let atomic_ty = match self.lookup_type(ty) {
3104+
SpirvType::Pointer { .. } => self.type_usize(),
3105+
_ => ty,
3106+
};
3107+
let (dst, access_ty) = self.adjust_pointer_for_typed_access(dst, atomic_ty);
30933108
let cmp = self.bitcast(cmp, access_ty);
30943109
let src = self.bitcast(src, access_ty);
30953110

@@ -3115,7 +3130,7 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
31153130
.with_type(access_ty);
31163131

31173132
let val = self.bitcast(result, ty);
3118-
let success = self.icmp(IntPredicate::IntEQ, val, cmp);
3133+
let success = self.icmp(IntPredicate::IntEQ, result, cmp);
31193134

31203135
(val, success)
31213136
}
@@ -3130,7 +3145,12 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
31303145
) -> Self::Value {
31313146
let ty = src.ty;
31323147

3133-
let (dst, access_ty) = self.adjust_pointer_for_typed_access(dst, ty);
3148+
// HACK(eddyb) SPIR-V lacks pointer atomics, have to use integers instead.
3149+
let atomic_ty = match self.lookup_type(ty) {
3150+
SpirvType::Pointer { .. } => self.type_usize(),
3151+
_ => ty,
3152+
};
3153+
let (dst, access_ty) = self.adjust_pointer_for_typed_access(dst, atomic_ty);
31343154
let src = self.bitcast(src, access_ty);
31353155

31363156
self.validate_atomic(access_ty, dst.def(self));

0 commit comments

Comments
 (0)