@@ -3647,6 +3647,41 @@ mlir::LogicalResult CIRToLLVMAtomicFetchLowering::matchAndRewrite(
36473647 return mlir::success ();
36483648}
36493649
3650+ mlir::LogicalResult CIRToLLVMAtomicTestAndSetOpLowering::matchAndRewrite (
3651+ cir::AtomicTestAndSetOp op, OpAdaptor adaptor,
3652+ mlir::ConversionPatternRewriter &rewriter) const {
3653+ mlir::LLVM::AtomicOrdering llvmOrder = getLLVMAtomicOrder (op.getMemOrder ());
3654+ llvm::StringRef llvmSyncScope =
3655+ getLLVMSyncScope (adaptor.getSyncscope ()).value_or (StringRef ());
3656+
3657+ auto one = mlir::LLVM::ConstantOp::create (rewriter, op.getLoc (),
3658+ rewriter.getI8Type (), 1 );
3659+ auto rmw = mlir::LLVM::AtomicRMWOp::create (
3660+ rewriter, op.getLoc (), mlir::LLVM::AtomicBinOp::xchg, adaptor.getPtr (),
3661+ one, llvmOrder, llvmSyncScope, adaptor.getAlignment ().value_or (0 ),
3662+ op.getIsVolatile ());
3663+ auto cmp = mlir::LLVM::ICmpOp::create (
3664+ rewriter, op.getLoc (), mlir::LLVM::ICmpPredicate::ne, one, rmw);
3665+
3666+ rewriter.replaceOp (op, cmp);
3667+ return mlir::success ();
3668+ }
3669+
3670+ mlir::LogicalResult CIRToLLVMAtomicClearOpLowering::matchAndRewrite (
3671+ cir::AtomicClearOp op, OpAdaptor adaptor,
3672+ mlir::ConversionPatternRewriter &rewriter) const {
3673+ // FIXME: add syncscope.
3674+ mlir::LLVM::AtomicOrdering llvmOrder = getLLVMAtomicOrder (op.getMemOrder ());
3675+ auto zero = mlir::LLVM::ConstantOp::create (rewriter, op.getLoc (),
3676+ rewriter.getI8Type (), 0 );
3677+ auto store = mlir::LLVM::StoreOp::create (
3678+ rewriter, op.getLoc (), zero, adaptor.getPtr (),
3679+ adaptor.getAlignment ().value_or (0 ), op.getIsVolatile (),
3680+ /* isNonTemporal=*/ false , /* isInvariantGroup=*/ false , llvmOrder);
3681+ rewriter.replaceOp (op, store);
3682+ return mlir::success ();
3683+ }
3684+
36503685mlir::LogicalResult CIRToLLVMAtomicFenceLowering::matchAndRewrite (
36513686 cir::AtomicFence op, OpAdaptor adaptor,
36523687 mlir::ConversionPatternRewriter &rewriter) const {
@@ -4603,8 +4638,10 @@ void populateCIRToLLVMConversionPatterns(
46034638 CIRToLLVMAssumeAlignedOpLowering,
46044639 CIRToLLVMAssumeOpLowering,
46054640 CIRToLLVMAssumeSepStorageOpLowering,
4641+ CIRToLLVMAtomicClearOpLowering,
46064642 CIRToLLVMAtomicCmpXchgLowering,
46074643 CIRToLLVMAtomicFetchLowering,
4644+ CIRToLLVMAtomicTestAndSetOpLowering,
46084645 CIRToLLVMAtomicXchgLowering,
46094646 CIRToLLVMAtomicFenceLowering,
46104647 CIRToLLVMBaseClassAddrOpLowering,
0 commit comments