https://github.com/sebpop updated https://github.com/llvm/llvm-project/pull/140182
>From b0a6935e8439bc5b4f742f55eb3bb090790a8f95 Mon Sep 17 00:00:00 2001 From: Sebastian Pop <s...@nvidia.com> Date: Wed, 7 May 2025 01:14:49 +0000 Subject: [PATCH 1/4] [flang] fix Werror=dangling-reference MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit when compiling with g++ 13.3.0 flang build fails with: llvm-project/flang/lib/Semantics/expression.cpp:424:17: error: possibly dangling reference to a temporary [-Werror=dangling-reference] 424 | const Symbol &coarraySymbol{ref.GetBase().GetLastSymbol()}; | ^~~~~~~~~~~~~ llvm-project/flang/lib/Semantics/expression.cpp:424:58: note: the temporary was destroyed at the end of the full expression ‘Fortran::evaluate::CoarrayRef::GetBase() const().Fortran::evaluate::NamedEntity::GetLastSymbol()’ 424 | const Symbol &coarraySymbol{ref.GetBase().GetLastSymbol()}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~ Keep the base in a temporary variable to make sure it is not deleted. --- flang/lib/Semantics/expression.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp index e139bda7e4950..35eb7b61429fb 100644 --- a/flang/lib/Semantics/expression.cpp +++ b/flang/lib/Semantics/expression.cpp @@ -421,7 +421,8 @@ static void CheckSubscripts( static void CheckSubscripts( semantics::SemanticsContext &context, CoarrayRef &ref) { - const Symbol &coarraySymbol{ref.GetBase().GetLastSymbol()}; + const auto &base = ref.GetBase(); + const Symbol &coarraySymbol{base.GetLastSymbol()}; Shape lb, ub; if (FoldSubscripts(context, coarraySymbol, ref.subscript(), lb, ub)) { ValidateSubscripts(context, coarraySymbol, ref.subscript(), lb, ub); >From c6d051a2b4239e1fe78e1d4483b500b129956867 Mon Sep 17 00:00:00 2001 From: Sebastian Pop <s...@nvidia.com> Date: Mon, 12 May 2025 21:56:03 +0000 Subject: [PATCH 2/4] [flang] add -floop-interchange to flang driver This patch allows flang to recognize the flags -floop-interchange and -fno-loop-interchange. -floop-interchange adds the loop interchange pass to the pass pipeline. --- clang/include/clang/Driver/Options.td | 4 ++-- clang/lib/Driver/ToolChains/Flang.cpp | 3 +++ flang/include/flang/Frontend/CodeGenOptions.def | 1 + flang/lib/Frontend/CompilerInvocation.cpp | 3 +++ flang/lib/Frontend/FrontendActions.cpp | 1 + flang/test/Driver/loop-interchange.f90 | 7 +++++++ 6 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 flang/test/Driver/loop-interchange.f90 diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 11677626dbf1f..287a00863bb35 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4141,9 +4141,9 @@ def ftrap_function_EQ : Joined<["-"], "ftrap-function=">, Group<f_Group>, HelpText<"Issue call to specified function rather than a trap instruction">, MarshallingInfoString<CodeGenOpts<"TrapFuncName">>; def floop_interchange : Flag<["-"], "floop-interchange">, Group<f_Group>, - HelpText<"Enable the loop interchange pass">, Visibility<[ClangOption, CC1Option]>; + HelpText<"Enable the loop interchange pass">, Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>; def fno_loop_interchange: Flag<["-"], "fno-loop-interchange">, Group<f_Group>, - HelpText<"Disable the loop interchange pass">, Visibility<[ClangOption, CC1Option]>; + HelpText<"Disable the loop interchange pass">, Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>; def funroll_loops : Flag<["-"], "funroll-loops">, Group<f_Group>, HelpText<"Turn on loop unroller">, Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>; def fno_unroll_loops : Flag<["-"], "fno-unroll-loops">, Group<f_Group>, diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index b1ca747e68b89..c6c7a0b75a987 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -152,6 +152,9 @@ void Flang::addCodegenOptions(const ArgList &Args, !stackArrays->getOption().matches(options::OPT_fno_stack_arrays)) CmdArgs.push_back("-fstack-arrays"); + Args.AddLastArg(CmdArgs, options::OPT_floop_interchange, + options::OPT_fno_loop_interchange); + handleVectorizeLoopsArgs(Args, CmdArgs); handleVectorizeSLPArgs(Args, CmdArgs); diff --git a/flang/include/flang/Frontend/CodeGenOptions.def b/flang/include/flang/Frontend/CodeGenOptions.def index d9dbd274e83e5..7ced60f512219 100644 --- a/flang/include/flang/Frontend/CodeGenOptions.def +++ b/flang/include/flang/Frontend/CodeGenOptions.def @@ -35,6 +35,7 @@ CODEGENOPT(PrepareForThinLTO , 1, 0) ///< Set when -flto=thin is enabled on the CODEGENOPT(StackArrays, 1, 0) ///< -fstack-arrays (enable the stack-arrays pass) CODEGENOPT(VectorizeLoop, 1, 0) ///< Enable loop vectorization. CODEGENOPT(VectorizeSLP, 1, 0) ///< Enable SLP vectorization. +CODEGENOPT(InterchangeLoops, 1, 0) ///< Enable loop interchange. CODEGENOPT(LoopVersioning, 1, 0) ///< Enable loop versioning. CODEGENOPT(UnrollLoops, 1, 0) ///< Enable loop unrolling CODEGENOPT(AliasAnalysis, 1, 0) ///< Enable alias analysis pass diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 28f2f69f23baf..0bdbb616136f1 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -269,6 +269,9 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions &opts, clang::driver::options::OPT_fno_stack_arrays, false)) opts.StackArrays = 1; + if (args.getLastArg(clang::driver::options::OPT_floop_interchange)) + opts.InterchangeLoops = 1; + if (args.getLastArg(clang::driver::options::OPT_vectorize_loops)) opts.VectorizeLoop = 1; diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp index c1f47b12abee2..7c936ee23009d 100644 --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -915,6 +915,7 @@ void CodeGenAction::runOptimizationPipeline(llvm::raw_pwrite_stream &os) { if (ci.isTimingEnabled()) si.getTimePasses().setOutStream(ci.getTimingStreamLLVM()); pto.LoopUnrolling = opts.UnrollLoops; + pto.LoopInterchange = opts.InterchangeLoops; pto.LoopInterleaving = opts.UnrollLoops; pto.LoopVectorization = opts.VectorizeLoop; pto.SLPVectorization = opts.VectorizeSLP; diff --git a/flang/test/Driver/loop-interchange.f90 b/flang/test/Driver/loop-interchange.f90 new file mode 100644 index 0000000000000..30ce2734d0466 --- /dev/null +++ b/flang/test/Driver/loop-interchange.f90 @@ -0,0 +1,7 @@ +! RUN: %flang -### -S -floop-interchange %s 2>&1 | FileCheck -check-prefix=CHECK-LOOP-INTERCHANGE %s +! RUN: %flang -### -S -fno-loop-interchange %s 2>&1 | FileCheck -check-prefix=CHECK-NO-LOOP-INTERCHANGE %s +! CHECK-LOOP-INTERCHANGE: "-floop-interchange" +! CHECK-NO-LOOP-INTERCHANGE: "-fno-loop-interchange" + +program test +end program >From ad86b774f305df88c643ec85e470fcc44511d405 Mon Sep 17 00:00:00 2001 From: Sebastian Pop <s...@nvidia.com> Date: Fri, 16 May 2025 03:02:54 +0000 Subject: [PATCH 3/4] [flang] enable loop-interchange at O3, O2, and Os --- clang/lib/Driver/ToolChains/CommonArgs.cpp | 13 +++++++++++++ clang/lib/Driver/ToolChains/CommonArgs.h | 4 ++++ clang/lib/Driver/ToolChains/Flang.cpp | 4 +--- flang/test/Driver/loop-interchange.f90 | 8 +++++++- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index e4bad39f8332a..89f4ebd519ebf 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -3152,3 +3152,16 @@ void tools::handleVectorizeSLPArgs(const ArgList &Args, options::OPT_fno_slp_vectorize, EnableSLPVec)) CmdArgs.push_back("-vectorize-slp"); } + +void tools::handleInterchangeLoopsArgs(const ArgList &Args, + ArgStringList &CmdArgs) { + // FIXME: instead of relying on shouldEnableVectorizerAtOLevel, we may want to + // implement a separate function to infer loop interchange from opt level. + // For now, enable loop-interchange at the same opt levels as loop-vectorize. + bool EnableInterch = shouldEnableVectorizerAtOLevel(Args, false); + OptSpecifier interchangeAliasOption = + EnableInterch ? options::OPT_O_Group : options::OPT_floop_interchange; + if (Args.hasFlag(options::OPT_floop_interchange, interchangeAliasOption, + options::OPT_fno_loop_interchange, EnableInterch)) + CmdArgs.push_back("-floop-interchange"); +} diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h b/clang/lib/Driver/ToolChains/CommonArgs.h index 96bc0619dcbc0..6d36a0e8bf493 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.h +++ b/clang/lib/Driver/ToolChains/CommonArgs.h @@ -259,6 +259,10 @@ void renderCommonIntegerOverflowOptions(const llvm::opt::ArgList &Args, bool shouldEnableVectorizerAtOLevel(const llvm::opt::ArgList &Args, bool isSlpVec); +/// Enable -floop-interchange based on the optimization level selected. +void handleInterchangeLoopsArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs); + /// Enable -fvectorize based on the optimization level selected. void handleVectorizeLoopsArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs); diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index c6c7a0b75a987..54176381b6e5b 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -152,9 +152,7 @@ void Flang::addCodegenOptions(const ArgList &Args, !stackArrays->getOption().matches(options::OPT_fno_stack_arrays)) CmdArgs.push_back("-fstack-arrays"); - Args.AddLastArg(CmdArgs, options::OPT_floop_interchange, - options::OPT_fno_loop_interchange); - + handleInterchangeLoopsArgs(Args, CmdArgs); handleVectorizeLoopsArgs(Args, CmdArgs); handleVectorizeSLPArgs(Args, CmdArgs); diff --git a/flang/test/Driver/loop-interchange.f90 b/flang/test/Driver/loop-interchange.f90 index 30ce2734d0466..d5d62e9a777d2 100644 --- a/flang/test/Driver/loop-interchange.f90 +++ b/flang/test/Driver/loop-interchange.f90 @@ -1,7 +1,13 @@ ! RUN: %flang -### -S -floop-interchange %s 2>&1 | FileCheck -check-prefix=CHECK-LOOP-INTERCHANGE %s ! RUN: %flang -### -S -fno-loop-interchange %s 2>&1 | FileCheck -check-prefix=CHECK-NO-LOOP-INTERCHANGE %s +! RUN: %flang -### -S -O0 %s 2>&1 | FileCheck -check-prefix=CHECK-NO-LOOP-INTERCHANGE %s +! RUN: %flang -### -S -O1 %s 2>&1 | FileCheck -check-prefix=CHECK-NO-LOOP-INTERCHANGE %s +! RUN: %flang -### -S -O2 %s 2>&1 | FileCheck -check-prefix=CHECK-LOOP-INTERCHANGE %s +! RUN: %flang -### -S -O3 %s 2>&1 | FileCheck -check-prefix=CHECK-LOOP-INTERCHANGE %s +! RUN: %flang -### -S -Os %s 2>&1 | FileCheck -check-prefix=CHECK-LOOP-INTERCHANGE %s +! RUN: %flang -### -S -Oz %s 2>&1 | FileCheck -check-prefix=CHECK-NO-LOOP-INTERCHANGE %s ! CHECK-LOOP-INTERCHANGE: "-floop-interchange" -! CHECK-NO-LOOP-INTERCHANGE: "-fno-loop-interchange" +! CHECK-NO-LOOP-INTERCHANGE-NOT: "-floop-interchange" program test end program >From dd3f7b2703f5502ede2f2b9de07d68a064beb110 Mon Sep 17 00:00:00 2001 From: Sebastian Pop <s...@nvidia.com> Date: Fri, 16 May 2025 21:46:04 +0000 Subject: [PATCH 4/4] test loop-interchange in pass pipeline --- flang/test/Driver/loop-interchange.f90 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/flang/test/Driver/loop-interchange.f90 b/flang/test/Driver/loop-interchange.f90 index d5d62e9a777d2..5d3ec71c59874 100644 --- a/flang/test/Driver/loop-interchange.f90 +++ b/flang/test/Driver/loop-interchange.f90 @@ -8,6 +8,10 @@ ! RUN: %flang -### -S -Oz %s 2>&1 | FileCheck -check-prefix=CHECK-NO-LOOP-INTERCHANGE %s ! CHECK-LOOP-INTERCHANGE: "-floop-interchange" ! CHECK-NO-LOOP-INTERCHANGE-NOT: "-floop-interchange" +! RUN: %flang_fc1 -emit-llvm -O2 -floop-interchange -mllvm -print-pipeline-passes -o /dev/null %s 2>&1 | FileCheck -check-prefix=CHECK-LOOP-INTERCHANGE-PASS %s +! RUN: %flang_fc1 -emit-llvm -O2 -fno-loop-interchange -mllvm -print-pipeline-passes -o /dev/null %s 2>&1 | FileCheck -check-prefix=CHECK-NO-LOOP-INTERCHANGE-PASS %s +! CHECK-LOOP-INTERCHANGE-PASS: loop-interchange +! CHECK-NO-LOOP-INTERCHANGE-PASS-NOT: loop-interchange program test end program _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits