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