@@ -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