[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
This commit is contained in:
Valentin Clement 2023-03-15 16:31:58 +01:00
parent ede827f583
commit 942bc18d20
No known key found for this signature in database
GPG Key ID: 086D54783C928776
2 changed files with 12 additions and 4 deletions

View File

@ -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<fir::ReboxOp>(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<fir::ReboxOp>(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

View File

@ -222,7 +222,7 @@ contains
! CHECK: %[[LOAD_I:.*]] = fir.load %[[I]] : !fir.ref<i32>
! 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.heap<!fir.type<_QMpoly_tmpTp1{a:i32}>>>) -> !fir.box<!fir.heap<!fir.type<_QMpoly_tmpTp1{a:i32}>>>
! CHECK: %{{.*}} = arith.select %[[CMPI]], %[[A_CONV]], %[[LOAD_B]] : !fir.box<!fir.heap<!fir.type<_QMpoly_tmpTp1{a:i32}>>>
! CHECK: %[[A_REBOX:.*]] = fir.rebox %[[LOAD_A]] : (!fir.class<!fir.heap<!fir.type<_QMpoly_tmpTp1{a:i32}>>>) -> !fir.box<!fir.heap<!fir.type<_QMpoly_tmpTp1{a:i32}>>>
! CHECK: %{{.*}} = arith.select %[[CMPI]], %[[A_REBOX]], %[[LOAD_B]] : !fir.box<!fir.heap<!fir.type<_QMpoly_tmpTp1{a:i32}>>>
end module