From 87685165d5b207058620f714f4c22fd57e241ff1 Mon Sep 17 00:00:00 2001 From: EbinJose2002 Date: Tue, 1 Jul 2025 18:11:05 +0530 Subject: [PATCH 1/6] 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(assocType)) || ((mlir::isa(sourceVar.getType()) && !mlir::isa(assocType)))) { - sourceVar = - fir::BoxAddrOp::create(builder, loc, assocType, sourceVar); - } else { + sourceVar = builder.create(loc, assocType, sourceVar); + } else if (!mlir::isa(sourceVar.getType()) || + !mlir::isa(assocType)) { sourceVar = builder.createConvert(loc, assocType, sourceVar); } return sourceVar; From ed8f048181ed25858350d4f6744bcff9fc92f8d1 Mon Sep 17 00:00:00 2001 From: EbinJose2002 Date: Thu, 3 Jul 2025 15:58:59 +0530 Subject: [PATCH 2/6] 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.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 Date: Thu, 3 Jul 2025 16:04:36 +0530 Subject: [PATCH 3/6] 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 Date: Thu, 10 Jul 2025 12:08:54 +0530 Subject: [PATCH 4/6] 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(sourceVar.getType()) && !mlir::isa(assocType)))) { sourceVar = builder.create(loc, assocType, sourceVar); - } else if (!mlir::isa(sourceVar.getType()) || - !mlir::isa(assocType)) { + } else if (mlir::isa(sourceVar.getType()) && + mlir::isa(assocType)) { + auto refTy = mlir::cast(sourceVar.getType()); + auto charTy = mlir::dyn_cast(refTy.getEleTy()); + mlir::Value lenVal = builder.createIntegerConstant( + loc, builder.getCharacterLengthType(), charTy.getLen()); + auto boxCharType = + fir::BoxCharType::get(builder.getContext(), charTy.getFKind()); + sourceVar = builder.create(loc, boxCharType, + sourceVar, lenVal); + } else { sourceVar = builder.createConvert(loc, assocType, sourceVar); } return sourceVar; From 9cb61ce9002d4f297f02a5a382495592795651e5 Mon Sep 17 00:00:00 2001 From: EbinJose2002 Date: Mon, 18 Aug 2025 17:09:29 +0530 Subject: [PATCH 5/6] 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(loc, assocType, sourceVar); } else if (mlir::isa(sourceVar.getType()) && mlir::isa(assocType)) { + mlir::Value lenVal = associate.getTypeparams()[0]; auto refTy = mlir::cast(sourceVar.getType()); auto charTy = mlir::dyn_cast(refTy.getEleTy()); - mlir::Value lenVal = builder.createIntegerConstant( - loc, builder.getCharacterLengthType(), charTy.getLen()); auto boxCharType = fir::BoxCharType::get(builder.getContext(), charTy.getFKind()); sourceVar = builder.create(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.boxchar<1> +! CHECK: %[[Const4:.*]] = arith.constant 4 : index +! CHECK: fir.emboxchar program main logical ,dimension(1):: mask = .true. From 306af248fcca96d3134ae1ad1ca23bd82a5b11cf Mon Sep 17 00:00:00 2001 From: Ebin-McW Date: Tue, 19 Aug 2025 09:55:12 +0530 Subject: [PATCH 6/6] Update flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp Co-authored-by: Slava Zakharin --- flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp b/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp index 3d0db1580c8d8..bff3c2ce528bd 100644 --- a/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp +++ b/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp @@ -450,7 +450,7 @@ struct AssociateOpConversion mlir::isa(assocType)) { mlir::Value lenVal = associate.getTypeparams()[0]; auto refTy = mlir::cast(sourceVar.getType()); - auto charTy = mlir::dyn_cast(refTy.getEleTy()); + auto charTy = mlir::cast(refTy.getEleTy()); auto boxCharType = fir::BoxCharType::get(builder.getContext(), charTy.getFKind()); sourceVar = builder.create(loc, boxCharType,