Skip to content

Commit 3897030

Browse files
authored
[CIR][ThroughMLIR] Lower UnreachableOp (#1539)
This also removes some unused `#include`s. I choose to allow lowering to LLVM dialect when we're lowering CIR to MLIR core dialects, because some operations don't have their counterparts in these dialects (for example, `UnreachableOp -> llvm.unreachable` and `LLVMIntrinsicCallOp -> cir.llvm.intr.xxx`). I don't think we can delay them to the MLIR->LLVM pass as it seems we assume all CIR operations have been lowered after CIR->MLIR conversion. Co-authored-by: Yue Huang <[email protected]>
1 parent 33980c5 commit 3897030

File tree

3 files changed

+32
-22
lines changed

3 files changed

+32
-22
lines changed

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

+22-11
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
#include "mlir/Conversion/ControlFlowToLLVM/ControlFlowToLLVM.h"
1717
#include "mlir/Conversion/FuncToLLVM/ConvertFuncToLLVM.h"
1818
#include "mlir/Conversion/FuncToLLVM/ConvertFuncToLLVMPass.h"
19-
#include "mlir/Conversion/LLVMCommon/ConversionTarget.h"
20-
#include "mlir/Conversion/LLVMCommon/TypeConverter.h"
2119
#include "mlir/Conversion/MemRefToLLVM/MemRefToLLVM.h"
2220
#include "mlir/Conversion/SCFToControlFlow/SCFToControlFlow.h"
2321
#include "mlir/Dialect/Affine/IR/AffineOps.h"
@@ -28,7 +26,6 @@
2826
#include "mlir/Dialect/Math/IR/Math.h"
2927
#include "mlir/Dialect/MemRef/IR/MemRef.h"
3028
#include "mlir/Dialect/SCF/IR/SCF.h"
31-
#include "mlir/Dialect/SCF/Transforms/Passes.h"
3229
#include "mlir/Dialect/Vector/IR/VectorOps.h"
3330
#include "mlir/IR/BuiltinDialect.h"
3431
#include "mlir/IR/BuiltinTypes.h"
@@ -52,7 +49,6 @@
5249
#include "clang/CIR/LoweringHelpers.h"
5350
#include "clang/CIR/Passes.h"
5451
#include "llvm/ADT/STLExtras.h"
55-
#include "llvm/ADT/Sequence.h"
5652
#include "llvm/ADT/SmallVector.h"
5753
#include "llvm/ADT/TypeSwitch.h"
5854
#include "llvm/Support/TimeProfiler.h"
@@ -83,7 +79,7 @@ struct ConvertCIRToMLIRPass
8379
mlir::affine::AffineDialect, mlir::memref::MemRefDialect,
8480
mlir::arith::ArithDialect, mlir::cf::ControlFlowDialect,
8581
mlir::scf::SCFDialect, mlir::math::MathDialect,
86-
mlir::vector::VectorDialect>();
82+
mlir::vector::VectorDialect, mlir::LLVM::LLVMDialect>();
8783
}
8884
void runOnOperation() final;
8985

@@ -1388,6 +1384,20 @@ class CIRPtrStrideOpLowering
13881384
}
13891385
};
13901386

