https://github.com/tblah updated 
https://github.com/llvm/llvm-project/pull/207377

>From 1611b0b8bad474ecf3fb570fae267432b45b9c74 Mon Sep 17 00:00:00 2001
From: Tom Eccles <[email protected]>
Date: Fri, 3 Jul 2026 12:11:47 +0100
Subject: [PATCH 1/4] [flang][Driver] Add option for real sum reassociation

Compiler driver option for #207371: -freal-sum-reassociation. This is in
the hidden help for now. Disabled by default.

Assisted-by: Codex
---
 clang/include/clang/Options/FlangOptions.td             | 9 +++++++++
 clang/lib/Driver/ToolChains/Flang.cpp                   | 2 ++
 flang/include/flang/Frontend/CodeGenOptions.def         | 1 +
 flang/include/flang/Lower/LoweringOptions.def           | 4 ++++
 flang/lib/Frontend/CompilerInvocation.cpp               | 5 +++++
 flang/lib/Lower/Bridge.cpp                              | 6 +-----
 flang/test/Driver/frontend-forwarding.f90               | 2 ++
 flang/test/Lower/split-sum-expression-tree-lowering.f90 | 3 ++-
 8 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/clang/include/clang/Options/FlangOptions.td 
b/clang/include/clang/Options/FlangOptions.td
index 18242a465341b..d2b2a03e9eb9b 100644
--- a/clang/include/clang/Options/FlangOptions.td
+++ b/clang/include/clang/Options/FlangOptions.td
@@ -310,6 +310,15 @@ def ffast_real_mod : Flag<["-"], "ffast-real-mod">, 
Group<f_Group>,
 def fno_fast_real_mod : Flag<["-"], "fno-fast-real-mod">, Group<f_Group>,
   HelpText<"Disable optimization of MOD for REAL types in presence of 
-ffast-math">;
 
+defm real_sum_reassociation
+    : BoolOptionWithoutMarshalling<
+          "f", "real-sum-reassociation",
+          PosFlag<SetTrue, [HelpHidden], [],
+                  "Enable Fortran-standard compliant reassociation within "
+                  "individual REAL sum expressions">,
+          NegFlag<SetFalse, [HelpHidden], [],
+                  "Disable reassociation within individual REAL sum 
expressions">>;
+
 defm init_global_zero : BoolOptionWithoutMarshalling<"f", "init-global-zero",
   PosFlag<SetTrue, [], [], "Zero initialize globals without default 
initialization (default)">,
   NegFlag<SetFalse, [], [], "Do not zero initialize globals without default 
initialization">>;
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp 
b/clang/lib/Driver/ToolChains/Flang.cpp
index 662c0c8d9bd4a..d9de24fc04f9a 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -240,6 +240,8 @@ void Flang::addCodegenOptions(const ArgList &Args,
 
   Args.addOptInFlag(CmdArgs, options::OPT_fexperimental_loop_fusion,
                     options::OPT_fno_experimental_loop_fusion);
+  Args.addOptInFlag(CmdArgs, options::OPT_freal_sum_reassociation,
+                    options::OPT_fno_real_sum_reassociation);
 
   handleInterchangeLoopsArgs(Args, CmdArgs);
   handleVectorizeLoopsArgs(Args, CmdArgs);
diff --git a/flang/include/flang/Frontend/CodeGenOptions.def 
b/flang/include/flang/Frontend/CodeGenOptions.def
index a5907b6edbd97..53ddc20a6e810 100644
--- a/flang/include/flang/Frontend/CodeGenOptions.def
+++ b/flang/include/flang/Frontend/CodeGenOptions.def
@@ -54,6 +54,7 @@ CODEGENOPT(VectorizeSLP, 1, 0) ///< Enable SLP vectorization.
 CODEGENOPT(InterchangeLoops, 1, 0) ///< Enable loop interchange.
 CODEGENOPT(FuseLoops, 1, 0) ///< Enable loop fusion.
 CODEGENOPT(LoopVersioning, 1, 0) ///< Enable loop versioning.
+CODEGENOPT(SplitSumExpressionTree, 1, 0) ///< Split REAL addition expression 
trees.
 CODEGENOPT(UnrollLoops, 1, 0) ///< Enable loop unrolling
 CODEGENOPT(AliasAnalysis, 1, 0) ///< Enable alias analysis pass
 CODEGENOPT(DwarfVersion, 3, 0) ///< Dwarf version
diff --git a/flang/include/flang/Lower/LoweringOptions.def 
b/flang/include/flang/Lower/LoweringOptions.def
index e89ad75704609..0b02ffd5a3b22 100644
--- a/flang/include/flang/Lower/LoweringOptions.def
+++ b/flang/include/flang/Lower/LoweringOptions.def
@@ -35,6 +35,10 @@ ENUM_LOWERINGOPT(Underscoring, unsigned, 1, 1)
 /// On by default.
 ENUM_LOWERINGOPT(ProtectParens, unsigned, 1, 1)
 
+/// If true, split REAL addition expression trees.
+/// Off by default.
+ENUM_LOWERINGOPT(SplitSumExpressionTree, unsigned, 1, 0)
+
 /// If true, assume the behavior of integer overflow is defined
 /// (i.e. wraps around as two's complement). Off by default.
 ENUM_LOWERINGOPT(IntegerWrapAround, unsigned, 1, 0)
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp 
b/flang/lib/Frontend/CompilerInvocation.cpp
index cbb094106298f..79ad08353b64c 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -299,6 +299,10 @@ static void 
parseCodeGenArgs(Fortran::frontend::CodeGenOptions &opts,
                    clang::options::OPT_fno_safe_trampoline, false))
     opts.EnableSafeTrampoline = 1;
 
