https://github.com/andykaylor updated https://github.com/llvm/llvm-project/pull/127835
>From a03e9a97e90e2bb0fe22903cc15f35cbf71f94d2 Mon Sep 17 00:00:00 2001 From: Andy Kaylor <akay...@nvidia.com> Date: Fri, 14 Feb 2025 17:30:54 -0800 Subject: [PATCH 1/2] [CIR] Initial implementation of lowering CIR to MLIR Add support for lowering CIR to MLIR and emitting an MLIR text file. Lowering of global pointers is not yet supported. --- clang/include/clang/CIR/CIRGenerator.h | 1 + .../clang/CIR/FrontendAction/CIRGenAction.h | 8 + clang/include/clang/CIR/LowerToLLVM.h | 4 + clang/include/clang/Driver/Options.td | 2 + .../include/clang/Frontend/FrontendOptions.h | 3 + clang/lib/CIR/FrontendAction/CIRGenAction.cpp | 17 ++ clang/lib/CIR/FrontendAction/CMakeLists.txt | 1 + clang/lib/CIR/Lowering/CMakeLists.txt | 1 + .../CIR/Lowering/ThroughMLIR/CMakeLists.txt | 16 ++ .../Lowering/ThroughMLIR/LowerCIRToMLIR.cpp | 201 ++++++++++++++++++ clang/lib/Frontend/CompilerInvocation.cpp | 2 + .../ExecuteCompilerInvocation.cpp | 6 + .../CIR/Lowering/ThroughMLIR/global-ptrs.cpp | 29 +++ .../test/CIR/Lowering/ThroughMLIR/global.cpp | 79 +++++++ 14 files changed, 370 insertions(+) create mode 100644 clang/lib/CIR/Lowering/ThroughMLIR/CMakeLists.txt create mode 100644 clang/lib/CIR/Lowering/ThroughMLIR/LowerCIRToMLIR.cpp create mode 100644 clang/test/CIR/Lowering/ThroughMLIR/global-ptrs.cpp create mode 100644 clang/test/CIR/Lowering/ThroughMLIR/global.cpp diff --git a/clang/include/clang/CIR/CIRGenerator.h b/clang/include/clang/CIR/CIRGenerator.h index 414eba80b88b8..76b662c68615c 100644 --- a/clang/include/clang/CIR/CIRGenerator.h +++ b/clang/include/clang/CIR/CIRGenerator.h @@ -55,6 +55,7 @@ class CIRGenerator : public clang::ASTConsumer { void Initialize(clang::ASTContext &astContext) override; bool HandleTopLevelDecl(clang::DeclGroupRef group) override; mlir::ModuleOp getModule() const; + mlir::MLIRContext &getContext() { return *mlirContext; } }; } // namespace cir diff --git a/clang/include/clang/CIR/FrontendAction/CIRGenAction.h b/clang/include/clang/CIR/FrontendAction/CIRGenAction.h index 99495f4718c5f..1ffffac1719c4 100644 --- a/clang/include/clang/CIR/FrontendAction/CIRGenAction.h +++ b/clang/include/clang/CIR/FrontendAction/CIRGenAction.h @@ -29,6 +29,7 @@ class CIRGenAction : public clang::ASTFrontendAction { EmitCIR, EmitLLVM, EmitBC, + EmitMLIR, EmitObj, }; @@ -59,6 +60,13 @@ class EmitCIRAction : public CIRGenAction { EmitCIRAction(mlir::MLIRContext *MLIRCtx = nullptr); }; +class EmitMLIRAction : public CIRGenAction { + virtual void anchor(); + +public: + EmitMLIRAction(mlir::MLIRContext *MLIRCtx = nullptr); +}; + class EmitLLVMAction : public CIRGenAction { virtual void anchor(); diff --git a/clang/include/clang/CIR/LowerToLLVM.h b/clang/include/clang/CIR/LowerToLLVM.h index 6e1b0270fcd2b..e780a5a747730 100644 --- a/clang/include/clang/CIR/LowerToLLVM.h +++ b/clang/include/clang/CIR/LowerToLLVM.h @@ -20,6 +20,7 @@ class Module; } // namespace llvm namespace mlir { +class MLIRContext; class ModuleOp; } // namespace mlir @@ -30,6 +31,9 @@ std::unique_ptr<llvm::Module> lowerDirectlyFromCIRToLLVMIR(mlir::ModuleOp mlirModule, llvm::LLVMContext &llvmCtx); } // namespace direct + +mlir::ModuleOp lowerFromCIRToMLIR(mlir::ModuleOp mlirModule, + mlir::MLIRContext &mlirCtx); } // namespace cir #endif // CLANG_CIR_LOWERTOLLVM_H diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 5ad187926e710..c8509e6f1529f 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2958,6 +2958,8 @@ defm clangir : BoolFOption<"clangir", BothFlags<[], [ClangOption, CC1Option], "">>; def emit_cir : Flag<["-"], "emit-cir">, Visibility<[ClangOption, CC1Option]>, Group<Action_Group>, HelpText<"Build ASTs and then lower to ClangIR">; +def emit_cir_mlir : Flag<["-"], "emit-cir-mlir">, Visibility<[CC1Option]>, Group<Action_Group>, + HelpText<"Build ASTs and then lower through ClangIR to MLIR, emit the .milr file">; /// ClangIR-specific options - END def flto_EQ : Joined<["-"], "flto=">, diff --git a/clang/include/clang/Frontend/FrontendOptions.h b/clang/include/clang/Frontend/FrontendOptions.h index 99b2d9a98ed1f..e15ce247d1e6e 100644 --- a/clang/include/clang/Frontend/FrontendOptions.h +++ b/clang/include/clang/Frontend/FrontendOptions.h @@ -68,6 +68,9 @@ enum ActionKind { /// Emit a .cir file EmitCIR, + /// Emit a .mlir file + EmitMLIR, + /// Emit a .ll file. EmitLLVM, diff --git a/clang/lib/CIR/FrontendAction/CIRGenAction.cpp b/clang/lib/CIR/FrontendAction/CIRGenAction.cpp index 0f686a36b982b..74f795e7e3307 100644 --- a/clang/lib/CIR/FrontendAction/CIRGenAction.cpp +++ b/clang/lib/CIR/FrontendAction/CIRGenAction.cpp @@ -24,6 +24,7 @@ static BackendAction getBackendActionFromOutputType(CIRGenAction::OutputType Action) { switch (Action) { case CIRGenAction::OutputType::EmitCIR: + case CIRGenAction::OutputType::EmitMLIR: assert(false && "Unsupported output type for getBackendActionFromOutputType!"); break; // Unreachable, but fall through to report that @@ -82,6 +83,7 @@ class CIRGenConsumer : public clang::ASTConsumer { void HandleTranslationUnit(ASTContext &C) override { Gen->HandleTranslationUnit(C); mlir::ModuleOp MlirModule = Gen->getModule(); + mlir::MLIRContext &MlirCtx = Gen->getContext(); switch (Action) { case CIRGenAction::OutputType::EmitCIR: if (OutputStream && MlirModule) { @@ -90,6 +92,15 @@ class CIRGenConsumer : public clang::ASTConsumer { MlirModule->print(*OutputStream, Flags); } break; + case CIRGenAction::OutputType::EmitMLIR: { + auto LoweredMlirModule = lowerFromCIRToMLIR(MlirModule, MlirCtx); + assert(OutputStream && "No output stream when lowering to MLIR!"); + // FIXME: we cannot roundtrip prettyForm=true right now. + mlir::OpPrintingFlags Flags; + Flags.enableDebugInfo(/*enable=*/true, /*prettyForm=*/false); + LoweredMlirModule->print(*OutputStream, Flags); + break; + } case CIRGenAction::OutputType::EmitLLVM: case CIRGenAction::OutputType::EmitBC: case CIRGenAction::OutputType::EmitObj: @@ -124,6 +135,8 @@ getOutputStream(CompilerInstance &CI, StringRef InFile, return CI.createDefaultOutputFile(false, InFile, "s"); case CIRGenAction::OutputType::EmitCIR: return CI.createDefaultOutputFile(false, InFile, "cir"); + case CIRGenAction::OutputType::EmitMLIR: + return CI.createDefaultOutputFile(false, InFile, "mlir"); case CIRGenAction::OutputType::EmitLLVM: return CI.createDefaultOutputFile(false, InFile, "ll"); case CIRGenAction::OutputType::EmitBC: @@ -155,6 +168,10 @@ void EmitCIRAction::anchor() {} EmitCIRAction::EmitCIRAction(mlir::MLIRContext *MLIRCtx) : CIRGenAction(OutputType::EmitCIR, MLIRCtx) {} +void EmitMLIRAction::anchor() {} +EmitMLIRAction::EmitMLIRAction(mlir::MLIRContext *MLIRCtx) + : CIRGenAction(OutputType::EmitMLIR, MLIRCtx) {} + void EmitLLVMAction::anchor() {} EmitLLVMAction::EmitLLVMAction(mlir::MLIRContext *MLIRCtx) : CIRGenAction(OutputType::EmitLLVM, MLIRCtx) {} diff --git a/clang/lib/CIR/FrontendAction/CMakeLists.txt b/clang/lib/CIR/FrontendAction/CMakeLists.txt index ac2b857239d07..e22013575b3c9 100644 --- a/clang/lib/CIR/FrontendAction/CMakeLists.txt +++ b/clang/lib/CIR/FrontendAction/CMakeLists.txt @@ -13,6 +13,7 @@ add_clang_library(clangCIRFrontendAction clangFrontend clangCIR clangCIRLoweringDirectToLLVM + clangCIRLoweringThroughMLIR clangCodeGen MLIRCIR MLIRIR diff --git a/clang/lib/CIR/Lowering/CMakeLists.txt b/clang/lib/CIR/Lowering/CMakeLists.txt index 95c304ded9183..f720e597ecb0f 100644 --- a/clang/lib/CIR/Lowering/CMakeLists.txt +++ b/clang/lib/CIR/Lowering/CMakeLists.txt @@ -1 +1,2 @@ add_subdirectory(DirectToLLVM) +add_subdirectory(ThroughMLIR) diff --git a/clang/lib/CIR/Lowering/ThroughMLIR/CMakeLists.txt b/clang/lib/CIR/Lowering/ThroughMLIR/CMakeLists.txt new file mode 100644 index 0000000000000..81fc9703ff0ae --- /dev/null +++ b/clang/lib/CIR/Lowering/ThroughMLIR/CMakeLists.txt @@ -0,0 +1,16 @@ +set(LLVM_LINK_COMPONENTS + Core + Support + ) + +get_property(dialect_libs GLOBAL PROPERTY MLIR_DIALECT_LIBS) + +add_clang_library(clangCIRLoweringThroughMLIR + LowerCIRToMLIR.cpp + + DEPENDS + LINK_LIBS + MLIRIR + ${dialect_libs} + MLIRCIR +) diff --git a/clang/lib/CIR/Lowering/ThroughMLIR/LowerCIRToMLIR.cpp b/clang/lib/CIR/Lowering/ThroughMLIR/LowerCIRToMLIR.cpp new file mode 100644 index 0000000000000..53ec01a22f781 --- /dev/null +++ b/clang/lib/CIR/Lowering/ThroughMLIR/LowerCIRToMLIR.cpp @@ -0,0 +1,201 @@ +//====- LowerCIRToMLIR.cpp - Lowering from CIR to MLIR --------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file implements lowering of CIR operations to MLIR. +// +//===----------------------------------------------------------------------===// + +#include "mlir/Dialect/MemRef/IR/MemRef.h" +#include "mlir/IR/BuiltinDialect.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Pass/PassManager.h" +#include "mlir/Transforms/DialectConversion.h" +#include "clang/CIR/Dialect/IR/CIRDialect.h" +#include "clang/CIR/Dialect/IR/CIRTypes.h" +#include "clang/CIR/LowerToLLVM.h" +#include "clang/CIR/MissingFeatures.h" +#include "llvm/ADT/TypeSwitch.h" +#include "llvm/Support/TimeProfiler.h" + +using namespace cir; +using namespace llvm; + +namespace cir { + +struct ConvertCIRToMLIRPass + : public mlir::PassWrapper<ConvertCIRToMLIRPass, + mlir::OperationPass<mlir::ModuleOp>> { + void getDependentDialects(mlir::DialectRegistry ®istry) const override { + registry.insert<mlir::BuiltinDialect, mlir::memref::MemRefDialect>(); + } + void runOnOperation() final; + + StringRef getDescription() const override { + return "Convert the CIR dialect module to MLIR standard dialects"; + } + + StringRef getArgument() const override { return "cir-to-mlir"; } +}; + +class CIRGlobalOpLowering : public mlir::OpConversionPattern<cir::GlobalOp> { +public: + using OpConversionPattern<cir::GlobalOp>::OpConversionPattern; + mlir::LogicalResult + matchAndRewrite(cir::GlobalOp op, OpAdaptor adaptor, + mlir::ConversionPatternRewriter &rewriter) const override { + auto moduleOp = op->getParentOfType<mlir::ModuleOp>(); + if (!moduleOp) + return mlir::failure(); + + mlir::OpBuilder b(moduleOp.getContext()); + + const auto cirSymType = op.getSymType(); + assert(!cir::MissingFeatures::convertTypeForMemory()); + auto convertedType = getTypeConverter()->convertType(cirSymType); + if (!convertedType) + return mlir::failure(); + auto memrefType = dyn_cast<mlir::MemRefType>(convertedType); + if (!memrefType) + memrefType = mlir::MemRefType::get({}, convertedType); + // Add an optional alignment to the global memref. + assert(!cir::MissingFeatures::opGlobalAlignment()); + mlir::IntegerAttr memrefAlignment = mlir::IntegerAttr(); + // Add an optional initial value to the global memref. + mlir::Attribute initialValue = mlir::Attribute(); + std::optional<mlir::Attribute> init = op.getInitialValue(); + if (init.has_value()) { + initialValue = + llvm::TypeSwitch<mlir::Attribute, mlir::Attribute>(init.value()) + .Case<cir::IntAttr>([&](cir::IntAttr attr) { + auto rtt = mlir::RankedTensorType::get({}, convertedType); + return mlir::DenseIntElementsAttr::get(rtt, attr.getValue()); + }) + .Case<cir::FPAttr>([&](cir::FPAttr attr) { + auto rtt = mlir::RankedTensorType::get({}, convertedType); + return mlir::DenseFPElementsAttr::get(rtt, attr.getValue()); + }) + .Default([&](mlir::Attribute attr) { + llvm_unreachable("GlobalOp lowering with initial value is not " + "fully supported yet"); + return mlir::Attribute(); + }); + } + + // Add symbol visibility + assert(!cir::MissingFeatures::opGlobalLinkage()); + std::string symVisibility = "public"; + + assert(!cir::MissingFeatures::opGlobalConstant()); + bool isConstant = false; + + rewriter.replaceOpWithNewOp<mlir::memref::GlobalOp>( + op, b.getStringAttr(op.getSymName()), + /*sym_visibility=*/b.getStringAttr(symVisibility), + /*type=*/memrefType, initialValue, + /*constant=*/isConstant, + /*alignment=*/memrefAlignment); + + return mlir::success(); + } +}; + +void populateCIRToMLIRConversionPatterns(mlir::RewritePatternSet &patterns, + mlir::TypeConverter &converter) { + patterns.add<CIRGlobalOpLowering>(converter, patterns.getContext()); +} + +static mlir::TypeConverter prepareTypeConverter() { + mlir::TypeConverter converter; + converter.addConversion([&](cir::PointerType type) -> mlir::Type { + assert(!cir::MissingFeatures::convertTypeForMemory()); + mlir::Type ty = converter.convertType(type.getPointee()); + // FIXME: The pointee type might not be converted (e.g. struct) + if (!ty) + return nullptr; + return mlir::MemRefType::get({}, ty); + }); + converter.addConversion( + [&](mlir::IntegerType type) -> mlir::Type { return type; }); + converter.addConversion( + [&](mlir::FloatType type) -> mlir::Type { return type; }); + converter.addConversion([&](cir::VoidType type) -> mlir::Type { return {}; }); + converter.addConversion([&](cir::IntType type) -> mlir::Type { + // arith dialect ops doesn't take signed integer -- drop cir sign here + return mlir::IntegerType::get( + type.getContext(), type.getWidth(), + mlir::IntegerType::SignednessSemantics::Signless); + }); + converter.addConversion([&](cir::SingleType type) -> mlir::Type { + return mlir::Float32Type::get(type.getContext()); + }); + converter.addConversion([&](cir::DoubleType type) -> mlir::Type { + return mlir::Float64Type::get(type.getContext()); + }); + converter.addConversion([&](cir::FP80Type type) -> mlir::Type { + return mlir::Float80Type::get(type.getContext()); + }); + converter.addConversion([&](cir::LongDoubleType type) -> mlir::Type { + return converter.convertType(type.getUnderlying()); + }); + converter.addConversion([&](cir::FP128Type type) -> mlir::Type { + return mlir::Float128Type::get(type.getContext()); + }); + converter.addConversion([&](cir::FP16Type type) -> mlir::Type { + return mlir::Float16Type::get(type.getContext()); + }); + converter.addConversion([&](cir::BF16Type type) -> mlir::Type { + return mlir::BFloat16Type::get(type.getContext()); + }); + + return converter; +} + +void ConvertCIRToMLIRPass::runOnOperation() { + auto module = getOperation(); + + auto converter = prepareTypeConverter(); + + mlir::RewritePatternSet patterns(&getContext()); + + populateCIRToMLIRConversionPatterns(patterns, converter); + + mlir::ConversionTarget target(getContext()); + target.addLegalOp<mlir::ModuleOp>(); + target.addLegalDialect<mlir::memref::MemRefDialect>(); + target.addIllegalDialect<cir::CIRDialect>(); + + if (failed(applyPartialConversion(module, target, std::move(patterns)))) + signalPassFailure(); +} + +std::unique_ptr<mlir::Pass> createConvertCIRToMLIRPass() { + return std::make_unique<ConvertCIRToMLIRPass>(); +} + +mlir::ModuleOp lowerFromCIRToMLIR(mlir::ModuleOp mlirModule, + mlir::MLIRContext &mlirCtx) { + llvm::TimeTraceScope scope("Lower CIR To MLIR"); + + mlir::PassManager pm(&mlirCtx); + + pm.addPass(createConvertCIRToMLIRPass()); + + auto result = !mlir::failed(pm.run(mlirModule)); + if (!result) + llvm::report_fatal_error( + "The pass manager failed to lower CIR to MLIR standard dialects!"); + + // Now that we ran all the lowering passes, verify the final output. + if (mlirModule.verify().failed()) + llvm::report_fatal_error( + "Verification of the final MLIR in standard dialects failed!"); + + return mlirModule; +} + +} // namespace cir diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 4eb743acf327f..58fdad192056f 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -2740,6 +2740,7 @@ static const auto &getFrontendActionTable() { {frontend::EmitAssembly, OPT_S}, {frontend::EmitBC, OPT_emit_llvm_bc}, {frontend::EmitCIR, OPT_emit_cir}, + {frontend::EmitMLIR, OPT_emit_cir_mlir}, {frontend::EmitHTML, OPT_emit_html}, {frontend::EmitLLVM, OPT_emit_llvm}, {frontend::EmitLLVMOnly, OPT_emit_llvm_only}, @@ -4631,6 +4632,7 @@ static bool isStrictlyPreprocessorAction(frontend::ActionKind Action) { case frontend::EmitAssembly: case frontend::EmitBC: case frontend::EmitCIR: + case frontend::EmitMLIR: case frontend::EmitHTML: case frontend::EmitLLVM: case frontend::EmitLLVMOnly: diff --git a/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp index bb3bb0aac78bf..ec0949c2b6941 100644 --- a/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp +++ b/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp @@ -79,6 +79,12 @@ CreateFrontendBaseAction(CompilerInstance &CI) { return std::make_unique<cir::EmitCIRAction>(); #else llvm_unreachable("CIR suppport not built into clang"); +#endif + case EmitMLIR: +#if CLANG_ENABLE_CIR + return std::make_unique<cir::EmitMLIRAction>(); +#else + llvm_unreachable("CIR suppport not built into clang"); #endif case EmitHTML: return std::make_unique<HTMLPrintAction>(); case EmitLLVM: { diff --git a/clang/test/CIR/Lowering/ThroughMLIR/global-ptrs.cpp b/clang/test/CIR/Lowering/ThroughMLIR/global-ptrs.cpp new file mode 100644 index 0000000000000..ada6a17896dfa --- /dev/null +++ b/clang/test/CIR/Lowering/ThroughMLIR/global-ptrs.cpp @@ -0,0 +1,29 @@ +// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir-mlir %s -o %t.mlir +// RUN: FileCheck --input-file=%t.mlir %s + +// XFAIL: * + +// Note: This is here to track the failed lowering of global pointers. When +// this test starts passing, the checks should be updated with more +// specifics. + +void *vp; +// CHECK: memref.global "public" @vp + +int *ip = 0; +// CHECK: memref.global "public" @ip + +double *dp; +// CHECK: memref.global "public" @dp + +char **cpp; +// CHECK: memref.global "public" @cpp + +void (*fp)(); +// CHECK: memref.global "public" @fp + +int (*fpii)(int) = 0; +// CHECK: memref.global "public" @fpii + +void (*fpvar)(int, ...); +// CHECK: memref.global "public" @fpvar diff --git a/clang/test/CIR/Lowering/ThroughMLIR/global.cpp b/clang/test/CIR/Lowering/ThroughMLIR/global.cpp new file mode 100644 index 0000000000000..4515d68aa177d --- /dev/null +++ b/clang/test/CIR/Lowering/ThroughMLIR/global.cpp @@ -0,0 +1,79 @@ +// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir-mlir %s -o %t.mlir +// RUN: FileCheck --input-file=%t.mlir %s + +char c; +// CHECK: memref.global "public" @c : memref<i8> + +signed char sc; +// CHECK: memref.global "public" @sc : memref<i8> + +unsigned char uc; +// CHECK: memref.global "public" @uc : memref<i8> + +short ss; +// CHECK: memref.global "public" @ss : memref<i16> + +unsigned short us = 100; +// CHECK: memref.global "public" @us : memref<i16> = dense<100> + +int si = 42; +// CHECK: memref.global "public" @si : memref<i32> = dense<42> + +unsigned ui; +// CHECK: memref.global "public" @ui : memref<i32> + +long sl; +// CHECK: memref.global "public" @sl : memref<i64> + +unsigned long ul; +// CHECK: memref.global "public" @ul : memref<i64> + +long long sll; +// CHECK: memref.global "public" @sll : memref<i64> + +unsigned long long ull = 123456; +// CHECK: memref.global "public" @ull : memref<i64> = dense<123456> + +__int128 s128; +// CHECK: memref.global "public" @s128 : memref<i128> + +unsigned __int128 u128; +// CHECK: memref.global "public" @u128 : memref<i128> + +wchar_t wc; +// CHECK: memref.global "public" @wc : memref<i32> + +char8_t c8; +// CHECK: memref.global "public" @c8 : memref<i8> + +char16_t c16; +// CHECK: memref.global "public" @c16 : memref<i16> + +char32_t c32; +// CHECK: memref.global "public" @c32 : memref<i32> + +_BitInt(20) sb20; +// CHECK: memref.global "public" @sb20 : memref<i20> + +unsigned _BitInt(48) ub48; +// CHECK: memref.global "public" @ub48 : memref<i48> + +_Float16 f16; +// CHECK: memref.global "public" @f16 : memref<f16> + +__bf16 bf16; +// CHECK: memref.global "public" @bf16 : memref<bf16> + +float f; +// CHECK: memref.global "public" @f : memref<f32> + +double d = 1.25; +// CHECK: memref.global "public" @d : memref<f64> = dense<1.250000e+00> + +long double ld; +// CHECK: memref.global "public" @ld : memref<f80> + +__float128 f128; +// CHECK: memref.global "public" @f128 : memref<f128> + +// FIXME: Add global pointers when they can be lowered to MLIR >From 8cad91dc531aa04a8d75f18176e33601a5b5edd1 Mon Sep 17 00:00:00 2001 From: Andy Kaylor <akay...@nvidia.com> Date: Wed, 19 Feb 2025 14:22:04 -0800 Subject: [PATCH 2/2] Change cl option to -emit-core-mlir, change getContext to getMLIRContext() --- clang/include/clang/CIR/CIRGenerator.h | 2 +- clang/include/clang/Driver/Options.td | 4 ++-- clang/include/clang/Frontend/FrontendOptions.h | 2 +- clang/lib/CIR/FrontendAction/CIRGenAction.cpp | 2 +- clang/lib/Frontend/CompilerInvocation.cpp | 4 ++-- clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp | 2 +- clang/test/CIR/Lowering/ThroughMLIR/global-ptrs.cpp | 2 +- clang/test/CIR/Lowering/ThroughMLIR/global.cpp | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/clang/include/clang/CIR/CIRGenerator.h b/clang/include/clang/CIR/CIRGenerator.h index 76b662c68615c..1b519ebeab27e 100644 --- a/clang/include/clang/CIR/CIRGenerator.h +++ b/clang/include/clang/CIR/CIRGenerator.h @@ -55,7 +55,7 @@ class CIRGenerator : public clang::ASTConsumer { void Initialize(clang::ASTContext &astContext) override; bool HandleTopLevelDecl(clang::DeclGroupRef group) override; mlir::ModuleOp getModule() const; - mlir::MLIRContext &getContext() { return *mlirContext; } + mlir::MLIRContext &getMLIRContext() { return *mlirContext; } }; } // namespace cir diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index c8509e6f1529f..81a57ba4099eb 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2958,8 +2958,8 @@ defm clangir : BoolFOption<"clangir", BothFlags<[], [ClangOption, CC1Option], "">>; def emit_cir : Flag<["-"], "emit-cir">, Visibility<[ClangOption, CC1Option]>, Group<Action_Group>, HelpText<"Build ASTs and then lower to ClangIR">; -def emit_cir_mlir : Flag<["-"], "emit-cir-mlir">, Visibility<[CC1Option]>, Group<Action_Group>, - HelpText<"Build ASTs and then lower through ClangIR to MLIR, emit the .milr file">; +def emit_core_mlir : Flag<["-"], "emit-core-mlir">, Visibility<[CC1Option]>, Group<Action_Group>, + HelpText<"Build ASTs and then lower through ClangIR to core MLIR dialects, emit the .milr file">; /// ClangIR-specific options - END def flto_EQ : Joined<["-"], "flto=">, diff --git a/clang/include/clang/Frontend/FrontendOptions.h b/clang/include/clang/Frontend/FrontendOptions.h index e15ce247d1e6e..9d647726e020b 100644 --- a/clang/include/clang/Frontend/FrontendOptions.h +++ b/clang/include/clang/Frontend/FrontendOptions.h @@ -69,7 +69,7 @@ enum ActionKind { EmitCIR, /// Emit a .mlir file - EmitMLIR, + EmitCoreMLIR, /// Emit a .ll file. EmitLLVM, diff --git a/clang/lib/CIR/FrontendAction/CIRGenAction.cpp b/clang/lib/CIR/FrontendAction/CIRGenAction.cpp index 74f795e7e3307..b61e680662701 100644 --- a/clang/lib/CIR/FrontendAction/CIRGenAction.cpp +++ b/clang/lib/CIR/FrontendAction/CIRGenAction.cpp @@ -83,7 +83,7 @@ class CIRGenConsumer : public clang::ASTConsumer { void HandleTranslationUnit(ASTContext &C) override { Gen->HandleTranslationUnit(C); mlir::ModuleOp MlirModule = Gen->getModule(); - mlir::MLIRContext &MlirCtx = Gen->getContext(); + mlir::MLIRContext &MlirCtx = Gen->getMLIRContext(); switch (Action) { case CIRGenAction::OutputType::EmitCIR: if (OutputStream && MlirModule) { diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 58fdad192056f..224825f3939d3 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -2740,7 +2740,7 @@ static const auto &getFrontendActionTable() { {frontend::EmitAssembly, OPT_S}, {frontend::EmitBC, OPT_emit_llvm_bc}, {frontend::EmitCIR, OPT_emit_cir}, - {frontend::EmitMLIR, OPT_emit_cir_mlir}, + {frontend::EmitCoreMLIR, OPT_emit_core_mlir}, {frontend::EmitHTML, OPT_emit_html}, {frontend::EmitLLVM, OPT_emit_llvm}, {frontend::EmitLLVMOnly, OPT_emit_llvm_only}, @@ -4632,7 +4632,7 @@ static bool isStrictlyPreprocessorAction(frontend::ActionKind Action) { case frontend::EmitAssembly: case frontend::EmitBC: case frontend::EmitCIR: - case frontend::EmitMLIR: + case frontend::EmitCoreMLIR: case frontend::EmitHTML: case frontend::EmitLLVM: case frontend::EmitLLVMOnly: diff --git a/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp index ec0949c2b6941..5f354c8ab8631 100644 --- a/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp +++ b/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp @@ -80,7 +80,7 @@ CreateFrontendBaseAction(CompilerInstance &CI) { #else llvm_unreachable("CIR suppport not built into clang"); #endif - case EmitMLIR: + case EmitCoreMLIR: #if CLANG_ENABLE_CIR return std::make_unique<cir::EmitMLIRAction>(); #else diff --git a/clang/test/CIR/Lowering/ThroughMLIR/global-ptrs.cpp b/clang/test/CIR/Lowering/ThroughMLIR/global-ptrs.cpp index ada6a17896dfa..2eb359c6b56b6 100644 --- a/clang/test/CIR/Lowering/ThroughMLIR/global-ptrs.cpp +++ b/clang/test/CIR/Lowering/ThroughMLIR/global-ptrs.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir-mlir %s -o %t.mlir +// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu -fclangir -emit-core-mlir %s -o %t.mlir // RUN: FileCheck --input-file=%t.mlir %s // XFAIL: * diff --git a/clang/test/CIR/Lowering/ThroughMLIR/global.cpp b/clang/test/CIR/Lowering/ThroughMLIR/global.cpp index 4515d68aa177d..4a6ae8640c95b 100644 --- a/clang/test/CIR/Lowering/ThroughMLIR/global.cpp +++ b/clang/test/CIR/Lowering/ThroughMLIR/global.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir-mlir %s -o %t.mlir +// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu -fclangir -emit-core-mlir %s -o %t.mlir // RUN: FileCheck --input-file=%t.mlir %s char c; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits