diff --git a/clang/lib/CIR/Lowering/ThroughMLIR/LowerCIRToMLIR.cpp b/clang/lib/CIR/Lowering/ThroughMLIR/LowerCIRToMLIR.cpp index 5b4ec9c5cf16..4ddf32a583ec 100644 --- a/clang/lib/CIR/Lowering/ThroughMLIR/LowerCIRToMLIR.cpp +++ b/clang/lib/CIR/Lowering/ThroughMLIR/LowerCIRToMLIR.cpp @@ -1642,6 +1642,20 @@ class CIRPtrStrideOpLowering } }; +class CIRSelectOpLowering : public mlir::OpConversionPattern { +public: + using OpConversionPattern::OpConversionPattern; + + mlir::LogicalResult + matchAndRewrite(cir::SelectOp op, OpAdaptor adaptor, + mlir::ConversionPatternRewriter &rewriter) const override { + rewriter.replaceOpWithNewOp( + op, adaptor.getCondition(), adaptor.getTrueValue(), + adaptor.getFalseValue()); + return mlir::success(); + } +}; + class CIRUnreachableOpLowering : public mlir::OpConversionPattern { public: @@ -1685,14 +1699,15 @@ void populateCIRToMLIRConversionPatterns(mlir::RewritePatternSet &patterns, CIRYieldOpLowering, CIRCosOpLowering, CIRGlobalOpLowering, CIRGetGlobalOpLowering, CIRComplexCreateOpLowering, CIRComplexRealOpLowering, CIRComplexImagOpLowering, CIRCastOpLowering, - CIRPtrStrideOpLowering, CIRGetElementOpLowering, CIRSqrtOpLowering, - CIRCeilOpLowering, CIRExp2OpLowering, CIRExpOpLowering, CIRFAbsOpLowering, - CIRAbsOpLowering, CIRFloorOpLowering, CIRLog10OpLowering, - CIRLog2OpLowering, CIRLogOpLowering, CIRRoundOpLowering, CIRSinOpLowering, - CIRTanOpLowering, CIRShiftOpLowering, CIRBitClzOpLowering, - CIRBitCtzOpLowering, CIRBitPopcountOpLowering, CIRBitClrsbOpLowering, - CIRBitFfsOpLowering, CIRBitParityOpLowering, CIRIfOpLowering, - CIRScopeOpLowering, CIRVectorCreateLowering, CIRVectorInsertLowering, + CIRPtrStrideOpLowering, CIRSelectOpLowering, CIRGetElementOpLowering, + CIRSqrtOpLowering, CIRCeilOpLowering, CIRExp2OpLowering, CIRExpOpLowering, + CIRFAbsOpLowering, CIRAbsOpLowering, CIRFloorOpLowering, + CIRLog10OpLowering, CIRLog2OpLowering, CIRLogOpLowering, + CIRRoundOpLowering, CIRSinOpLowering, CIRTanOpLowering, + CIRShiftOpLowering, CIRBitClzOpLowering, CIRBitCtzOpLowering, + CIRBitPopcountOpLowering, CIRBitClrsbOpLowering, CIRBitFfsOpLowering, + CIRBitParityOpLowering, CIRIfOpLowering, CIRScopeOpLowering, + CIRVectorCreateLowering, CIRVectorInsertLowering, CIRVectorExtractLowering, CIRVectorCmpOpLowering, CIRACosOpLowering, CIRASinOpLowering, CIRUnreachableOpLowering, CIRTrapOpLowering>( converter, patterns.getContext()); diff --git a/clang/test/CIR/Lowering/ThroughMLIR/select.cir b/clang/test/CIR/Lowering/ThroughMLIR/select.cir new file mode 100644 index 000000000000..c74acb99dbd2 --- /dev/null +++ b/clang/test/CIR/Lowering/ThroughMLIR/select.cir @@ -0,0 +1,30 @@ +// RUN: cir-opt %s -cir-to-mlir -o - | FileCheck %s -check-prefix=MLIR + +!u32i = !cir.int +module { + cir.func @foo(%arg0: !u32i) -> !u32i { + %0 = cir.alloca !u32i, !cir.ptr, ["x", init] {alignment = 4 : i64} + cir.store %arg0, %0 : !u32i, !cir.ptr + %1 = cir.const #cir.int<100> : !u32i + %2 = cir.const #cir.int<10> : !u32i + %3 = cir.const #cir.int<20> : !u32i + %4 = cir.load %0 : !cir.ptr, !u32i + %5 = cir.cmp(gt, %4, %1) : !u32i, !cir.bool + %6 = cir.select if %5 then %1 else %2 : (!cir.bool, !u32i, !u32i) -> !u32i + cir.return %6 : !u32i + } +} + +// MLIR: module { +// MLIR-NEXT: func.func @foo(%[[ARG0:.*]]: i32) -> i32 { +// MLIR-NEXT: %[[ALLOCA:.*]] = memref.alloca() {alignment = 4 : i64} : memref +// MLIR-NEXT: memref.store %[[ARG0]], %[[ALLOCA]][] : memref +// MLIR-NEXT: %[[C100_I32:.*]] = arith.constant 100 : i32 +// MLIR-NEXT: %[[C10_I32:.*]] = arith.constant 10 : i32 +// MLIR-NEXT: %[[C20_I32:.*]] = arith.constant 20 : i32 +// MLIR-NEXT: %[[V:.*]] = memref.load %[[ALLOCA]][] : memref +// MLIR-NEXT: %[[C:.*]] = arith.cmpi ugt, %[[V]], %[[C100_I32]] : i32 +// MLIR-NEXT: %[[OP:.*]] = arith.select %[[C]], %[[C100_I32]], %[[C10_I32]] : i32 +// MLIR-NEXT: return %[[OP]] : i32 +// MLIR-NEXT: } +// MLIR-NEXT:}