+  if (args.hasFlag(clang::options::OPT_freal_sum_reassociation,
+                   clang::options::OPT_fno_real_sum_reassociation, false))
+    opts.SplitSumExpressionTree = 1;
+
   if (args.getLastArg(clang::options::OPT_floop_interchange))
     opts.InterchangeLoops = 1;
 
@@ -2002,6 +2006,7 @@ void CompilerInvocation::setLoweringOptions() {
   loweringOpts.setIntegerWrapAround(langOptions.getSignedOverflowBehavior() ==
                                     Fortran::common::LangOptions::SOB_Defined);
   loweringOpts.setProtectParens(codegenOpts.ProtectParens);
+  loweringOpts.setSplitSumExpressionTree(codegenOpts.SplitSumExpressionTree);
   Fortran::common::MathOptionsBase &mathOpts = loweringOpts.getMathOptions();
   // TODO: when LangOptions are finalized, we can represent
   //       the math related options using Fortran::commmon::MathOptionsBase,
diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp
index a7676b78b7808..04c06f3278470 100644
--- a/flang/lib/Lower/Bridge.cpp
+++ b/flang/lib/Lower/Bridge.cpp
@@ -91,10 +91,6 @@ static llvm::cl::opt<bool> forceLoopToExecuteOnce(
     "always-execute-loop-body", llvm::cl::init(false),
     llvm::cl::desc("force the body of a loop to execute at least once"));
 
-static llvm::cl::opt<bool> enableSplitSumExpressionTreeLowering(
-    "enable-split-sum-expression-tree-lowering", llvm::cl::Hidden,
-    llvm::cl::desc("Enable experimental split sum expression tree lowering"));
-
 namespace {
 /// Information for generating a structured or unstructured increment loop.
 struct IncrementLoopInfo {
@@ -5575,7 +5571,7 @@ class FirConverter : public 
Fortran::lower::AbstractConverter {
     auto evaluateRhs = [&](Fortran::lower::StatementContext &stmtCtx) {
       const Fortran::lower::SomeExpr *rhsExpr = &assign.rhs;
       std::optional<Fortran::lower::SomeExpr> rewritten;
-      if (enableSplitSumExpressionTreeLowering &&
+      if (bridge.getLoweringOptions().getSplitSumExpressionTree() &&
           Fortran::evaluate::CanBuildSplitSumExpressionTree(assign.lhs,
                                                             assign.rhs)) {
         rewritten =
diff --git a/flang/test/Driver/frontend-forwarding.f90 
b/flang/test/Driver/frontend-forwarding.f90
index 2cc5524d351ff..63982f9bdcb9c 100644
--- a/flang/test/Driver/frontend-forwarding.f90
+++ b/flang/test/Driver/frontend-forwarding.f90
@@ -20,6 +20,7 @@
 ! RUN:     -fomit-frame-pointer \
 ! RUN:     -fpass-plugin=Bye%pluginext \
 ! RUN:     -fversion-loops-for-stride \
+! RUN:     -freal-sum-reassociation \
 ! RUN:     -fno-ppc-native-vector-element-order \
 ! RUN:     -fppc-native-vector-element-order \
 ! RUN:     -mllvm -print-before-all \
@@ -50,6 +51,7 @@
 ! CHECK: "-freciprocal-math"
 ! CHECK: "-fconvert=little-endian"
 ! CHECK: "-fpass-plugin=Bye
+! CHECK: "-freal-sum-reassociation"
 ! CHECK: "-fversion-loops-for-stride"
 ! CHECK: "-fno-ppc-native-vector-element-order"
 ! CHECK: "-fppc-native-vector-element-order"
diff --git a/flang/test/Lower/split-sum-expression-tree-lowering.f90 
b/flang/test/Lower/split-sum-expression-tree-lowering.f90
index e6287533ed75e..2e50cf72136a3 100644
--- a/flang/test/Lower/split-sum-expression-tree-lowering.f90
+++ b/flang/test/Lower/split-sum-expression-tree-lowering.f90
@@ -1,4 +1,5 @@
-! RUN: %flang_fc1 -emit-hlfir -mllvm 
-enable-split-sum-expression-tree-lowering -o - %s | FileCheck %s 
--check-prefixes=SPLIT,NO-REWRITE
+! RUN: %flang_fc1 -emit-hlfir -freal-sum-reassociation -o - %s | FileCheck %s 
--check-prefixes=SPLIT,NO-REWRITE
+! RUN: %flang_fc1 -emit-hlfir -freal-sum-reassociation 
-fno-real-sum-reassociation -o - %s | FileCheck %s 
--check-prefixes=DEFAULT,NO-REWRITE
 ! RUN: %flang_fc1 -emit-hlfir -o - %s | FileCheck %s 
--check-prefixes=DEFAULT,NO-REWRITE
 
 ! Default:   (((x + a*b) + c*d) + e*f)

>From 52fddd65aba2b9f8db7e601a53627a1ace0dd7e3 Mon Sep 17 00:00:00 2001
From: Tom Eccles <[email protected]>
Date: Tue, 7 Jul 2026 16:33:41 +0100
Subject: [PATCH 2/4] Make the option visible in --help

---
 clang/include/clang/Options/FlangOptions.td | 16 ++++++++++++----
 flang/test/Driver/driver-help.f90           |  6 ++++++
 2 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/clang/include/clang/Options/FlangOptions.td 
b/clang/include/clang/Options/FlangOptions.td
index d2b2a03e9eb9b..bafc063663fe2 100644
--- a/clang/include/clang/Options/FlangOptions.td
+++ b/clang/include/clang/Options/FlangOptions.td
@@ -313,11 +313,19 @@ def fno_fast_real_mod : Flag<["-"], "fno-fast-real-mod">, 
Group<f_Group>,
 defm real_sum_reassociation
     : BoolOptionWithoutMarshalling<
           "f", "real-sum-reassociation",
-          PosFlag<SetTrue, [HelpHidden], [],
+          PosFlag<SetTrue, [], [],
                   "Enable Fortran-standard compliant reassociation within "
-                  "individual REAL sum expressions">,
-          NegFlag<SetFalse, [HelpHidden], [],
-                  "Disable reassociation within individual REAL sum 
expressions">>;
+                  "individual REAL sum expressions. This may change exact "
+                  "floating-point results">,
+          NegFlag<SetFalse, [], [],
+                  "Disable reassociation within individual REAL sum "
+                  "expressions">>,
+      DocBrief<[{
+        Enable Fortran-standard compliant reassociation within individual
+        ``REAL`` sum expressions. This can improve optimization opportunities
+        and may change exact floating-point results while preserving
+        standard-conforming Fortran semantics.
+      }]>;
 
 defm init_global_zero : BoolOptionWithoutMarshalling<"f", "init-global-zero",
   PosFlag<SetTrue, [], [], "Zero initialize globals without default 
initialization (default)">,
diff --git a/flang/test/Driver/driver-help.f90 
b/flang/test/Driver/driver-help.f90
index 4c3609db80b9a..e77fc460850b2 100644
--- a/flang/test/Driver/driver-help.f90
+++ b/flang/test/Driver/driver-help.f90
@@ -7,9 +7,15 @@
 ! HELP:USAGE: flang
 ! HELP-EMPTY:
 ! HELP-NEXT:OPTIONS:
+! HELP: -freal-sum-reassociation
+! HELP: Enable Fortran-standard compliant reassociation within individual REAL 
sum expressions
+! HELP: may change exact floating-point results
 
 ! HELP-FC1:USAGE: flang
 ! HELP-FC1-EMPTY:
 ! HELP-FC1-NEXT:OPTIONS:
+! HELP-FC1: -freal-sum-reassociation
+! HELP-FC1: Enable Fortran-standard compliant reassociation within individual 
REAL sum expressions
+! HELP-FC1: may change exact floating-point results
 
 ! ERROR: error: unknown argument '-helps'; did you mean '-help'

>From 4b8663d61eb826fa2df0e6cd6024b44ef71c4c5a Mon Sep 17 00:00:00 2001
From: Tom Eccles <[email protected]>
Date: Tue, 7 Jul 2026 17:17:37 +0100
Subject: [PATCH 3/4] Test real sum flag ordering

Move the ordering coverage for -freal-sum-reassociation and its negative
form into the driver forwarding test. Keep the lowering test to separate
fc1 checks for enabled, disabled, and default behavior.

Assisted-by: Codex
---
 flang/test/Driver/frontend-forwarding.f90             | 11 +++++++++++
 .../test/Lower/split-sum-expression-tree-lowering.f90 |  2 +-
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/flang/test/Driver/frontend-forwarding.f90 
b/flang/test/Driver/frontend-forwarding.f90
index 63982f9bdcb9c..905bdeb453e1f 100644
--- a/flang/test/Driver/frontend-forwarding.f90
+++ b/flang/test/Driver/frontend-forwarding.f90
@@ -65,3 +65,14 @@
 ! CHECK: "-mllvm" "-print-before-all"
 ! CHECK: "-fwrapv"
 ! CHECK: "-save-temps=obj"
+
+! RUN: %flang -fsyntax-only -### %s -o %t 2>&1 \
+! RUN:     -fno-real-sum-reassociation -freal-sum-reassociation \
+! RUN:   | FileCheck %s --check-prefix=REAL-SUM
+! REAL-SUM: "-fc1"{{.*}} "-freal-sum-reassociation"
+
+! RUN: %flang -fsyntax-only -### %s -o %t 2>&1 \
+! RUN:     -freal-sum-reassociation -fno-real-sum-reassociation \
+! RUN:   | FileCheck %s --check-prefix=NO-REAL-SUM
+! NO-REAL-SUM: "-fc1"
+! NO-REAL-SUM-NOT: "-freal-sum-reassociation"
diff --git a/flang/test/Lower/split-sum-expression-tree-lowering.f90 
b/flang/test/Lower/split-sum-expression-tree-lowering.f90
index 2e50cf72136a3..dc89793f7832d 100644
--- a/flang/test/Lower/split-sum-expression-tree-lowering.f90
+++ b/flang/test/Lower/split-sum-expression-tree-lowering.f90
@@ -1,5 +1,5 @@
 ! RUN: %flang_fc1 -emit-hlfir -freal-sum-reassociation -o - %s | FileCheck %s 
--check-prefixes=SPLIT,NO-REWRITE
-! RUN: %flang_fc1 -emit-hlfir -freal-sum-reassociation 
-fno-real-sum-reassociation -o - %s | FileCheck %s 
--check-prefixes=DEFAULT,NO-REWRITE
+! RUN: %flang_fc1 -emit-hlfir -fno-real-sum-reassociation -o - %s | FileCheck 
%s --check-prefixes=DEFAULT,NO-REWRITE
 ! RUN: %flang_fc1 -emit-hlfir -o - %s | FileCheck %s 
--check-prefixes=DEFAULT,NO-REWRITE
 
 ! Default:   (((x + a*b) + c*d) + e*f)

>From 889ce8f92f65c39f45021f5305feefa0c5a235f1 Mon Sep 17 00:00:00 2001
From: Tom Eccles <[email protected]>
Date: Tue, 7 Jul 2026 17:46:46 +0100
Subject: [PATCH 4/4] Move into separate test

Assisted-by: Codex
---
 flang/test/Driver/frontend-forwarding.f90    | 13 ---------
 flang/test/Driver/real-sum-reassociation.f90 | 29 ++++++++++++++++++++
 2 files changed, 29 insertions(+), 13 deletions(-)
 create mode 100644 flang/test/Driver/real-sum-reassociation.f90

diff --git a/flang/test/Driver/frontend-forwarding.f90 
b/flang/test/Driver/frontend-forwarding.f90
index 905bdeb453e1f..2cc5524d351ff 100644
--- a/flang/test/Driver/frontend-forwarding.f90
+++ b/flang/test/Driver/frontend-forwarding.f90
@@ -20,7 +20,6 @@
 ! RUN:     -fomit-frame-pointer \
 ! RUN:     -fpass-plugin=Bye%pluginext \
 ! RUN:     -fversion-loops-for-stride \
-! RUN:     -freal-sum-reassociation \
 ! RUN:     -fno-ppc-native-vector-element-order \
 ! RUN:     -fppc-native-vector-element-order \
 ! RUN:     -mllvm -print-before-all \
@@ -51,7 +50,6 @@
 ! CHECK: "-freciprocal-math"
 ! CHECK: "-fconvert=little-endian"
 ! CHECK: "-fpass-plugin=Bye
-! CHECK: "-freal-sum-reassociation"
 ! CHECK: "-fversion-loops-for-stride"
 ! CHECK: "-fno-ppc-native-vector-element-order"
 ! CHECK: "-fppc-native-vector-element-order"
@@ -65,14 +63,3 @@
 ! CHECK: "-mllvm" "-print-before-all"
 ! CHECK: "-fwrapv"
 ! CHECK: "-save-temps=obj"
-
-! RUN: %flang -fsyntax-only -### %s -o %t 2>&1 \
-! RUN:     -fno-real-sum-reassociation -freal-sum-reassociation \
-! RUN:   | FileCheck %s --check-prefix=REAL-SUM
-! REAL-SUM: "-fc1"{{.*}} "-freal-sum-reassociation"
-
-! RUN: %flang -fsyntax-only -### %s -o %t 2>&1 \
-! RUN:     -freal-sum-reassociation -fno-real-sum-reassociation \
-! RUN:   | FileCheck %s --check-prefix=NO-REAL-SUM
-! NO-REAL-SUM: "-fc1"
-! NO-REAL-SUM-NOT: "-freal-sum-reassociation"
diff --git a/flang/test/Driver/real-sum-reassociation.f90 
b/flang/test/Driver/real-sum-reassociation.f90
new file mode 100644
index 0000000000000..82773e0358237
--- /dev/null
+++ b/flang/test/Driver/real-sum-reassociation.f90
@@ -0,0 +1,29 @@
+! Test driver handling of -freal-sum-reassociation and
+! -fno-real-sum-reassociation.
+
+! RUN: %flang -fsyntax-only -### %s -o %t 2>&1 \
+! RUN:   | FileCheck %s --check-prefix=DEFAULT
+! DEFAULT: "-fc1"
+! DEFAULT-NOT: "-freal-sum-reassociation"
+
+! RUN: %flang -fsyntax-only -### %s -o %t 2>&1 \
+! RUN:     -freal-sum-reassociation \
+! RUN:   | FileCheck %s --check-prefix=ENABLE
+! ENABLE: "-fc1"{{.*}} "-freal-sum-reassociation"
+
+! RUN: %flang -fsyntax-only -### %s -o %t 2>&1 \
+! RUN:     -fno-real-sum-reassociation \
+! RUN:   | FileCheck %s --check-prefix=DISABLE
+! DISABLE: "-fc1"
+! DISABLE-NOT: "-freal-sum-reassociation"
+
+! RUN: %flang -fsyntax-only -### %s -o %t 2>&1 \
+! RUN:     -fno-real-sum-reassociation -freal-sum-reassociation \
+! RUN:   | FileCheck %s --check-prefix=ENABLE-LAST
+! ENABLE-LAST: "-fc1"{{.*}} "-freal-sum-reassociation"
+
+! RUN: %flang -fsyntax-only -### %s -o %t 2>&1 \
+! RUN:     -freal-sum-reassociation -fno-real-sum-reassociation \
+! RUN:   | FileCheck %s --check-prefix=DISABLE-LAST
+! DISABLE-LAST: "-fc1"
+! DISABLE-LAST-NOT: "-freal-sum-reassociation"

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to