@@ -3649,6 +3649,41 @@ mlir::LogicalResult CIRToLLVMAtomicFetchLowering::matchAndRewrite(
36493649 return mlir::success ();
36503650}
36513651
3652+ mlir::LogicalResult CIRToLLVMAtomicTestAndSetOpLowering::matchAndRewrite (
3653+ cir::AtomicTestAndSetOp op, OpAdaptor adaptor,
3654+ mlir::ConversionPatternRewriter &rewriter) const {
3655+ mlir::LLVM::AtomicOrdering llvmOrder = getLLVMAtomicOrder (op.getMemOrder ());
3656+ llvm::StringRef llvmSyncScope =
3657+ getLLVMSyncScope (adaptor.getSyncscope ()).value_or (StringRef ());
3658+
3659+ auto one = mlir::LLVM::ConstantOp::create (rewriter, op.getLoc (),
3660+ rewriter.getI8Type (), 1 );
3661+ auto rmw = mlir::LLVM::AtomicRMWOp::create (
3662+ rewriter, op.getLoc (), mlir::LLVM::AtomicBinOp::xchg, adaptor.getPtr (),
3663+ one, llvmOrder, llvmSyncScope, adaptor.getAlignment ().value_or (0 ),
3664+ op.getIsVolatile ());
3665+ auto cmp = mlir::LLVM::ICmpOp::create (
3666+ rewriter, op.getLoc (), mlir::LLVM::ICmpPredicate::ne, one, rmw);
3667+
3668+ rewriter.replaceOp (op, cmp);
3669+ return mlir::success ();
3670+ }
3671+
3672+ mlir::LogicalResult CIRToLLVMAtomicClearOpLowering::matchAndRewrite (
3673+ cir::AtomicClearOp op, OpAdaptor adaptor,
3674+ mlir::ConversionPatternRewriter &rewriter) const {
3675+ // FIXME: add syncscope.
3676+ mlir::LLVM::AtomicOrdering llvmOrder = getLLVMAtomicOrder (op.getMemOrder ());
3677+ auto zero = mlir::LLVM::ConstantOp::create (rewriter, op.getLoc (),
3678+ rewriter.getI8Type (), 0 );
3679+ auto store = mlir::LLVM::StoreOp::create (
3680+ rewriter, op.getLoc (), zero, adaptor.getPtr (),
3681+ adaptor.getAlignment ().value_or (0 ), op.getIsVolatile (),
3682+ /* isNonTemporal=*/ false , /* isInvariantGroup=*/ false , llvmOrder);
3683+ rewriter.replaceOp (op, store);
3684+ return mlir::success ();
3685+ }
3686+
36523687mlir::LogicalResult CIRToLLVMAtomicFenceLowering::matchAndRewrite (
36533688 cir::AtomicFence op, OpAdaptor adaptor,
36543689 mlir::ConversionPatternRewriter &rewriter) const {
@@ -4605,8 +4640,10 @@ void populateCIRToLLVMConversionPatterns(
46054640 CIRToLLVMAssumeAlignedOpLowering,
46064641 CIRToLLVMAssumeOpLowering,
46074642 CIRToLLVMAssumeSepStorageOpLowering,
4643+ CIRToLLVMAtomicClearOpLowering,
46084644 CIRToLLVMAtomicCmpXchgLowering,
46094645 CIRToLLVMAtomicFetchLowering,
4646+ CIRToLLVMAtomicTestAndSetOpLowering,
46104647 CIRToLLVMAtomicXchgLowering,
46114648 CIRToLLVMAtomicFenceLowering,
46124649 CIRToLLVMBaseClassAddrOpLowering,
0 commit comments