[flang-commits] [flang] [FLANG] Solving issue with adjustr intrinsic in where construct (PR #146851)

via flang-commits flang-commits at lists.llvm.org
Mon Aug 18 05:14:00 PDT 2025


https://github.com/EbinJose2002 updated https://github.com/llvm/llvm-project/pull/146851

>From 87685165d5b207058620f714f4c22fd57e241ff1 Mon Sep 17 00:00:00 2001
From: EbinJose2002 <ebin.jose at multicorewareinc.com>
Date: Tue, 1 Jul 2025 18:11:05 +0530
Subject: [PATCH 1/5] Removed unnecessary handling of reference to boxchar
 conversion in BufferizeHLFIR.cpp

---
 flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp b/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
index 9109f2b331567..e973007c6759f 100644
--- a/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
+++ b/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
@@ -445,9 +445,9 @@ struct AssociateOpConversion
              !mlir::isa<fir::BaseBoxType>(assocType)) ||
             ((mlir::isa<fir::BoxCharType>(sourceVar.getType()) &&
               !mlir::isa<fir::BoxCharType>(assocType)))) {
-          sourceVar =
-              fir::BoxAddrOp::create(builder, loc, assocType, sourceVar);
-        } else {
+          sourceVar = builder.create<fir::BoxAddrOp>(loc, assocType, sourceVar);
+        } else if (!mlir::isa<fir::ReferenceType>(sourceVar.getType()) ||
+                   !mlir::isa<fir::BoxCharType>(assocType)) {
           sourceVar = builder.createConvert(loc, assocType, sourceVar);
         }
         return sourceVar;

>From ed8f048181ed25858350d4f6744bcff9fc92f8d1 Mon Sep 17 00:00:00 2001
From: EbinJose2002 <ebin.jose at multicorewareinc.com>
Date: Thu, 3 Jul 2025 15:58:59 +0530
Subject: [PATCH 2/5] Added test file for the issue

---
 flang/test/Lower/adjustr.f90 | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
 create mode 100644 flang/test/Lower/adjustr.f90

