Skip to content

Commit

Permalink
[CIR] Cleanup idiom-recognizer and lib-opt options
Browse files Browse the repository at this point in the history
This was a bit half backed, give it some love.
  • Loading branch information
bcardosolopes committed Dec 22, 2023
1 parent 45c65c9 commit 1b4c9be
Show file tree
Hide file tree
Showing 9 changed files with 85 additions and 42 deletions.
12 changes: 6 additions & 6 deletions clang/include/clang/CIR/CIRToCIRPasses.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@ class ModuleOp;
namespace cir {

// Run set of cleanup/prepare/etc passes CIR <-> CIR.
mlir::LogicalResult
runCIRToCIRPasses(mlir::ModuleOp theModule, mlir::MLIRContext *mlirCtx,
clang::ASTContext &astCtx, bool enableVerifier,
bool enableLifetime, llvm::StringRef lifetimeOpts,
llvm::StringRef idiomRecognizerOpts,
llvm::StringRef libOptOpts, bool &passOptParsingFailure);
mlir::LogicalResult runCIRToCIRPasses(
mlir::ModuleOp theModule, mlir::MLIRContext *mlirCtx,
clang::ASTContext &astCtx, bool enableVerifier, bool enableLifetime,
llvm::StringRef lifetimeOpts, bool enableIdiomRecognizer,
llvm::StringRef idiomRecognizerOpts, bool enableLibOpt,
llvm::StringRef libOptOpts, std::string &passOptParsingFailure);
} // namespace cir

#endif // CLANG_CIR_CIRTOCIRPASSES_H_
8 changes: 6 additions & 2 deletions clang/include/clang/Driver/Options.td
Original file line number Diff line number Diff line change
Expand Up @@ -2843,15 +2843,19 @@ def fclangir_lifetime_check : Flag<["-"], "fclangir-lifetime-check">,
HelpText<"Run lifetime checker">;
def fclangir_idiom_recognizer_EQ : Joined<["-"], "fclangir-idiom-recognizer=">,
Visibility<[ClangOption, CC1Option]>, Group<f_Group>,
HelpText<"Pass configuration options to CIR idiom recognizer">,
HelpText<"Enable C/C++ idiom recognizer">,
MarshallingInfoString<FrontendOpts<"ClangIRIdiomRecognizerOpts">>;
def fclangir_idiom_recognizer : Flag<["-"], "fclangir-idiom-recognizer">,
Visibility<[ClangOption, CC1Option]>, Group<f_Group>,
Alias<fclangir_idiom_recognizer_EQ>,
HelpText<"Enable C/C++ idiom recognizer">;
def fclangir_lib_opt_EQ : Joined<["-"], "fclangir-lib-opt=">,
Visibility<[ClangOption, CC1Option]>, Group<f_Group>,
HelpText<"Enable C/C++ library based optimizations (with options)">,
MarshallingInfoString<FrontendOpts<"ClangIRLibOptOpts">>;
def fclangir_lib_opt : Flag<["-"], "fclangir-lib-opt">,
Visibility<[ClangOption, CC1Option]>, Group<f_Group>,
Alias<fclangir_lib_opt_EQ>, AliasArgs<[""]>,
Alias<fclangir_lib_opt_EQ>,
HelpText<"Enable C/C++ library based optimizations">;

