From 942bc18d203a96234bc92a0ce41e8f38970a6462 Mon Sep 17 00:00:00 2001 From: Valentin Clement Date: Wed, 15 Mar 2023 16:31:58 +0100 Subject: [PATCH] [flang] Rebox the polymorphic argument in merge intrinsic When fsource or tsource is not polymorphic, the result is not polymorphic. Rebox the polymoprhic arguement so the dynamic type of the result is correct. Reviewed By: PeteSteinfeld Differential Revision: https://reviews.llvm.org/D146133 --- flang/lib/Optimizer/Builder/IntrinsicCall.cpp | 12 ++++++++++-- flang/test/Lower/polymorphic-temp.f90 | 4 ++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp index 9f8b009c12e8..bfc36b8a8f90 100644 --- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp +++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp @@ -4035,10 +4035,18 @@ IntrinsicLibrary::genMerge(mlir::Type, mlir::Value fsourceCast = fsource; if (fir::isPolymorphicType(tsource.getType()) && !fir::isPolymorphicType(fsource.getType())) { - tsourceCast = builder.createConvert(loc, fsource.getType(), tsource); + tsourceCast = builder.create(loc, fsource.getType(), tsource, + /*shape*/ mlir::Value{}, + /*slice=*/mlir::Value{}); + + // builder.createConvert(loc, fsource.getType(), tsource); } else if (!fir::isPolymorphicType(tsource.getType()) && fir::isPolymorphicType(fsource.getType())) { - fsourceCast = builder.createConvert(loc, tsource.getType(), fsource); + fsourceCast = builder.create(loc, tsource.getType(), fsource, + /*shape*/ mlir::Value{}, + /*slice=*/mlir::Value{}); + + // fsourceCast = builder.createConvert(loc, tsource.getType(), fsource); } else { // FSOURCE and TSOURCE are not polymorphic. // FSOURCE has the same type as TSOURCE, but they may not have the same MLIR diff --git a/flang/test/Lower/polymorphic-temp.f90 b/flang/test/Lower/polymorphic-temp.f90 index 16b629a5d6d2..7858064108b5 100644 --- a/flang/test/Lower/polymorphic-temp.f90 +++ b/flang/test/Lower/polymorphic-temp.f90 @@ -222,7 +222,7 @@ contains ! CHECK: %[[LOAD_I:.*]] = fir.load %[[I]] : !fir.ref ! CHECK: %[[C1:.*]] = arith.constant 1 : i32 ! CHECK: %[[CMPI:.*]] = arith.cmpi eq, %[[LOAD_I]], %[[C1]] : i32 -! CHECK: %[[A_CONV:.*]] = fir.convert %[[LOAD_A]] : (!fir.class>>) -> !fir.box>> -! CHECK: %{{.*}} = arith.select %[[CMPI]], %[[A_CONV]], %[[LOAD_B]] : !fir.box>> +! CHECK: %[[A_REBOX:.*]] = fir.rebox %[[LOAD_A]] : (!fir.class>>) -> !fir.box>> +! CHECK: %{{.*}} = arith.select %[[CMPI]], %[[A_REBOX]], %[[LOAD_B]] : !fir.box>> end module