[flang-commits] [flang] [flang] Set common linkage to common block with zero initializer (PR #179548)

Valentin Clement バレンタイン クレメン via flang-commits flang-commits at lists.llvm.org
Tue Feb 3 13:03:00 PST 2026


https://github.com/clementval updated https://github.com/llvm/llvm-project/pull/179548

>From e850c7f09867ba2cb93959b82f99fd6fbe2bd938 Mon Sep 17 00:00:00 2001
From: Valentin Clement <clementval at gmail.com>
Date: Tue, 3 Feb 2026 12:12:49 -0800
Subject: [PATCH 1/2] [flang] Set common linkage to common block with zero
 initializer

---
 flang/lib/Optimizer/CodeGen/CodeGen.cpp   |  8 ++++++++
 flang/test/Fir/common-block-zero-init.fir | 12 ++++++++++++
 2 files changed, 20 insertions(+)
 create mode 100644 flang/test/Fir/common-block-zero-init.fir

diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
index 625701725003f..619ff61b7927b 100644
--- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp
+++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
@@ -3323,7 +3323,10 @@ struct GlobalOpConversion : public fir::FIROpConversion<fir::GlobalOp> {
       // Replace insert_on_range with a constant dense attribute if the
       // initialization is on the full range.
       auto insertOnRangeOps = gr.front().getOps<fir::InsertOnRangeOp>();
+      unsigned nbZeroInitializers = 0;
+      unsigned nbRanges = 0;
       for (auto insertOp : insertOnRangeOps) {
+        ++nbRanges;
         if (insertOp.isFullRange()) {
           auto seqTyAttr = convertType(insertOp.getType());
           auto *op = insertOp.getVal().getDefiningOp();
@@ -3342,8 +3345,13 @@ struct GlobalOpConversion : public fir::FIROpConversion<fir::GlobalOp> {
           rewriter.setInsertionPointAfter(insertOp);
           rewriter.replaceOpWithNewOp<mlir::arith::ConstantOp>(
               insertOp, seqTyAttr, denseAttr);
+          if (auto intAttr = mlir::dyn_cast<mlir::IntegerAttr>(constant.getValue()))
+            if (intAttr.getInt() == 0)
+              ++nbZeroInitializers;
         }
       }
+      if (nbRanges > 0 && nbRanges == nbZeroInitializers && linkage == mlir::LLVM::Linkage::External)
+        g.setLinkage(mlir::LLVM::Linkage::Common);
     }
 
     if (global.getDataAttr() &&
diff --git a/flang/test/Fir/common-block-zero-init.fir b/flang/test/Fir/common-block-zero-init.fir
new file mode 100644
index 0000000000000..cb24d9b430054
--- /dev/null
+++ b/flang/test/Fir/common-block-zero-init.fir
@@ -0,0 +1,12 @@
+  // RUN: %flang_fc1 -emit-llvm %s -o - | FileCheck %s
+  
+  fir.global @cdb_com_ {acc.declare = #acc.declare<dataClause =  acc_create>, alignment = 4 : i64} : tuple<!fir.array<100xi32>> {
+    %c0_i32 = arith.constant 0 : i32
+    %0 = fir.zero_bits tuple<!fir.array<100xi32>>
+    %1 = fir.undefined !fir.array<100xi32>
+    %2 = fir.insert_on_range %1, %c0_i32 from (0) to (99) : (!fir.array<100xi32>, i32) -> !fir.array<100xi32>
+    %3 = fir.insert_value %0, %2, [0 : index] : (tuple<!fir.array<100xi32>>, !fir.array<100xi32>) -> tuple<!fir.array<100xi32>>
+    fir.has_value %3 : tuple<!fir.array<100xi32>>
+  }
+
+// CHECK-LABEL: @cdb_com_ = common global { [100 x i32] } zeroinitializer

>From b5dd2519c9a9171c6fbd5888872c149b20c198be Mon Sep 17 00:00:00 2001
From: Valentin Clement <clementval at gmail.com>
Date: Tue, 3 Feb 2026 13:02:47 -0800
Subject: [PATCH 2/2] format

---
 flang/lib/Optimizer/CodeGen/CodeGen.cpp | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
index 619ff61b7927b..faf722b554df4 100644
--- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp
+++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
@@ -3345,12 +3345,14 @@ struct GlobalOpConversion : public fir::FIROpConversion<fir::GlobalOp> {
           rewriter.setInsertionPointAfter(insertOp);
           rewriter.replaceOpWithNewOp<mlir::arith::ConstantOp>(
               insertOp, seqTyAttr, denseAttr);
-          if (auto intAttr = mlir::dyn_cast<mlir::IntegerAttr>(constant.getValue()))
+          if (auto intAttr =
+                  mlir::dyn_cast<mlir::IntegerAttr>(constant.getValue()))
             if (intAttr.getInt() == 0)
               ++nbZeroInitializers;
         }
       }
-      if (nbRanges > 0 && nbRanges == nbZeroInitializers && linkage == mlir::LLVM::Linkage::External)
+      if (nbRanges > 0 && nbRanges == nbZeroInitializers &&
+          linkage == mlir::LLVM::Linkage::External)
         g.setLinkage(mlir::LLVM::Linkage::Common);
     }
 



More information about the flang-commits mailing list