1387+
class CIRUnreachableOpLowering
1388+
: public mlir::OpConversionPattern<cir::UnreachableOp> {
1389+
public:
1390+
using OpConversionPattern<cir::UnreachableOp>::OpConversionPattern;
1391+
1392+
mlir::LogicalResult
1393+
matchAndRewrite(cir::UnreachableOp op, OpAdaptor adaptor,
1394+
mlir::ConversionPatternRewriter &rewriter) const override {
1395+
// match and rewrite.
1396+
rewriter.replaceOpWithNewOp<mlir::LLVM::UnreachableOp>(op);
1397+
return mlir::success();
1398+
}
1399+
};
1400+
13911401
void populateCIRToMLIRConversionPatterns(mlir::RewritePatternSet &patterns,
13921402
mlir::TypeConverter &converter) {
13931403
patterns.add<CIRReturnLowering, CIRBrOpLowering>(patterns.getContext());
@@ -1408,7 +1418,8 @@ void populateCIRToMLIRConversionPatterns(mlir::RewritePatternSet &patterns,
14081418
CIRBitClrsbOpLowering, CIRBitFfsOpLowering, CIRBitParityOpLowering,
14091419
CIRIfOpLowering, CIRVectorCreateLowering, CIRVectorInsertLowering,
14101420
CIRVectorExtractLowering, CIRVectorCmpOpLowering, CIRACosOpLowering,
1411-
CIRASinOpLowering>(converter, patterns.getContext());
1421+
CIRASinOpLowering, CIRUnreachableOpLowering>(converter,
1422+
patterns.getContext());
14121423
}
14131424

14141425
static mlir::TypeConverter prepareTypeConverter() {
@@ -1490,11 +1501,11 @@ void ConvertCIRToMLIRPass::runOnOperation() {
14901501

14911502
mlir::ConversionTarget target(getContext());
14921503
target.addLegalOp<mlir::ModuleOp>();
1493-
target
1494-
.addLegalDialect<mlir::affine::AffineDialect, mlir::arith::ArithDialect,
1495-
mlir::memref::MemRefDialect, mlir::func::FuncDialect,
1496-
mlir::scf::SCFDialect, mlir::cf::ControlFlowDialect,
1497-
mlir::math::MathDialect, mlir::vector::VectorDialect>();
1504+
target.addLegalDialect<mlir::affine::AffineDialect, mlir::arith::ArithDialect,
1505+
mlir::memref::MemRefDialect, mlir::func::FuncDialect,
1506+
mlir::scf::SCFDialect, mlir::cf::ControlFlowDialect,
1507+
mlir::math::MathDialect, mlir::vector::VectorDialect,
1508+
mlir::LLVM::LLVMDialect>();
14981509
target.addIllegalDialect<cir::CIRDialect>();
14991510

15001511
if (failed(applyPartialConversion(module, target, std::move(patterns))))

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

-11
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,12 @@
1919
#include "mlir/Conversion/LLVMCommon/TypeConverter.h"
2020
#include "mlir/Conversion/MemRefToLLVM/MemRefToLLVM.h"
2121
#include "mlir/Conversion/SCFToControlFlow/SCFToControlFlow.h"
22-
#include "mlir/Dialect/Affine/IR/AffineOps.h"
23-
#include "mlir/Dialect/Arith/IR/Arith.h"
24-
#include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h"
25-
#include "mlir/Dialect/Func/IR/FuncOps.h"
2622
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
27-
#include "mlir/Dialect/MemRef/IR/MemRef.h"
28-
#include "mlir/Dialect/SCF/IR/SCF.h"
29-
#include "mlir/Dialect/SCF/Transforms/Passes.h"
30-
#include "mlir/IR/BuiltinDialect.h"
3123
#include "mlir/Pass/Pass.h"
3224
#include "mlir/Pass/PassManager.h"
3325
#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
34-
#include "mlir/Target/LLVMIR/Export.h"
3526
#include "mlir/Transforms/DialectConversion.h"
36-
#include "clang/CIR/Dialect/IR/CIRDialect.h"
3727
#include "clang/CIR/Passes.h"
38-
#include "llvm/ADT/Sequence.h"
3928

4029
using namespace cir;
4130
using namespace llvm;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// RUN: cir-opt %s -cir-to-mlir -o - | FileCheck %s -check-prefix=MLIR
2+
3+
module {
4+
cir.func @test_unreachable() {
5+
cir.unreachable
6+
}
7+
8+
// MLIR: func.func @test_unreachable()
9+
// MLIR-NEXT: llvm.unreachable
10+
}

0 commit comments

Comments
 (0)