[flang-commits] [flang] 7492426 - [flang] Fix function result rewrite

Peixin Qiao via flang-commits flang-commits at lists.llvm.org
Fri Nov 4 07:17:17 PDT 2022


Author: Peixin Qiao
Date: 2022-11-04T22:15:58+08:00
New Revision: 749242668885d86a4f8bd6a5e697250b6cdb36d3

URL: https://github.com/llvm/llvm-project/commit/749242668885d86a4f8bd6a5e697250b6cdb36d3
DIFF: https://github.com/llvm/llvm-project/commit/749242668885d86a4f8bd6a5e697250b6cdb36d3.diff

LOG: [flang] Fix function result rewrite

When the function result is `type(c_ptr/c_funptr)`, and the function has
or does not have BIND(C) attribute, the function result is not taken as
the first argument of the function call in other compilers such as
gfortran and ifort. Fix it to be consistent with gfortran/ifort by
changing the abstract result type check.

Fix #58739.

Reviewed By: PeteSteinfeld, jeanPerier

Differential Revision: https://reviews.llvm.org/D137236

Added: 
    

Modified: 
    flang/lib/Optimizer/Dialect/FIRType.cpp
    flang/test/Fir/abstract-results.fir

Removed: 
    


################################################################################
diff  --git a/flang/lib/Optimizer/Dialect/FIRType.cpp b/flang/lib/Optimizer/Dialect/FIRType.cpp
index 67b4d1af7cf1..c509ce0fcdcf 100644
--- a/flang/lib/Optimizer/Dialect/FIRType.cpp
+++ b/flang/lib/Optimizer/Dialect/FIRType.cpp
@@ -948,6 +948,10 @@ bool fir::hasAbstractResult(mlir::FunctionType ty) {
   if (ty.getNumResults() == 0)
     return false;
   auto resultType = ty.getResult(0);
+  // FIXME: The interoperable derived type needs more investigations and tests.
+  // The derived type without BIND attribute may also not be abstract result.
+  if (fir::isa_builtin_cptr_type(resultType))
+    return false;
   return resultType.isa<fir::SequenceType, fir::BoxType, fir::RecordType>();
 }
 

diff  --git a/flang/test/Fir/abstract-results.fir b/flang/test/Fir/abstract-results.fir
index 580f7c6d22e1..92d803e4994b 100644
--- a/flang/test/Fir/abstract-results.fir
+++ b/flang/test/Fir/abstract-results.fir
@@ -202,6 +202,17 @@ func.func @call_chararrayfunc() {
   // FUNC-BOX-NOT: fir.save_result
 }
 
+func.func private @rettcptr() -> !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}> attributes {fir.bindc_name = "rettcptr"}
+
+// FUNC-REF-LABEL: func @_QPtest_return_cptr() {
+// FUNC-BOX-LABEL: func @_QPtest_return_cptr() {
+func.func @_QPtest_return_cptr() {
+  // FUNC-REF: [[VAL:.*]] = fir.call @rettcptr() : () -> !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>
+  // FUNC-BOX: [[VAL:.*]] = fir.call @rettcptr() : () -> !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>
+  %1 = fir.call @rettcptr() : () -> !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>
+  return
+}
+
 // ------------------------ Test fir.address_of rewrite ------------------------
 
 func.func private @takesfuncarray((i32) -> !fir.array<?xf32>)


        


More information about the flang-commits mailing list