diff --git a/flang/test/Lower/adjustr.f90 b/flang/test/Lower/adjustr.f90
new file mode 100644
index 0000000000000..6add2f5456bbc
--- /dev/null
+++ b/flang/test/Lower/adjustr.f90
@@ -0,0 +1,14 @@
+! RUN: bbc -emit-fir -o - %s | FileCheck %s
+
+! Checking no reference to boxchar conversion is in the emitted fir.
+! CHECK-NOT: (!fir.ref<!fir.char<1,4>>) -> !fir.boxchar<1>
+
+program main
+  logical         ,dimension(1):: mask = .true.
+  character(len=2),dimension(1):: d1 = "a "
+  character(len=4),dimension(1):: d4
+  where (mask)
+    d4 = adjustr(d1 // d1)
+  end where
+  write(6,*) "d4     =", d4
+end
\ No newline at end of file

>From ae2f94c8eceb7b1892626659eb6dd1b6e0099eb6 Mon Sep 17 00:00:00 2001
From: Ebin-McW <ebin.jose at multicorewareinc.com>
Date: Thu, 3 Jul 2025 16:04:36 +0530
Subject: [PATCH 3/5] Update adjustr.f90

---
 flang/test/Lower/adjustr.f90 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/flang/test/Lower/adjustr.f90 b/flang/test/Lower/adjustr.f90
index 6add2f5456bbc..4813834614bd6 100644
--- a/flang/test/Lower/adjustr.f90
+++ b/flang/test/Lower/adjustr.f90
@@ -11,4 +11,4 @@ program main
     d4 = adjustr(d1 // d1)
   end where
   write(6,*) "d4     =", d4
-end
\ No newline at end of file
+end

>From 4f863445d3789f3398e488f79f70e8bc2fbd6adc Mon Sep 17 00:00:00 2001
From: EbinJose2002 <ebin.jose at multicorewareinc.com>
Date: Thu, 10 Jul 2025 12:08:54 +0530
Subject: [PATCH 4/5] Create emboxchar

---
 .../Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp   | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp b/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
index e973007c6759f..01a9d692fc64e 100644
--- a/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
+++ b/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
@@ -446,8 +446,17 @@ struct AssociateOpConversion
             ((mlir::isa<fir::BoxCharType>(sourceVar.getType()) &&
               !mlir::isa<fir::BoxCharType>(assocType)))) {
           sourceVar = builder.create<fir::BoxAddrOp>(loc, assocType, sourceVar);
-        } else if (!mlir::isa<fir::ReferenceType>(sourceVar.getType()) ||
-                   !mlir::isa<fir::BoxCharType>(assocType)) {
+        } else if (mlir::isa<fir::ReferenceType>(sourceVar.getType()) &&
+                   mlir::isa<fir::BoxCharType>(assocType)) {
+          auto refTy = mlir::cast<fir::ReferenceType>(sourceVar.getType());
+          auto charTy = mlir::dyn_cast<fir::CharacterType>(refTy.getEleTy());
+          mlir::Value lenVal = builder.createIntegerConstant(
+              loc, builder.getCharacterLengthType(), charTy.getLen());
+          auto boxCharType =
+              fir::BoxCharType::get(builder.getContext(), charTy.getFKind());
+          sourceVar = builder.create<fir::EmboxCharOp>(loc, boxCharType,
+                                                       sourceVar, lenVal);
+        } else {
           sourceVar = builder.createConvert(loc, assocType, sourceVar);
         }
         return sourceVar;

>From 9cb61ce9002d4f297f02a5a382495592795651e5 Mon Sep 17 00:00:00 2001
From: EbinJose2002 <ebin.jose at multicorewareinc.com>
Date: Mon, 18 Aug 2025 17:09:29 +0530
Subject: [PATCH 5/5] Using associate to get length. Also modified the test to
 check for emboxchar.

---
 flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp | 3 +--
 flang/test/Lower/adjustr.f90                            | 4 +++-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp b/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
index 01a9d692fc64e..3d0db1580c8d8 100644
--- a/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
+++ b/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
@@ -448,10 +448,9 @@ struct AssociateOpConversion
           sourceVar = builder.create<fir::BoxAddrOp>(loc, assocType, sourceVar);
         } else if (mlir::isa<fir::ReferenceType>(sourceVar.getType()) &&
                    mlir::isa<fir::BoxCharType>(assocType)) {
+          mlir::Value lenVal = associate.getTypeparams()[0];
           auto refTy = mlir::cast<fir::ReferenceType>(sourceVar.getType());
           auto charTy = mlir::dyn_cast<fir::CharacterType>(refTy.getEleTy());
-          mlir::Value lenVal = builder.createIntegerConstant(
-              loc, builder.getCharacterLengthType(), charTy.getLen());
           auto boxCharType =
               fir::BoxCharType::get(builder.getContext(), charTy.getFKind());
           sourceVar = builder.create<fir::EmboxCharOp>(loc, boxCharType,
diff --git a/flang/test/Lower/adjustr.f90 b/flang/test/Lower/adjustr.f90
index 4813834614bd6..6eda4952ecca0 100644
--- a/flang/test/Lower/adjustr.f90
+++ b/flang/test/Lower/adjustr.f90
@@ -1,7 +1,9 @@
-! RUN: bbc -emit-fir -o - %s | FileCheck %s
+! RUN: %flang_fc1 -emit-fir -o - %s | FileCheck %s
 
 ! Checking no reference to boxchar conversion is in the emitted fir.
 ! CHECK-NOT: (!fir.ref<!fir.char<1,4>>) -> !fir.boxchar<1>
+! CHECK: %[[Const4:.*]] = arith.constant 4 : index
+! CHECK: fir.emboxchar
 
 program main
   logical         ,dimension(1):: mask = .true.



More information about the flang-commits mailing list