[flang-commits] [clang] [flang] [flang] Add -finit-local= to initialize automatic variables (PR #216164)

via flang-commits flang-commits at lists.llvm.org
Thu Aug 13 13:06:55 PDT 2026


github-actions[bot] wrote:

<!--LLVM CODE FORMAT COMMENT: {clang-format}-->


:warning: C/C++ code formatter, clang-format found issues in your code. :warning:

<details>
<summary>
You can test this locally with the following command:
</summary>

``````````bash
git-clang-format --diff origin/main HEAD --extensions cpp,h -- clang/lib/Driver/ToolChains/Flang.cpp flang/include/flang/Lower/LoweringOptions.h flang/lib/Frontend/CompilerInvocation.cpp flang/lib/Lower/ConvertVariable.cpp flang/tools/bbc/bbc.cpp --diff_from_common_commit
``````````

:warning:
The reproduction instructions above might return results for more than one PR
in a stack if you are using a stacked PR workflow. You can limit the results by
changing `origin/main` to the base branch/commit you want to compare against.
:warning:

</details>

<details>
<summary>
View the diff from clang-format here.
</summary>

``````````diff
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index 2928b62f9..096c592be 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -360,8 +360,7 @@ void Flang::addCodegenOptions(const ArgList &Args,
        options::OPT_fno_ppc_native_vec_elem_order,
        options::OPT_fppc_native_vec_elem_order, options::OPT_finit_global_zero,
        options::OPT_fno_init_global_zero, options::OPT_finit_local_EQ,
-       options::OPT_frepack_arrays,
-       options::OPT_fno_repack_arrays,
+       options::OPT_frepack_arrays, options::OPT_fno_repack_arrays,
        options::OPT_frepack_arrays_contiguity_EQ,
        options::OPT_fstack_repack_arrays, options::OPT_fno_stack_repack_arrays,
        options::OPT_ftime_report, options::OPT_ftime_report_EQ,
diff --git a/flang/include/flang/Lower/LoweringOptions.h b/flang/include/flang/Lower/LoweringOptions.h
index 14f38ea77..7f24c02c5 100644
--- a/flang/include/flang/Lower/LoweringOptions.h
+++ b/flang/include/flang/Lower/LoweringOptions.h
@@ -16,22 +16,21 @@
 #define FLANG_LOWER_LOWERINGOPTIONS_H
 
 #include "flang/Support/FPMaxminBehavior.h"
-#include <cstdint>
 #include "flang/Support/MathOptionsBase.h"
+#include <cstdint>
 
 namespace Fortran::lower {
 
 /// Initialization mode for automatic (local) variables without explicit
 /// or default initialization, selected via -finit-local=.
 enum class InitLocalKind {
-  Off,   ///< No initialization (default)
-  Zero,  ///< Fill with 0x00 bytes
-  Hex,   ///< Fill with a user-supplied byte pattern
-  QNaN,  ///< Quiet NaN for FP; 0xAA byte-splat for non-FP types
-  SNaN,  ///< Signalling NaN for FP; 0xAA byte-splat for non-FP types
+  Off,  ///< No initialization (default)
+  Zero, ///< Fill with 0x00 bytes
+  Hex,  ///< Fill with a user-supplied byte pattern
+  QNaN, ///< Quiet NaN for FP; 0xAA byte-splat for non-FP types
+  SNaN, ///< Signalling NaN for FP; 0xAA byte-splat for non-FP types
 };
 
-
 class LoweringOptionsBase {
 public:
 #define LOWERINGOPT(Name, Bits, Default) unsigned Name : Bits;
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index d21b8f55f..5380a51a1 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -1762,24 +1762,19 @@ bool CompilerInvocation::createFromArgs(
           args.getLastArg(clang::options::OPT_finit_local_EQ)) {
     llvm::StringRef val = a->getValue();
     if (val == "zero") {
-      invoc.loweringOpts.setInitLocalMode(
-          Fortran::lower::InitLocalKind::Zero);
+      invoc.loweringOpts.setInitLocalMode(Fortran::lower::InitLocalKind::Zero);
     } else if (val == "nan") {
-      invoc.loweringOpts.setInitLocalMode(
-          Fortran::lower::InitLocalKind::QNaN);
+      invoc.loweringOpts.setInitLocalMode(Fortran::lower::InitLocalKind::QNaN);
     } else if (val == "snan") {
-      invoc.loweringOpts.setInitLocalMode(
-          Fortran::lower::InitLocalKind::SNaN);
+      invoc.loweringOpts.setInitLocalMode(Fortran::lower::InitLocalKind::SNaN);
     } else if (val.starts_with("0x") || val.starts_with("0X")) {
       unsigned long long hexVal = 0;
       if (val.drop_front(2).getAsInteger(16, hexVal) || hexVal > 0xFF) {
         diags.Report(clang::diag::err_drv_invalid_value)
             << a->getAsString(args) << val;
       } else {
-        invoc.loweringOpts.setInitLocalMode(
-            Fortran::lower::InitLocalKind::Hex);
-        invoc.loweringOpts.setInitLocalPattern(
-            static_cast<uint8_t>(hexVal));
+        invoc.loweringOpts.setInitLocalMode(Fortran::lower::InitLocalKind::Hex);
+        invoc.loweringOpts.setInitLocalPattern(static_cast<uint8_t>(hexVal));
       }
     } else {
       diags.Report(clang::diag::err_drv_invalid_value)
diff --git a/flang/lib/Lower/ConvertVariable.cpp b/flang/lib/Lower/ConvertVariable.cpp
index 2ebd03dd8..03ebe82cb 100644
--- a/flang/lib/Lower/ConvertVariable.cpp
+++ b/flang/lib/Lower/ConvertVariable.cpp
@@ -11,7 +11,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Lower/ConvertVariable.h"
-#include "flang/Lower/LoweringOptions.h"
 #include "flang/Lower/AbstractConverter.h"
 #include "flang/Lower/Allocatable.h"
 #include "flang/Lower/BoxAnalyzer.h"
@@ -20,6 +19,7 @@
 #include "flang/Lower/ConvertConstant.h"
 #include "flang/Lower/ConvertExprToHLFIR.h"
 #include "flang/Lower/ConvertProcedureDesignator.h"
+#include "flang/Lower/LoweringOptions.h"
 #include "flang/Lower/Mangler.h"
 #include "flang/Lower/MultiImageFortran.h"
 #include "flang/Lower/OpenACC.h"
@@ -46,11 +46,11 @@
 #include "flang/Runtime/allocator-registry-consts.h"
 #include "flang/Semantics/tools.h"
 #include "flang/Semantics/type.h"
+#include "mlir/Dialect/Complex/IR/Complex.h"
 #include "mlir/Dialect/OpenACC/OpenACC.h"
-#include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/APFloat.h"
 #include "llvm/ADT/APInt.h"
-#include "mlir/Dialect/Complex/IR/Complex.h"
+#include "llvm/ADT/SmallVector.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/Debug.h"
 #include <optional>
@@ -1262,8 +1262,7 @@ getSafeRepackAttrs(Fortran::lower::AbstractConverter &converter) {
 /// -finit-local= initialization. Excluded: variables without a symbol,
 /// globals, dummy arguments, SAVE'd vars, ALLOCATABLE/POINTER, vars in
 /// an EQUIVALENCE set, and vars with explicit or default initialization.
-static bool
-shouldInitLocal(const Fortran::lower::pft::Variable &var) {
+static bool shouldInitLocal(const Fortran::lower::pft::Variable &var) {
   if (!var.hasSymbol() || var.isGlobal())
     return false;
   const Fortran::semantics::Symbol &sym = var.getSymbol();
@@ -1315,7 +1314,7 @@ static mlir::Value genByteSplatInit(fir::FirOpBuilder &builder,
     mlir::Type partTy = cplxTy.getElementType();
     mlir::Value partVal = genByteSplatInit(builder, loc, partTy, bytePat);
     return mlir::complex::CreateOp::create(builder, loc, cplxTy, partVal,
-                                                   partVal);
+                                           partVal);
   }
   // TODO: CHARACTER falls back to zero; a future improvement should fill each
   // storage unit with the byte pattern.
@@ -1330,11 +1329,9 @@ static mlir::Value genFPNaNInit(fir::FirOpBuilder &builder, mlir::Location loc,
   const llvm::fltSemantics &sem = fpTy.getFloatSemantics();
   // All-ones payload (precision-1 mantissa bits), negative sign, per RFC.
   llvm::APInt payload = llvm::APInt::getAllOnes(sem.precision - 1);
-  llvm::APFloat apf = isSignalling
-                          ? llvm::APFloat::getSNaN(sem, /*Negative=*/true,
-                                                   &payload)
-                          : llvm::APFloat::getQNaN(sem, /*Negative=*/true,
-                                                   &payload);
+  llvm::APFloat apf =
+      isSignalling ? llvm::APFloat::getSNaN(sem, /*Negative=*/true, &payload)
+                   : llvm::APFloat::getQNaN(sem, /*Negative=*/true, &payload);
   return mlir::arith::ConstantFloatOp::create(builder, loc, fpTy, apf);
 }
 
@@ -1342,11 +1339,11 @@ static mlir::Value genFPNaNInit(fir::FirOpBuilder &builder, mlir::Location loc,
 /// Complex types get NaN on both parts; other non-FP types use 0xAA byte-splat
 /// for nan/snan modes.
 static void genInitLocalStore(fir::FirOpBuilder &builder, mlir::Location loc,
-                               mlir::Type ty, mlir::Value addr,
-                               Fortran::lower::InitLocalKind mode,
-                               uint8_t hexByte) {
+                              mlir::Type ty, mlir::Value addr,
+                              Fortran::lower::InitLocalKind mode,
+                              uint8_t hexByte) {
   mlir::Value val;
-  auto fpTy   = mlir::dyn_cast<mlir::FloatType>(ty);
+  auto fpTy = mlir::dyn_cast<mlir::FloatType>(ty);
   auto cplxTy = mlir::dyn_cast<mlir::ComplexType>(ty);
   switch (mode) {
   case Fortran::lower::InitLocalKind::Zero:
@@ -1363,7 +1360,7 @@ static void genInitLocalStore(fir::FirOpBuilder &builder, mlir::Location loc,
       mlir::Value nanPart =
           genFPNaNInit(builder, loc, partFpTy, /*signalling=*/false);
       val = mlir::complex::CreateOp::create(builder, loc, cplxTy, nanPart,
-                                                    nanPart);
+                                            nanPart);
     } else {
       val = genByteSplatInit(builder, loc, ty, 0xAA);
     }
@@ -1376,7 +1373,7 @@ static void genInitLocalStore(fir::FirOpBuilder &builder, mlir::Location loc,
       mlir::Value nanPart =
           genFPNaNInit(builder, loc, partFpTy, /*signalling=*/true);
       val = mlir::complex::CreateOp::create(builder, loc, cplxTy, nanPart,
-                                                    nanPart);
+                                            nanPart);
     } else {
       val = genByteSplatInit(builder, loc, ty, 0xAA);
     }
@@ -1412,7 +1409,7 @@ static void genInitLocal(Fortran::lower::AbstractConverter &converter,
   if (auto seqTy = mlir::dyn_cast<fir::SequenceType>(storeTy)) {
     // Array: build element constant and use insert_on_range.
     mlir::Type eleTy = seqTy.getEleTy();
-    auto fpTy   = mlir::dyn_cast<mlir::FloatType>(eleTy);
+    auto fpTy = mlir::dyn_cast<mlir::FloatType>(eleTy);
     auto cplxTy = mlir::dyn_cast<mlir::ComplexType>(eleTy);
     mlir::Value elePat;
     switch (mode) {
@@ -1429,7 +1426,7 @@ static void genInitLocal(Fortran::lower::AbstractConverter &converter,
         auto partFpTy = mlir::cast<mlir::FloatType>(cplxTy.getElementType());
         mlir::Value nanPart = genFPNaNInit(builder, loc, partFpTy, false);
         elePat = mlir::complex::CreateOp::create(builder, loc, cplxTy, nanPart,
-                                                         nanPart);
+                                                 nanPart);
       } else
         elePat = genByteSplatInit(builder, loc, eleTy, 0xAA);
       break;
@@ -1440,7 +1437,7 @@ static void genInitLocal(Fortran::lower::AbstractConverter &converter,
         auto partFpTy = mlir::cast<mlir::FloatType>(cplxTy.getElementType());
         mlir::Value nanPart = genFPNaNInit(builder, loc, partFpTy, true);
         elePat = mlir::complex::CreateOp::create(builder, loc, cplxTy, nanPart,
-                                                         nanPart);
+                                                 nanPart);
       } else
         elePat = genByteSplatInit(builder, loc, eleTy, 0xAA);
       break;
@@ -1460,9 +1457,9 @@ static void genInitLocal(Fortran::lower::AbstractConverter &converter,
     }
     if (!hasUnknown) {
       mlir::Value arrVal = fir::UndefOp::create(builder, loc, seqTy);
-      arrVal = fir::InsertOnRangeOp::create(
-          builder, loc, seqTy, arrVal, elePat,
-          builder.getIndexVectorAttr(rangeBounds));
+      arrVal =
+          fir::InsertOnRangeOp::create(builder, loc, seqTy, arrVal, elePat,
+                                       builder.getIndexVectorAttr(rangeBounds));
       fir::StoreOp::create(builder, loc, arrVal, base);
     }
   } else if (auto recTy = mlir::dyn_cast<fir::RecordType>(storeTy)) {
@@ -1475,9 +1472,9 @@ static void genInitLocal(Fortran::lower::AbstractConverter &converter,
         auto fieldIdx = fir::FieldIndexOp::create(
             builder, loc, fir::FieldType::get(recTy.getContext()), fieldName,
             recTy, mlir::ValueRange{});
-        mlir::Value fieldAddr = fir::CoordinateOp::create(
-            builder, loc, builder.getRefType(fieldTy), base,
-            mlir::ValueRange{fieldIdx});
+        mlir::Value fieldAddr =
+            fir::CoordinateOp::create(builder, loc, builder.getRefType(fieldTy),
+                                      base, mlir::ValueRange{fieldIdx});
         genInitLocalStore(builder, loc, fieldTy, fieldAddr, mode, hexByte);
       }
     }
diff --git a/flang/tools/bbc/bbc.cpp b/flang/tools/bbc/bbc.cpp
index 9f2225ab2..0bf66c72c 100644
--- a/flang/tools/bbc/bbc.cpp
+++ b/flang/tools/bbc/bbc.cpp
@@ -272,17 +272,18 @@ static llvm::cl::opt<bool> initGlobalZero(
     llvm::cl::desc("Zero initialize globals without default initialization"),
     llvm::cl::init(true));
 
-static llvm::cl::opt<std::string> initLocalMode(
-    "finit-local",
-    llvm::cl::desc(
-        "Initialize local variables without explicit or default initialization. "
-        "Accepts: zero, nan, snan, or 0x<hex-byte>."),
-    llvm::cl::init(""));
+static llvm::cl::opt<std::string>
+    initLocalMode("finit-local",
+                  llvm::cl::desc("Initialize local variables without explicit "
+                                 "or default initialization. "
+                                 "Accepts: zero, nan, snan, or 0x<hex-byte>."),
+                  llvm::cl::init(""));
 
 static llvm::cl::opt<bool> initLocalZero(
     "finit-local-zero",
-    llvm::cl::desc("Zero-initialize local variables without explicit or default "
-                   "initialization (alias for -finit-local=zero)"),
+    llvm::cl::desc(
+        "Zero-initialize local variables without explicit or default "
+        "initialization (alias for -finit-local=zero)"),
     llvm::cl::init(false));
 
 static llvm::cl::opt<bool>

``````````

</details>


https://github.com/llvm/llvm-project/pull/216164


More information about the flang-commits mailing list