[flang-commits] [clang] [flang] [FLANG][Driver] Support -fno-profile-generate and -fprofile-generate=<dir> in flang (PR #216643)
Kaviya Rajendiran via flang-commits
flang-commits at lists.llvm.org
Thu Aug 27 02:02:17 PDT 2026
https://github.com/kaviya2510 updated https://github.com/llvm/llvm-project/pull/216643
>From bddc1b5a38b0815c0d493c9829fb09048070197f Mon Sep 17 00:00:00 2001
From: Kaviya Rajendiran <kaviyara2000 at gmail.com>
Date: Mon, 17 Aug 2026 11:36:26 +0530
Subject: [PATCH 1/4] [FLANG][Driver] Support -fno-profile-generate and
-fprofile-generate=<dir> in flang
---
clang/include/clang/Options/Options.td | 4 ++--
clang/lib/Driver/ToolChains/Flang.cpp | 12 +++++++++---
flang/lib/Frontend/CompilerInvocation.cpp | 14 ++++++++++++--
flang/test/Driver/flang-f-opts.f90 | 12 ++++++++++++
flang/test/Profile/gcc-flag-compatibility.f90 | 6 ++++++
5 files changed, 41 insertions(+), 7 deletions(-)
diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td
index eb5a009b5628c..74360f442b434 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -1954,7 +1954,7 @@ def fprofile_generate : Flag<["-"], "fprofile-generate">,
Group<f_Group>, Visibility<[ClangOption, CLOption, FlangOption, FC1Option]>,
HelpText<"Generate instrumented code to collect execution counts into default.profraw (overridden by LLVM_PROFILE_FILE env var)">;
def fprofile_generate_EQ : Joined<["-"], "fprofile-generate=">,
- Group<f_Group>, Visibility<[ClangOption, CLOption]>,
+ Group<f_Group>, Visibility<[ClangOption, CLOption, FlangOption, FC1Option]>,
MetaVarName<"<directory>">,
HelpText<"Generate instrumented code to collect execution counts into <directory>/default.profraw (overridden by LLVM_PROFILE_FILE env var)">;
def fcs_profile_generate : Flag<["-"], "fcs-profile-generate">,
@@ -1975,7 +1975,7 @@ def fno_profile_instr_generate : Flag<["-"], "fno-profile-instr-generate">,
Group<f_Group>, Visibility<[ClangOption, CLOption]>,
HelpText<"Disable generation of profile instrumentation.">;
def fno_profile_generate : Flag<["-"], "fno-profile-generate">,
- Group<f_Group>, Visibility<[ClangOption, CLOption]>,
+ Group<f_Group>, Visibility<[ClangOption, CLOption, FlangOption, FC1Option]>,
HelpText<"Disable generation of profile instrumentation.">;
def fno_profile_instr_use : Flag<["-"], "fno-profile-instr-use">,
Group<f_Group>, Visibility<[ClangOption, CLOption]>,
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index ccd99b5e0892c..ac4939db72f1a 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -1244,6 +1244,13 @@ static void addPGOAndCoverageFlags(const ToolChain &TC, const JobAction &JA,
options::OPT_fno_pseudo_probe_for_profiling, false))
CmdArgs.push_back("-fpseudo-probe-for-profiling");
+ if (Arg *PGOGenerateArg = Args.getLastArg(
+ options::OPT_fprofile_generate, options::OPT_fprofile_generate_EQ,
+ options::OPT_fno_profile_generate)) {
+ if (!PGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
+ PGOGenerateArg->render(Args, CmdArgs);
+ }
+
addSplitMachineFunctionsArgs(TC.getDriver(), Args, CmdArgs, TC.getTriple());
}
@@ -1377,9 +1384,8 @@ void Flang::ConstructJob(Compilation &C, const JobAction &JA,
// TODO: Handle interactions between -w, -pedantic, -Wall, -WOption
Args.AddLastArg(CmdArgs, options::OPT_w);
- // recognise options: fprofile-generate -fprofile-use=
- Args.addAllArgs(
- CmdArgs, {options::OPT_fprofile_generate, options::OPT_fprofile_use_EQ});
+ // recognise options: -fprofile-use=
+ Args.addAllArgs(CmdArgs, {options::OPT_fprofile_use_EQ});
addPGOAndCoverageFlags(TC, JA, Args, CmdArgs);
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index 87a25f3101ddd..bbaeb046edc5c 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -498,8 +498,18 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions &opts,
opts.IsPIE = 1;
}
- if (args.hasArg(clang::options::OPT_fprofile_generate)) {
- opts.setProfileInstr(llvm::driver::ProfileInstrKind::ProfileIRInstr);
+ if (const llvm::opt::Arg *a =
+ args.getLastArg(clang::options::OPT_fprofile_generate,
+ clang::options::OPT_fprofile_generate_EQ,
+ clang::options::OPT_fno_profile_generate)) {
+ if (!a->getOption().matches(clang::options::OPT_fno_profile_generate)) {
+ opts.setProfileInstr(llvm::driver::ProfileInstrKind::ProfileIRInstr);
+ if (a->getOption().matches(clang::options::OPT_fprofile_generate_EQ)) {
+ llvm::SmallString<128> path(a->getValue());
+ llvm::sys::path::append(path, "default_%m.profraw");
+ opts.InstrProfileOutput = std::string(path);
+ }
+ }
}
if (auto A = args.getLastArg(clang::options::OPT_fprofile_use_EQ)) {
diff --git a/flang/test/Driver/flang-f-opts.f90 b/flang/test/Driver/flang-f-opts.f90
index 3f53adaf56271..def17a7b15ecf 100644
--- a/flang/test/Driver/flang-f-opts.f90
+++ b/flang/test/Driver/flang-f-opts.f90
@@ -11,6 +11,18 @@
! RUN: %flang -### -S -fprofile-generate %s 2>&1 | FileCheck -check-prefix=CHECK-PROFILE-GENERATE-LLVM %s
! CHECK-PROFILE-GENERATE-LLVM: "-fprofile-generate"
+
+! RUN: rm -rf %t.pgodir && mkdir -p %t.pgodir
+! RUN: %flang -### -S -fprofile-generate=%t.pgodir %s 2>&1| FileCheck -check-prefix=CHECK-PROFILE-GENERATE-EQ %s
+! CHECK-PROFILE-GENERATE-EQ: "-fprofile-generate={{.*}}pgodir"
+
+! RUN: %flang -### -S -fprofile-generate -fno-profile-generate %s 2>&1 | FileCheck -check-prefix=CHECK-FNO-PROFILE-GENERATE %s
+! CHECK-FNO-PROFILE-GENERATE: "-fc1"
+! CHECK-FNO-PROFILE-GENERATE-NOT: "-fprofile-generate"
+
+! RUN: %flang -### -S -fno-profile-generate -fprofile-generate %s 2>&1 | FileCheck -check-prefix=CHECK-FPROFILE-GENERATE %s
+! CHECK-FPROFILE-GENERATE: "-fprofile-generate"
+
! RUN: %flang -### -S -fprofile-use=%S %s 2>&1 | FileCheck -check-prefix=CHECK-PROFILE-USE-DIR %s
! CHECK-PROFILE-USE-DIR: "-fprofile-use={{.*}}"
!
diff --git a/flang/test/Profile/gcc-flag-compatibility.f90 b/flang/test/Profile/gcc-flag-compatibility.f90
index 4490c45232d28..5040cc6b721bf 100644
--- a/flang/test/Profile/gcc-flag-compatibility.f90
+++ b/flang/test/Profile/gcc-flag-compatibility.f90
@@ -6,6 +6,12 @@
! On AIX, -flto used to be required with -fprofile-generate. gcc-flag-compatibility-aix.c is used to do the testing on AIX with -flto
! RUN: %flang %s -c -S -o - -emit-llvm -fprofile-generate | FileCheck -check-prefix=PROFILE-GEN %s
+! RUN: rm -rf %t.gendir
+! RUN: mkdir -p %t.gendir
+! RUN: %flang %s -c -S -o - -emit-llvm -fprofile-generate=%t.gendir | FileCheck -check-prefix=PROFILE-GEN %s
+! RUN: %flang_fc1 -emit-llvm -fprofile-generate -fno-profile-generate -o - %s | FileCheck -check-prefix=NO-PROFILE-GEN %s
+! RUN: %flang_fc1 -emit-llvm -fno-profile-generate -fprofile-generate -o - %s | FileCheck -check-prefix=PROFILE-GEN %s
+! NO-PROFILE-GEN-NOT: @__profc_
! PROFILE-GEN: @__profc_{{_?}}main = {{(private|internal)}} global [1 x i64] zeroinitializer, section
! PROFILE-GEN: @__profd_{{_?}}main =
>From 721ab726544c4138c29d65801a43487b73add1ac Mon Sep 17 00:00:00 2001
From: Kaviya Rajendiran <kaviyara2000 at gmail.com>
Date: Wed, 19 Aug 2026 13:18:48 +0530
Subject: [PATCH 2/4] [Flang][Driver] Modified the visibility of
'-fno-profile-generate' option
---
clang/include/clang/Options/Options.td | 2 +-
flang/lib/Frontend/CompilerInvocation.cpp | 15 ++++++---------
flang/test/Profile/gcc-flag-compatibility.f90 | 3 ---
3 files changed, 7 insertions(+), 13 deletions(-)
diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td
index 74360f442b434..f5cd81279b343 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -1975,7 +1975,7 @@ def fno_profile_instr_generate : Flag<["-"], "fno-profile-instr-generate">,
Group<f_Group>, Visibility<[ClangOption, CLOption]>,
HelpText<"Disable generation of profile instrumentation.">;
def fno_profile_generate : Flag<["-"], "fno-profile-generate">,
- Group<f_Group>, Visibility<[ClangOption, CLOption, FlangOption, FC1Option]>,
+ Group<f_Group>, Visibility<[ClangOption, CLOption, FlangOption]>,
HelpText<"Disable generation of profile instrumentation.">;
def fno_profile_instr_use : Flag<["-"], "fno-profile-instr-use">,
Group<f_Group>, Visibility<[ClangOption, CLOption]>,
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index bbaeb046edc5c..6c89570920c46 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -500,15 +500,12 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions &opts,
if (const llvm::opt::Arg *a =
args.getLastArg(clang::options::OPT_fprofile_generate,
- clang::options::OPT_fprofile_generate_EQ,
- clang::options::OPT_fno_profile_generate)) {
- if (!a->getOption().matches(clang::options::OPT_fno_profile_generate)) {
- opts.setProfileInstr(llvm::driver::ProfileInstrKind::ProfileIRInstr);
- if (a->getOption().matches(clang::options::OPT_fprofile_generate_EQ)) {
- llvm::SmallString<128> path(a->getValue());
- llvm::sys::path::append(path, "default_%m.profraw");
- opts.InstrProfileOutput = std::string(path);
- }
+ clang::options::OPT_fprofile_generate_EQ)) {
+ opts.setProfileInstr(llvm::driver::ProfileInstrKind::ProfileIRInstr);
+ if (a->getOption().matches(clang::options::OPT_fprofile_generate_EQ)) {
+ llvm::SmallString<128> path(a->getValue());
+ llvm::sys::path::append(path, "default_%m.profraw");
+ opts.InstrProfileOutput = std::string(path);
}
}
diff --git a/flang/test/Profile/gcc-flag-compatibility.f90 b/flang/test/Profile/gcc-flag-compatibility.f90
index 5040cc6b721bf..ae46ed65a40e3 100644
--- a/flang/test/Profile/gcc-flag-compatibility.f90
+++ b/flang/test/Profile/gcc-flag-compatibility.f90
@@ -9,9 +9,6 @@
! RUN: rm -rf %t.gendir
! RUN: mkdir -p %t.gendir
! RUN: %flang %s -c -S -o - -emit-llvm -fprofile-generate=%t.gendir | FileCheck -check-prefix=PROFILE-GEN %s
-! RUN: %flang_fc1 -emit-llvm -fprofile-generate -fno-profile-generate -o - %s | FileCheck -check-prefix=NO-PROFILE-GEN %s
-! RUN: %flang_fc1 -emit-llvm -fno-profile-generate -fprofile-generate -o - %s | FileCheck -check-prefix=PROFILE-GEN %s
-! NO-PROFILE-GEN-NOT: @__profc_
! PROFILE-GEN: @__profc_{{_?}}main = {{(private|internal)}} global [1 x i64] zeroinitializer, section
! PROFILE-GEN: @__profd_{{_?}}main =
>From eb74b6886c9abf0265149768dd21fd56a9e74fb3 Mon Sep 17 00:00:00 2001
From: Kaviya Rajendiran <kaviyara2000 at gmail.com>
Date: Wed, 19 Aug 2026 22:58:44 +0530
Subject: [PATCH 3/4] [Flang][Driver] Addressed NIT comments
---
clang/lib/Driver/ToolChains/Flang.cpp | 4 +---
flang/test/Driver/flang-f-opts.f90 | 14 +++++++-------
flang/test/Profile/gcc-flag-compatibility.f90 | 8 ++++----
3 files changed, 12 insertions(+), 14 deletions(-)
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index ac4939db72f1a..5be6c330f9caa 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -1252,6 +1252,7 @@ static void addPGOAndCoverageFlags(const ToolChain &TC, const JobAction &JA,
}
addSplitMachineFunctionsArgs(TC.getDriver(), Args, CmdArgs, TC.getTriple());
+ Args.addAllArgs(CmdArgs, {options::OPT_fprofile_use_EQ});
}
void Flang::ConstructJob(Compilation &C, const JobAction &JA,
@@ -1384,9 +1385,6 @@ void Flang::ConstructJob(Compilation &C, const JobAction &JA,
// TODO: Handle interactions between -w, -pedantic, -Wall, -WOption
Args.AddLastArg(CmdArgs, options::OPT_w);
- // recognise options: -fprofile-use=
- Args.addAllArgs(CmdArgs, {options::OPT_fprofile_use_EQ});
-
addPGOAndCoverageFlags(TC, JA, Args, CmdArgs);
// Forward flags for OpenMP. We don't do this if the current action is an
diff --git a/flang/test/Driver/flang-f-opts.f90 b/flang/test/Driver/flang-f-opts.f90
index def17a7b15ecf..a082545206ea3 100644
--- a/flang/test/Driver/flang-f-opts.f90
+++ b/flang/test/Driver/flang-f-opts.f90
@@ -13,15 +13,15 @@
! CHECK-PROFILE-GENERATE-LLVM: "-fprofile-generate"
! RUN: rm -rf %t.pgodir && mkdir -p %t.pgodir
-! RUN: %flang -### -S -fprofile-generate=%t.pgodir %s 2>&1| FileCheck -check-prefix=CHECK-PROFILE-GENERATE-EQ %s
-! CHECK-PROFILE-GENERATE-EQ: "-fprofile-generate={{.*}}pgodir"
+! RUN: %flang -### -fprofile-generate=%t.pgodir %s 2>&1| FileCheck -check-prefix=PROFILE-GENERATE-EQ %s
+! PROFILE-GENERATE-EQ: "-fprofile-generate={{.*}}pgodir"
-! RUN: %flang -### -S -fprofile-generate -fno-profile-generate %s 2>&1 | FileCheck -check-prefix=CHECK-FNO-PROFILE-GENERATE %s
-! CHECK-FNO-PROFILE-GENERATE: "-fc1"
-! CHECK-FNO-PROFILE-GENERATE-NOT: "-fprofile-generate"
+! RUN: %flang -### -fprofile-generate -fno-profile-generate %s 2>&1 | FileCheck -check-prefix=NO-PROFILE-GENERATE %s
+! NO-PROFILE-GENERATE: "-fc1"
+! NO-PROFILE-GENERATE-NOT: "-fprofile-generate"
-! RUN: %flang -### -S -fno-profile-generate -fprofile-generate %s 2>&1 | FileCheck -check-prefix=CHECK-FPROFILE-GENERATE %s
-! CHECK-FPROFILE-GENERATE: "-fprofile-generate"
+! RUN: %flang -### -fno-profile-generate -fprofile-generate %s 2>&1 | FileCheck -check-prefix=PROFILE-GENERATE %s
+! PROFILE-GENERATE: "-fprofile-generate"
! RUN: %flang -### -S -fprofile-use=%S %s 2>&1 | FileCheck -check-prefix=CHECK-PROFILE-USE-DIR %s
! CHECK-PROFILE-USE-DIR: "-fprofile-use={{.*}}"
diff --git a/flang/test/Profile/gcc-flag-compatibility.f90 b/flang/test/Profile/gcc-flag-compatibility.f90
index ae46ed65a40e3..c7847db2f154e 100644
--- a/flang/test/Profile/gcc-flag-compatibility.f90
+++ b/flang/test/Profile/gcc-flag-compatibility.f90
@@ -5,10 +5,10 @@
! -fprofile-use=<dir>/file Uses the profile file <dir>/file
! On AIX, -flto used to be required with -fprofile-generate. gcc-flag-compatibility-aix.c is used to do the testing on AIX with -flto
-! RUN: %flang %s -c -S -o - -emit-llvm -fprofile-generate | FileCheck -check-prefix=PROFILE-GEN %s
+! RUN: %flang %s -S -emit-llvm -o - -fprofile-generate | FileCheck -check-prefix=PROFILE-GEN %s
! RUN: rm -rf %t.gendir
! RUN: mkdir -p %t.gendir
-! RUN: %flang %s -c -S -o - -emit-llvm -fprofile-generate=%t.gendir | FileCheck -check-prefix=PROFILE-GEN %s
+! RUN: %flang %s -S -emit-llvm -fprofile-generate=%t.gendir -o - | FileCheck -check-prefix=PROFILE-GEN %s
! PROFILE-GEN: @__profc_{{_?}}main = {{(private|internal)}} global [1 x i64] zeroinitializer, section
! PROFILE-GEN: @__profd_{{_?}}main =
@@ -17,9 +17,9 @@
! RUN: rm -rf %t.dir
! RUN: mkdir -p %t.dir/some/path
! RUN: llvm-profdata merge %S/Inputs/gcc-flag-compatibility_IR.proftext -o %t.dir/some/path/file.prof
-! RUN: %flang %s -o - -emit-llvm -S -fprofile-use=%t.dir/some/path/file.prof | FileCheck -check-prefix=PROFILE-USE-IR1 %s
+! RUN: %flang %s -S -emit-llvm -fprofile-use=%t.dir/some/path/file.prof -o - | FileCheck -check-prefix=PROFILE-USE-IR1 %s
! RUN: llvm-profdata merge %S/Inputs/gcc-flag-compatibility_IR_entry.proftext -o %t.dir/some/path/file.prof
-! RUN: %flang %s -o - -emit-llvm -S -fprofile-use=%t.dir/some/path/file.prof | FileCheck -check-prefix=PROFILE-USE-IR2 %s
+! RUN: %flang %s -S -emit-llvm -fprofile-use=%t.dir/some/path/file.prof -o - | FileCheck -check-prefix=PROFILE-USE-IR2 %s
! PROFILE-USE-IR1: = !{!"branch_weights", i32 100, i32 1}
! PROFILE-USE-IR2: = !{!"branch_weights", i32 1, i32 100}
>From e049a1b013c7a8f0f5e65a51fdd828b3c323c370 Mon Sep 17 00:00:00 2001
From: Kaviya Rajendiran <kaviyara2000 at gmail.com>
Date: Thu, 27 Aug 2026 14:30:12 +0530
Subject: [PATCH 4/4] [Flang][Driver] Added a TODO for resuing clang's
implementation for other PGO options
---
clang/lib/Driver/ToolChains/Flang.cpp | 3 +++
1 file changed, 3 insertions(+)
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index 5be6c330f9caa..7562206f93438 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -1244,6 +1244,9 @@ static void addPGOAndCoverageFlags(const ToolChain &TC, const JobAction &JA,
options::OPT_fno_pseudo_probe_for_profiling, false))
CmdArgs.push_back("-fpseudo-probe-for-profiling");
+ // TODO: Consider reusing Clang's addPGOAndCoverageFlags() for
+ // -fprofile-generate and other similar options handling instead of
+ // duplicating driver logic here.
if (Arg *PGOGenerateArg = Args.getLastArg(
options::OPT_fprofile_generate, options::OPT_fprofile_generate_EQ,
options::OPT_fno_profile_generate)) {
More information about the flang-commits
mailing list