diff --git a/flang/lib/Lower/ConvertCall.cpp b/flang/lib/Lower/ConvertCall.cpp index 0b5d4183c83d3..0231878631180 100644 --- a/flang/lib/Lower/ConvertCall.cpp +++ b/flang/lib/Lower/ConvertCall.cpp @@ -516,16 +516,8 @@ Fortran::lower::genCallOpAndResult( mlir::Value cast; auto *context = builder.getContext(); - // Special handling for %VAL arguments: internal procedures expect - // reference parameters. When %VAL is used, the argument should be - // passed by value. Pass the originally loaded value. - if (fir::isa_ref_type(snd) && !fir::isa_ref_type(fst.getType()) && - fir::dyn_cast_ptrEleTy(snd) == fst.getType()) { - auto loadOp = mlir::cast(fst.getDefiningOp()); - mlir::Value originalStorage = loadOp.getMemref(); - cast = originalStorage; - } else if (mlir::isa(snd) && - mlir::isa(fst.getType())) { + if (mlir::isa(snd) && + mlir::isa(fst.getType())) { mlir::FunctionType funcTy = mlir::FunctionType::get(context, {}, {}); fir::BoxProcType boxProcTy = builder.getBoxProcType(funcTy); if (mlir::Value host = argumentHostAssocs(converter, fst)) { @@ -1668,17 +1660,8 @@ void prepareUserCallArguments( break; } // For %VAL arguments, we should pass the value directly without - // conversion to reference types. If argTy is different from value type, - // it might be due to signature mismatch with internal procedures. - if (argTy == value.getType()) - caller.placeInput(arg, value); - else if (fir::isa_ref_type(argTy) && - fir::dyn_cast_ptrEleTy(argTy) == value.getType()) { - auto loadOp = mlir::cast(value.getDefiningOp()); - mlir::Value originalStorage = loadOp.getMemref(); - caller.placeInput(arg, originalStorage); - } else - caller.placeInput(arg, builder.createConvert(loc, argTy, value)); + // conversion to reference types. + caller.placeInput(arg, builder.createConvert(loc, argTy, value)); } break; case PassBy::BaseAddressValueAttribute: diff --git a/flang/lib/Optimizer/Dialect/FIROps.cpp b/flang/lib/Optimizer/Dialect/FIROps.cpp index 87f9899aa7879..c0bdfcdd56c89 100644 --- a/flang/lib/Optimizer/Dialect/FIROps.cpp +++ b/flang/lib/Optimizer/Dialect/FIROps.cpp @@ -1521,8 +1521,8 @@ bool fir::ConvertOp::canBeConverted(mlir::Type inType, mlir::Type outType) { (isInteger(inType) && isFloatCompatible(outType)) || (isFloatCompatible(inType) && isInteger(outType)) || (isFloatCompatible(inType) && isFloatCompatible(outType)) || - (isIntegerCompatible(inType) && isPointerCompatible(outType)) || - (isPointerCompatible(inType) && isIntegerCompatible(outType)) || + (isInteger(inType) && isPointerCompatible(outType)) || + (isPointerCompatible(inType) && isInteger(outType)) || (mlir::isa(inType) && mlir::isa(outType)) || (mlir::isa(inType) && diff --git a/flang/test/Lower/percent-val-actual-argument.f90 b/flang/test/Lower/percent-val-actual-argument.f90 index 890b1972e80bb..b4e635bef2887 100644 --- a/flang/test/Lower/percent-val-actual-argument.f90 +++ b/flang/test/Lower/percent-val-actual-argument.f90 @@ -6,7 +6,10 @@ program main call sa(%val(a1)) ! CHECK: %[[A1_ADDR:.*]] = fir.address_of(@_QFEa1) : !fir.ref> ! CHECK: %[[A1_DECL:.*]]:2 = hlfir.declare %[[A1_ADDR]] {uniq_name = "_QFEa1"} : (!fir.ref>) -> (!fir.ref>, !fir.ref>) -! CHECK: fir.call @_QPsa(%[[A1_DECL]]#0) fastmath : (!fir.ref>) -> () +! CHECK: %[[A1_LOADED:.*]] = fir.load %[[A1_DECL]]#0 : !fir.ref> +! CHECK: %[[SA_ADDR:.*]] = fir.address_of(@_QPsa) : (!fir.ref>) -> () +! CHECK: %[[SA_CONVERT:.*]] = fir.convert %[[SA_ADDR]] : ((!fir.ref>) -> ()) -> ((!fir.logical<4>) -> ()) +! CHECK: fir.call %[[SA_CONVERT]](%[[A1_LOADED]]) fastmath : (!fir.logical<4>) -> () ! CHECK: func.func @_QPsa(%[[SA_ARG:.*]]: !fir.ref> {fir.bindc_name = "x1"}) { write(6,*) "a1 = ", a1 end program main