def clangir_disable_passes : Flag<["-"], "clangir-disable-passes">,
Expand Down
7 changes: 7 additions & 0 deletions clang/include/clang/Frontend/FrontendOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,12 @@ class FrontendOptions {
// Enable Clang IR based lifetime check
unsigned ClangIRLifetimeCheck : 1;

// Enable Clang IR idiom recognizer
unsigned ClangIRIdiomRecognizer : 1;

// Enable Clang IR library optimizations
unsigned ClangIRLibOpt : 1;

CodeCompleteOptions CodeCompleteOpts;

/// Specifies the output format of the AST.
Expand Down Expand Up @@ -598,6 +604,7 @@ class FrontendOptions {
UseClangIRPipeline(false), ClangIRDirectLowering(false),
ClangIRDisablePasses(false), ClangIRDisableCIRVerifier(false),
ClangIRDisableEmitCXXDefault(false), ClangIRLifetimeCheck(false),
ClangIRIdiomRecognizer(false), ClangIRLibOpt(false),
TimeTraceGranularity(500) {}

/// getInputKindForExtension - Return the appropriate input kind for a file
Expand Down
40 changes: 21 additions & 19 deletions clang/lib/CIR/CodeGen/CIRPasses.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,39 +18,41 @@
#include "mlir/Pass/PassManager.h"

namespace cir {
mlir::LogicalResult
runCIRToCIRPasses(mlir::ModuleOp theModule, mlir::MLIRContext *mlirCtx,
clang::ASTContext &astCtx, bool enableVerifier,
bool enableLifetime, llvm::StringRef lifetimeOpts,
llvm::StringRef idiomRecognizerOpts,
llvm::StringRef libOptOpts, bool &passOptParsingFailure) {
mlir::LogicalResult runCIRToCIRPasses(
mlir::ModuleOp theModule, mlir::MLIRContext *mlirCtx,
clang::ASTContext &astCtx, bool enableVerifier, bool enableLifetime,
llvm::StringRef lifetimeOpts, bool enableIdiomRecognizer,
llvm::StringRef idiomRecognizerOpts, bool enableLibOpt,
llvm::StringRef libOptOpts, std::string &passOptParsingFailure) {
mlir::PassManager pm(mlirCtx);
passOptParsingFailure = false;

pm.addPass(mlir::createMergeCleanupsPass());

if (enableLifetime) {
auto lifetimePass = mlir::createLifetimeCheckPass(&astCtx);
if (lifetimePass->initializeOptions(lifetimeOpts).failed()) {
passOptParsingFailure = true;
passOptParsingFailure = lifetimeOpts;
return mlir::failure();
}
pm.addPass(std::move(lifetimePass));
}

auto idiomPass = mlir::createIdiomRecognizerPass(&astCtx);
if (idiomPass->initializeOptions(idiomRecognizerOpts).failed()) {
passOptParsingFailure = true;
return mlir::failure();
if (enableIdiomRecognizer) {
auto idiomPass = mlir::createIdiomRecognizerPass(&astCtx);
if (idiomPass->initializeOptions(idiomRecognizerOpts).failed()) {
passOptParsingFailure = idiomRecognizerOpts;
return mlir::failure();
}
pm.addPass(std::move(idiomPass));
}
pm.addPass(std::move(idiomPass));

auto libOpPass = mlir::createLibOptPass(&astCtx);
if (libOpPass->initializeOptions(libOptOpts).failed()) {
passOptParsingFailure = true;
return mlir::failure();
if (enableLibOpt) {
auto libOpPass = mlir::createLibOptPass(&astCtx);
if (libOpPass->initializeOptions(libOptOpts).failed()) {
passOptParsingFailure = libOptOpts;
return mlir::failure();
}
pm.addPass(std::move(libOpPass));
}
pm.addPass(std::move(libOpPass));

pm.addPass(mlir::createLoweringPreparePass(&astCtx));

Expand Down
17 changes: 10 additions & 7 deletions clang/lib/CIR/FrontendAction/CIRGenAction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -173,18 +173,21 @@ class CIRGenConsumer : public clang::ASTConsumer {
std::string lifetimeOpts, idiomRecognizerOpts, libOptOpts;
if (feOptions.ClangIRLifetimeCheck)
lifetimeOpts = sanitizePassOptions(feOptions.ClangIRLifetimeCheckOpts);
idiomRecognizerOpts =
sanitizePassOptions(feOptions.ClangIRIdiomRecognizerOpts);
libOptOpts = sanitizePassOptions(feOptions.ClangIRLibOptOpts);
if (feOptions.ClangIRIdiomRecognizer)
idiomRecognizerOpts =
sanitizePassOptions(feOptions.ClangIRIdiomRecognizerOpts);
if (feOptions.ClangIRLibOpt)
libOptOpts = sanitizePassOptions(feOptions.ClangIRLibOptOpts);

// Setup and run CIR pipeline.
bool passOptParsingFailure = false;
std::string passOptParsingFailure;
if (runCIRToCIRPasses(
mlirMod, mlirCtx.get(), C, !feOptions.ClangIRDisableCIRVerifier,
feOptions.ClangIRLifetimeCheck, lifetimeOpts, idiomRecognizerOpts,
libOptOpts, passOptParsingFailure)
feOptions.ClangIRLifetimeCheck, lifetimeOpts,
feOptions.ClangIRIdiomRecognizer, idiomRecognizerOpts,
feOptions.ClangIRLibOpt, libOptOpts, passOptParsingFailure)
.failed()) {
if (passOptParsingFailure)
if (!passOptParsingFailure.empty())
diagnosticsEngine.Report(diag::err_drv_cir_pass_opt_parsing)
<< feOptions.ClangIRLifetimeCheckOpts;
else
Expand Down
8 changes: 8 additions & 0 deletions clang/lib/Driver/ToolChains/Clang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4773,6 +4773,14 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
if (Args.hasArg(options::OPT_clangir_disable_passes))
CmdArgs.push_back("-clangir-disable-passes");

// ClangIR lib opt requires idiom recognizer.
if (Args.hasArg(options::OPT_fclangir_lib_opt,
options::OPT_fclangir_lib_opt_EQ)) {
if (!Args.hasArg(options::OPT_fclangir_idiom_recognizer,
options::OPT_fclangir_idiom_recognizer_EQ))
CmdArgs.push_back("-fclangir-idiom-recognizer");
}

if (IsOpenMPDevice) {
// We have to pass the triple of the host if compiling for an OpenMP device.
std::string NormalizedTriple =
Expand Down
25 changes: 22 additions & 3 deletions clang/lib/Frontend/CompilerInvocation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2706,6 +2706,17 @@ static void GenerateFrontendArgs(const FrontendOptions &Opts,
for (const auto &ModuleFile : Opts.ModuleFiles)
GenerateArg(Consumer, OPT_fmodule_file, ModuleFile);

if (Opts.ClangIRLifetimeCheck)
GenerateArg(Consumer, OPT_fclangir_lifetime_check_EQ,
Opts.ClangIRLifetimeCheckOpts);

if (Opts.ClangIRIdiomRecognizer)
GenerateArg(Consumer, OPT_fclangir_idiom_recognizer_EQ,
Opts.ClangIRIdiomRecognizerOpts);

if (Opts.ClangIRLibOpt)
GenerateArg(Consumer, OPT_fclangir_lib_opt_EQ, Opts.ClangIRLibOptOpts);

if (Opts.AuxTargetCPU)
GenerateArg(Consumer, OPT_aux_target_cpu, *Opts.AuxTargetCPU);

Expand Down Expand Up @@ -2929,9 +2940,17 @@ static bool ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
Opts.ClangIRLifetimeCheckOpts = A->getValue();
}

if (Args.hasArg(OPT_fclangir_idiom_recognizer_EQ))
Opts.AuxTargetCPU =
std::string(Args.getLastArgValue(OPT_fclangir_idiom_recognizer_EQ));
if (const Arg *A = Args.getLastArg(OPT_fclangir_idiom_recognizer,
OPT_fclangir_idiom_recognizer_EQ)) {
Opts.ClangIRIdiomRecognizer = true;
Opts.ClangIRIdiomRecognizerOpts = A->getValue();
}

if (const Arg *A =
Args.getLastArg(OPT_fclangir_lib_opt, OPT_fclangir_lib_opt_EQ)) {
Opts.ClangIRLibOpt = true;
Opts.ClangIRLibOptOpts = A->getValue();
}

if (Args.hasArg(OPT_aux_target_cpu))
Opts.AuxTargetCPU = std::string(Args.getLastArgValue(OPT_aux_target_cpu));
Expand Down
8 changes: 4 additions & 4 deletions clang/test/CIR/Transforms/idiom-recognizer.cpp
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir-enable -emit-cir -I%S/../Inputs -mmlir --mlir-print-ir-after-all %s -o - 2>&1 | FileCheck %s -check-prefix=PASS_ENABLED
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir-enable -fclangir-idiom-recognizer -emit-cir -I%S/../Inputs -mmlir --mlir-print-ir-after-all %s -o - 2>&1 | FileCheck %s -check-prefix=PASS_ENABLED
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 -fclangir-enable -emit-cir -I%S/../Inputs -fclangir-idiom-recognizer="remarks=found-calls" -clangir-verify-diagnostics %s -o %t.cir

// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 -fclangir-enable -emit-cir -I%S/../Inputs -mmlir --mlir-print-ir-before=cir-idiom-recognizer %s -o - 2>&1 | FileCheck %s -check-prefix=BEFORE-IDIOM
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 -fclangir-enable -emit-cir -I%S/../Inputs -mmlir --mlir-print-ir-after=cir-idiom-recognizer %s -o - 2>&1 | FileCheck %s -check-prefix=AFTER-IDIOM
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 -fclangir-enable -emit-cir -I%S/../Inputs -mmlir --mlir-print-ir-after=cir-lowering-prepare %s -o - 2>&1 | FileCheck %s -check-prefix=AFTER-LOWERING-PREPARE
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 -fclangir-enable -fclangir-idiom-recognizer -emit-cir -I%S/../Inputs -mmlir --mlir-print-ir-before=cir-idiom-recognizer %s -o - 2>&1 | FileCheck %s -check-prefix=BEFORE-IDIOM
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 -fclangir-enable -fclangir-idiom-recognizer -emit-cir -I%S/../Inputs -mmlir --mlir-print-ir-after=cir-idiom-recognizer %s -o - 2>&1 | FileCheck %s -check-prefix=AFTER-IDIOM
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 -fclangir-enable -fclangir-idiom-recognizer -emit-cir -I%S/../Inputs -mmlir --mlir-print-ir-after=cir-lowering-prepare %s -o - 2>&1 | FileCheck %s -check-prefix=AFTER-LOWERING-PREPARE

// PASS_ENABLED: IR Dump After IdiomRecognizer (cir-idiom-recognizer)

Expand Down
2 changes: 1 addition & 1 deletion clang/test/CIR/Transforms/lib-opt.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir-enable -emit-cir -mmlir --mlir-print-ir-after-all %s -o - 2>&1 | FileCheck %s -check-prefix=CIR
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir-enable -fclangir-idiom-recognizer -fclangir-lib-opt -emit-cir -mmlir --mlir-print-ir-after-all %s -o - 2>&1 | FileCheck %s -check-prefix=CIR

// CIR: IR Dump After LibOpt (cir-lib-opt)

0 comments on commit 1b4c9be

Please sign in to comment.