mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 12:46:09 +00:00
[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:
parent
ede827f583
commit
942bc18d20
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user