[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