Skip to content

Commit 7212350

Browse files
[CIR][MLIR][Lowering] Op cir.select is lowered to arith.select. (#2033)
1 parent d025cea commit 7212350

File tree

2 files changed

+53
-8
lines changed

2 files changed

+53
-8
lines changed

clang/lib/CIR/Lowering/ThroughMLIR/LowerCIRToMLIR.cpp

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1721,6 +1721,20 @@ class CIRPtrStrideOpLowering
17211721
}
17221722
};
17231723

1724+
class CIRSelectOpLowering : public mlir::OpConversionPattern<cir::SelectOp> {
1725+
public:
1726+
using OpConversionPattern<cir::SelectOp>::OpConversionPattern;
1727+
1728+
mlir::LogicalResult
1729+
matchAndRewrite(cir::SelectOp op, OpAdaptor adaptor,
1730+
mlir::ConversionPatternRewriter &rewriter) const override {
1731+
rewriter.replaceOpWithNewOp<mlir::arith::SelectOp>(
1732+
op, adaptor.getCondition(), adaptor.getTrueValue(),
1733+
adaptor.getFalseValue());
1734+
return mlir::success();
1735+
}
1736+
};
1737+
17241738
class CIRUnreachableOpLowering
17251739
: public mlir::OpConversionPattern<cir::UnreachableOp> {
17261740
public:
@@ -1764,14 +1778,15 @@ void populateCIRToMLIRConversionPatterns(mlir::RewritePatternSet &patterns,
17641778
CIRYieldOpLowering, CIRCosOpLowering, CIRGlobalOpLowering,
17651779
CIRGetGlobalOpLowering, CIRComplexCreateOpLowering,
17661780
CIRComplexRealOpLowering, CIRComplexImagOpLowering, CIRCastOpLowering,
1767-
CIRPtrStrideOpLowering, CIRGetElementOpLowering, CIRSqrtOpLowering,
1768-
CIRCeilOpLowering, CIRExp2OpLowering, CIRExpOpLowering, CIRFAbsOpLowering,
1769-
CIRAbsOpLowering, CIRFloorOpLowering, CIRLog10OpLowering,
1770-
CIRLog2OpLowering, CIRLogOpLowering, CIRRoundOpLowering, CIRSinOpLowering,
1771-
CIRTanOpLowering, CIRShiftOpLowering, CIRBitClzOpLowering,
1772-
CIRBitCtzOpLowering, CIRBitPopcountOpLowering, CIRBitClrsbOpLowering,
1773-
CIRBitFfsOpLowering, CIRBitParityOpLowering, CIRIfOpLowering,
1774-
CIRScopeOpLowering, CIRVectorCreateLowering, CIRVectorInsertLowering,
1781+
CIRPtrStrideOpLowering, CIRSelectOpLowering, CIRGetElementOpLowering,
1782+
CIRSqrtOpLowering, CIRCeilOpLowering, CIRExp2OpLowering, CIRExpOpLowering,
1783+
CIRFAbsOpLowering, CIRAbsOpLowering, CIRFloorOpLowering,
1784+
CIRLog10OpLowering, CIRLog2OpLowering, CIRLogOpLowering,
1785+
CIRRoundOpLowering, CIRSinOpLowering, CIRTanOpLowering,
1786+
CIRShiftOpLowering, CIRBitClzOpLowering, CIRBitCtzOpLowering,
1787+
CIRBitPopcountOpLowering, CIRBitClrsbOpLowering, CIRBitFfsOpLowering,
1788+
CIRBitParityOpLowering, CIRIfOpLowering, CIRScopeOpLowering,
1789+
CIRVectorCreateLowering, CIRVectorInsertLowering,
17751790
CIRVectorExtractLowering, CIRVectorCmpOpLowering, CIRACosOpLowering,
17761791
CIRASinOpLowering, CIRUnreachableOpLowering, CIRTrapOpLowering>(
17771792
converter, patterns.getContext());
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// RUN: cir-opt %s -cir-to-mlir -o - | FileCheck %s -check-prefix=MLIR
2+
3+
!u32i = !cir.int<u, 32>
4+
module {
5+
cir.func @foo(%arg0: !u32i) -> !u32i {
6+
%0 = cir.alloca !u32i, !cir.ptr<!u32i>, ["x", init] {alignment = 4 : i64}
7+
cir.store %arg0, %0 : !u32i, !cir.ptr<!u32i>
8+
%1 = cir.const #cir.int<100> : !u32i
9+
%2 = cir.const #cir.int<10> : !u32i
10+
%3 = cir.const #cir.int<20> : !u32i
11+
%4 = cir.load %0 : !cir.ptr<!u32i>, !u32i
12+
%5 = cir.cmp(gt, %4, %1) : !u32i, !cir.bool
13+
%6 = cir.select if %5 then %1 else %2 : (!cir.bool, !u32i, !u32i) -> !u32i
14+
cir.return %6 : !u32i
15+
}
16+
}
17+
18+
// MLIR: module {
19+
// MLIR-NEXT: func.func @foo(%[[ARG0:.*]]: i32) -> i32 {
20+
// MLIR-NEXT: %[[ALLOCA:.*]] = memref.alloca() {alignment = 4 : i64} : memref<i32>
21+
// MLIR-NEXT: memref.store %[[ARG0]], %[[ALLOCA]][] : memref<i32>
22+
// MLIR-NEXT: %[[C100_I32:.*]] = arith.constant 100 : i32
23+
// MLIR-NEXT: %[[C10_I32:.*]] = arith.constant 10 : i32
24+
// MLIR-NEXT: %[[C20_I32:.*]] = arith.constant 20 : i32
25+
// MLIR-NEXT: %[[V:.*]] = memref.load %[[ALLOCA]][] : memref<i32>
26+
// MLIR-NEXT: %[[C:.*]] = arith.cmpi ugt, %[[V]], %[[C100_I32]] : i32
27+
// MLIR-NEXT: %[[OP:.*]] = arith.select %[[C]], %[[C100_I32]], %[[C10_I32]] : i32
28+
// MLIR-NEXT: return %[[OP]] : i32
29+
// MLIR-NEXT: }
30+
// MLIR-NEXT:}

0 commit comments

Comments
 (0)