@@ -2890,23 +2890,21 @@ CGOpenMPRuntimeGPU::emitFastFPAtomicCall(CodeGenFunction &CGF, LValue X,
28902890 RValue Update, BinaryOperatorKind BO,
28912891 bool IsXBinopExpr) {
28922892 CGBuilderTy &Bld = CGF.Builder ;
2893- unsigned int IID = - 1 ;
2893+ llvm::AtomicRMWInst::BinOp Kind = llvm::AtomicRMWInst::FAdd ;
28942894 RValue UpdateFixed = Update;
28952895 switch (BO) {
28962896 case BO_Sub:
28972897 UpdateFixed = RValue::get (Bld.CreateFNeg (Update.getScalarVal ()));
2898- IID = llvm::Intrinsic::amdgcn_flat_atomic_fadd ;
2898+ Kind = llvm::AtomicRMWInst::FAdd ;
28992899 break ;
29002900 case BO_Add:
2901- IID = llvm::Intrinsic::amdgcn_flat_atomic_fadd ;
2901+ Kind = llvm::AtomicRMWInst::FAdd ;
29022902 break ;
29032903 case BO_LT:
2904- IID = IsXBinopExpr ? llvm::Intrinsic::amdgcn_flat_atomic_fmax
2905- : llvm::Intrinsic::amdgcn_flat_atomic_fmin;
2904+ Kind = IsXBinopExpr ? llvm::AtomicRMWInst::FMax : llvm::AtomicRMWInst::FMin;
29062905 break ;
29072906 case BO_GT:
2908- IID = IsXBinopExpr ? llvm::Intrinsic::amdgcn_flat_atomic_fmin
2909- : llvm::Intrinsic::amdgcn_flat_atomic_fmax;
2907+ Kind = IsXBinopExpr ? llvm::AtomicRMWInst::FMin : llvm::AtomicRMWInst::FMax;
29102908 break ;
29112909 default :
29122910 // remaining operations are not supported yet
@@ -2930,10 +2928,9 @@ CGOpenMPRuntimeGPU::emitFastFPAtomicCall(CodeGenFunction &CGF, LValue X,
29302928 CGM.getModule (), OMPRTL___kmpc_unsafeAtomicAdd),
29312929 FPAtomicArgs);
29322930 } else {
2933- llvm::Function *AtomicF = CGM.getIntrinsic (
2934- IID, {FPAtomicArgs[1 ]->getType (), FPAtomicArgs[0 ]->getType (),
2935- FPAtomicArgs[1 ]->getType ()});
2936- CallInst = CGF.EmitNounwindRuntimeCall (AtomicF, FPAtomicArgs);
2931+ CallInst =
2932+ Bld.CreateAtomicRMW (Kind, X.getAddress (), FPAtomicArgs[1 ],
2933+ llvm::AtomicOrdering::SequentiallyConsistent);
29372934 }
29382935 return std::make_pair (true , RValue::get (CallInst));
29392936}
0 commit comments