Skip to content

Commit 35434f2

Browse files
[CIR] Upstream support for lowering cir.switch to LLVM (#140425)
This PR adds support for lowering the `cir.switch` operation to LLVM. It includes tests for lowering from `.cir` as well as end-to-end source code tests.
1 parent 30a9d9d commit 35434f2

File tree

4 files changed

+651
-1
lines changed

4 files changed

+651
-1
lines changed

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1065,6 +1065,33 @@ mlir::LogicalResult CIRToLLVMGlobalOpLowering::matchAndRewrite(
10651065
return mlir::success();
10661066
}
10671067

1068+
mlir::LogicalResult CIRToLLVMSwitchFlatOpLowering::matchAndRewrite(
1069+
cir::SwitchFlatOp op, OpAdaptor adaptor,
1070+
mlir::ConversionPatternRewriter &rewriter) const {
1071+
1072+
llvm::SmallVector<mlir::APInt, 8> caseValues;
1073+
for (mlir::Attribute val : op.getCaseValues()) {
1074+
auto intAttr = cast<cir::IntAttr>(val);
1075+
caseValues.push_back(intAttr.getValue());
1076+
}
1077+
1078+
llvm::SmallVector<mlir::Block *, 8> caseDestinations;
1079+
llvm::SmallVector<mlir::ValueRange, 8> caseOperands;
1080+
1081+
for (mlir::Block *x : op.getCaseDestinations())
1082+
caseDestinations.push_back(x);
1083+
1084+
for (mlir::OperandRange x : op.getCaseOperands())
1085+
caseOperands.push_back(x);
1086+
1087+
// Set switch op to branch to the newly created blocks.
1088+
rewriter.setInsertionPoint(op);
1089+
rewriter.replaceOpWithNewOp<mlir::LLVM::SwitchOp>(
1090+
op, adaptor.getCondition(), op.getDefaultDestination(),
1091+
op.getDefaultOperands(), caseValues, caseDestinations, caseOperands);
1092+
return mlir::success();
1093+
}
1094+
10681095
mlir::LogicalResult CIRToLLVMUnaryOpLowering::matchAndRewrite(
10691096
cir::UnaryOp op, OpAdaptor adaptor,
10701097
mlir::ConversionPatternRewriter &rewriter) const {
@@ -1681,6 +1708,7 @@ void ConvertCIRToLLVMPass::runOnOperation() {
16811708
CIRToLLVMGetGlobalOpLowering,
16821709
CIRToLLVMGetMemberOpLowering,
16831710
CIRToLLVMSelectOpLowering,
1711+
CIRToLLVMSwitchFlatOpLowering,
16841712
CIRToLLVMShiftOpLowering,
16851713
CIRToLLVMStackSaveOpLowering,
16861714
CIRToLLVMStackRestoreOpLowering,

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,16 @@ class CIRToLLVMFuncOpLowering : public mlir::OpConversionPattern<cir::FuncOp> {
149149
mlir::ConversionPatternRewriter &) const override;
150150
};
151151

152+
class CIRToLLVMSwitchFlatOpLowering
153+
: public mlir::OpConversionPattern<cir::SwitchFlatOp> {
154+
public:
155+
using mlir::OpConversionPattern<cir::SwitchFlatOp>::OpConversionPattern;
156+
157+
mlir::LogicalResult
158+
matchAndRewrite(cir::SwitchFlatOp op, OpAdaptor,
159+
mlir::ConversionPatternRewriter &) const override;
160+
};
161+
152162
class CIRToLLVMGetGlobalOpLowering
153163
: public mlir::OpConversionPattern<cir::GetGlobalOp> {
154164
public:

0 commit comments

Comments
 (0)