[flang-commits] [flang] [llvm] [mlir] [OpenMPIRBuilder] Emit __atomic_load and __atomic_compare_exchange libcalls for complex types in atomic update (PR #92364)
Tom Eccles via flang-commits
flang-commits at lists.llvm.org
Wed Sep 25 07:08:43 PDT 2024
================
@@ -7943,6 +7943,83 @@ Value *OpenMPIRBuilder::emitRMWOpAsInstruction(Value *Src1, Value *Src2,
llvm_unreachable("Unsupported atomic update operation");
}
+std::pair<llvm::LoadInst *, llvm::AllocaInst *>
+OpenMPIRBuilder::EmitAtomicLoadLibcall(Value *X, Type *XElemTy,
+ llvm::AtomicOrdering AO,
+ uint64_t AtomicSizeInBits) {
+ LLVMContext &Ctx = Builder.getContext();
+ Type *SizedIntTy = Type::getIntNTy(Ctx, AtomicSizeInBits * 8);
+ Type *ResultTy;
+ SmallVector<Value *, 6> Args;
+ AttributeList Attr;
+ Module *M = Builder.GetInsertBlock()->getModule();
+ const DataLayout &DL = M->getDataLayout();
+ Args.push_back(ConstantInt::get(DL.getIntPtrType(Ctx), AtomicSizeInBits / 8));
+ Value *PtrVal = X;
+ PtrVal = Builder.CreateAddrSpaceCast(PtrVal, PointerType::getUnqual(Ctx));
+ Args.push_back(PtrVal);
+ llvm::AllocaInst *allocaInst = Builder.CreateAlloca(XElemTy);
+ allocaInst->setName(X->getName() + "atomic.temp.load");
+ const Align AllocaAlignment = DL.getPrefTypeAlign(SizedIntTy);
+ allocaInst->setAlignment(AllocaAlignment);
+ Args.push_back(allocaInst);
+ Constant *OrderingVal =
+ ConstantInt::get(Type::getInt32Ty(Ctx), (int)toCABI(AO));
+ Args.push_back(OrderingVal);
+ ResultTy = Type::getVoidTy(Ctx);
+ SmallVector<Type *, 6> ArgTys;
+ for (Value *Arg : Args)
+ ArgTys.push_back(Arg->getType());
+ FunctionType *FnType = FunctionType::get(ResultTy, ArgTys, false);
+ FunctionCallee LibcallFn =
+ M->getOrInsertFunction("__atomic_load", FnType, Attr);
+ CallInst *Call = Builder.CreateCall(LibcallFn, Args);
+ Call->setAttributes(Attr);
+ return std::make_pair(
+ Builder.CreateAlignedLoad(XElemTy, allocaInst, AllocaAlignment),
+ allocaInst);
+}
+
+std::pair<llvm::Value *, llvm::Value *>
+OpenMPIRBuilder::EmitAtomicCompareExchangeLibcall(
+ Value *X, Type *XElemTy, uint64_t AtomicSizeInBits,
+ llvm::Value *ExpectedVal, llvm::Value *DesiredVal,
+ llvm::AtomicOrdering Success, llvm::AtomicOrdering Failure) {
+ LLVMContext &Ctx = Builder.getContext();
+ uint64_t IntBits = 32;
+ uint16_t SizeTBits = 64;
+ uint16_t BitsPerByte = 8;
+ llvm::Value *AtomicSizeValue = llvm::ConstantInt::get(
+ llvm::IntegerType::get(Ctx, SizeTBits), AtomicSizeInBits / BitsPerByte);
+ llvm::Value *Args[6] = {
+ AtomicSizeValue,
+ X,
+ ExpectedVal,
+ DesiredVal,
+ llvm::Constant::getIntegerValue(
+ llvm::IntegerType::get(Ctx, IntBits),
+ llvm::APInt(IntBits, (uint64_t)Success, /*signed=*/true)),
+ llvm::Constant::getIntegerValue(
+ llvm::IntegerType::get(Ctx, IntBits),
+ llvm::APInt(IntBits, (uint64_t)Failure, /*signed=*/true)),
----------------
tblah wrote:
nit: c++ style casts (feel free to ignore - I can't find anything in the style guide about this)
https://github.com/llvm/llvm-project/pull/92364
More information about the flang-commits
mailing list