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