Skip to content

Commit 583666b

Browse files
committed
builder: implement pointer atomics (missing in SPIR-V) via integers.
1 parent bf3a0ee commit 583666b

1 file changed

Lines changed: 25 additions & 5 deletions

File tree

crates/rustc_codegen_spirv/src/builder/builder_methods.rs

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1894,7 +1894,12 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
18941894
order: AtomicOrdering,
18951895
_size: Size,
18961896
) -> Self::Value {
1897-
let (ptr, access_ty) = self.adjust_pointer_for_typed_access(ptr, ty);
1897+
// HACK(eddyb) SPIR-V lacks pointer atomics, have to use integers instead.
1898+
let atomic_ty = match self.lookup_type(ty) {
1899+
SpirvType::Pointer { .. } => self.type_usize(),
1900+
_ => ty,
1901+
};
1902+
let (ptr, access_ty) = self.adjust_pointer_for_typed_access(ptr, atomic_ty);
18981903

18991904
// TODO: Default to device scope
19001905
let memory = self.constant_u32(self.span(), Scope::Device as u32);
@@ -2031,7 +2036,12 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
20312036
order: AtomicOrdering,
20322037
_size: Size,
20332038
) {
2034-
let (ptr, access_ty) = self.adjust_pointer_for_typed_access(ptr, val.ty);
2039+
// HACK(eddyb) SPIR-V lacks pointer atomics, have to use integers instead.
2040+
let atomic_ty = match self.lookup_type(val.ty) {
2041+
SpirvType::Pointer { .. } => self.type_usize(),
2042+
_ => val.ty,
2043+
};
2044+
let (ptr, access_ty) = self.adjust_pointer_for_typed_access(ptr, atomic_ty);
20352045
let val = self.bitcast(val, access_ty);
20362046

20372047
// TODO: Default to device scope
@@ -3131,7 +3141,12 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
31313141
assert_ty_eq!(self, cmp.ty, src.ty);
31323142
let ty = src.ty;
31333143

3134-
let (dst, access_ty) = self.adjust_pointer_for_typed_access(dst, ty);
3144+
// HACK(eddyb) SPIR-V lacks pointer atomics, have to use integers instead.
3145+
let atomic_ty = match self.lookup_type(ty) {
3146+
SpirvType::Pointer { .. } => self.type_usize(),
3147+
_ => ty,
3148+
};
3149+
let (dst, access_ty) = self.adjust_pointer_for_typed_access(dst, atomic_ty);
31353150
let cmp = self.bitcast(cmp, access_ty);
31363151
let src = self.bitcast(src, access_ty);
31373152

@@ -3157,7 +3172,7 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
31573172
.with_type(access_ty);
31583173

31593174
let val = self.bitcast(result, ty);
3160-
let success = self.icmp(IntPredicate::IntEQ, val, cmp);
3175+
let success = self.icmp(IntPredicate::IntEQ, result, cmp);
31613176

31623177
(val, success)
31633178
}
@@ -3171,7 +3186,12 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
31713186
) -> Self::Value {
31723187
let ty = src.ty;
31733188

3174-
let (dst, access_ty) = self.adjust_pointer_for_typed_access(dst, ty);
3189+
// HACK(eddyb) SPIR-V lacks pointer atomics, have to use integers instead.
3190+
let atomic_ty = match self.lookup_type(ty) {
3191+
SpirvType::Pointer { .. } => self.type_usize(),
3192+
_ => ty,
3193+
};
3194+
let (dst, access_ty) = self.adjust_pointer_for_typed_access(dst, atomic_ty);
31753195
let src = self.bitcast(src, access_ty);
31763196

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

0 commit comments

Comments
 (0)