diff --git a/flang/include/flang/Optimizer/Builder/IntrinsicCall.h b/flang/include/flang/Optimizer/Builder/IntrinsicCall.h index 9c9c0609f4fc3..e2ea89483ef11 100644 --- a/flang/include/flang/Optimizer/Builder/IntrinsicCall.h +++ b/flang/include/flang/Optimizer/Builder/IntrinsicCall.h @@ -185,6 +185,7 @@ struct IntrinsicLibrary { mlir::Value genAnint(mlir::Type, llvm::ArrayRef); fir::ExtendedValue genAny(mlir::Type, llvm::ArrayRef); mlir::Value genAtanpi(mlir::Type, llvm::ArrayRef); + mlir::Value genAtomicAdd(mlir::Type, llvm::ArrayRef); fir::ExtendedValue genCommandArgumentCount(mlir::Type, llvm::ArrayRef); mlir::Value genAsind(mlir::Type, llvm::ArrayRef); diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp index 6a343645ab878..8aa21fbea8fd7 100644 --- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp +++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp @@ -147,6 +147,7 @@ static constexpr IntrinsicHandler handlers[]{ {"atan2pi", &I::genAtanpi}, {"atand", &I::genAtand}, {"atanpi", &I::genAtanpi}, + {"atomicaddd", &I::genAtomicAdd, {}, /*isElemental=*/false}, {"bessel_jn", &I::genBesselJn, {{{"n1", asValue}, {"n2", asValue}, {"x", asValue}}}, @@ -2574,6 +2575,15 @@ mlir::Value IntrinsicLibrary::genAtanpi(mlir::Type resultType, return builder.create(loc, atan, factor); } +mlir::Value IntrinsicLibrary::genAtomicAdd(mlir::Type resultType, + llvm::ArrayRef args) { + assert(args.size() == 2); + llvm::errs() << "In genAtomicAdd\n"; + return builder.create( + loc, mlir::LLVM::AtomicBinOp::add, args[0], args[1], + mlir::LLVM::AtomicOrdering::seq_cst); +} + // ASSOCIATED fir::ExtendedValue IntrinsicLibrary::genAssociated(mlir::Type resultType, diff --git a/flang/module/cudadevice.f90 b/flang/module/cudadevice.f90 index 3d487fd000a09..e49ca4be69e5d 100644 --- a/flang/module/cudadevice.f90 +++ b/flang/module/cudadevice.f90 @@ -92,5 +92,38 @@ attributes(device) subroutine threadfence_system() end function end interface public :: __fadd_ru - + +interface + attributes(device) real*8 function atomicaddd(address, val) + real*8, intent(inout) :: address + real*8 :: val + end function +end interface +public :: atomicaddd + + +!interface atomicadd +! attributes(device) pure integer function atomicaddi(address, val) +!!dir$ ignore_tkr (rd) address, (d) val +! integer, intent(inout) :: address +! integer, value :: val +! end function +! attributes(device) pure real function atomicaddf(address, val) +!!dir$ ignore_tkr (rd) address, (d) val +! real, intent(inout) :: address +! real, value :: val +! end function +! attributes(device) pure real*8 function atomicaddd(address, val) +!!dir$ ignore_tkr (rd) address, (d) val +! real*8, intent(inout) :: address +! real*8, value :: val +! end function +! attributes(device) pure integer(8) function atomicaddul(address, val) +!!dir$ ignore_tkr (rd) address, (dk) val +! integer(8), intent(inout) :: address +! integer(8), value :: val +! end function +!end interface +!public :: atomicadd + end module