diff mbox series

[power-ieee128] fortran, libgfortran: Assorted -mabi=ieeelongdouble I/O fixes

Message ID 20220104142307.GF2646553@tucnak
State New
Headers show
Series [power-ieee128] fortran, libgfortran: Assorted -mabi=ieeelongdouble I/O fixes | expand

Commit Message

Jakub Jelinek Jan. 4, 2022, 2:23 p.m. UTC
Hi!

Another patch, this fixes:
FAIL: gfortran.dg/intrinsic_spread_2.f90   -O0  execution test
FAIL: gfortran.dg/intrinsic_spread_2.f90   -O1  execution test
FAIL: gfortran.dg/intrinsic_spread_2.f90   -O2  execution test
FAIL: gfortran.dg/intrinsic_spread_2.f90   -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions  execution test
FAIL: gfortran.dg/intrinsic_spread_2.f90   -O3 -g  execution test
FAIL: gfortran.dg/intrinsic_spread_2.f90   -Os  execution test
FAIL: gfortran.dg/intrinsic_unpack_2.f90   -O0  execution test
FAIL: gfortran.dg/intrinsic_unpack_2.f90   -O1  execution test
FAIL: gfortran.dg/intrinsic_unpack_2.f90   -O2  execution test
FAIL: gfortran.dg/intrinsic_unpack_2.f90   -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions  execution test
FAIL: gfortran.dg/intrinsic_unpack_2.f90   -O3 -g  execution test
FAIL: gfortran.dg/intrinsic_unpack_2.f90   -Os  execution test
FAIL: gfortran.dg/large_real_kind_form_io_1.f90   -O0  execution test
FAIL: gfortran.dg/large_real_kind_form_io_1.f90   -O1  execution test
FAIL: gfortran.dg/large_real_kind_form_io_1.f90   -O2  execution test
FAIL: gfortran.dg/large_real_kind_form_io_1.f90   -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions  execution test
FAIL: gfortran.dg/large_real_kind_form_io_1.f90   -O3 -g  execution test
FAIL: gfortran.dg/large_real_kind_form_io_1.f90   -Os  execution test
FAIL: gfortran.dg/quad_2.f90   -O0  execution test
FAIL: gfortran.dg/quad_2.f90   -O1  execution test
FAIL: gfortran.dg/quad_2.f90   -O2  execution test
FAIL: gfortran.dg/quad_2.f90   -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions  execution test
FAIL: gfortran.dg/quad_2.f90   -O3 -g  execution test
FAIL: gfortran.dg/quad_2.f90   -Os  execution test

Ok for power-ieee128?

2022-01-04  Jakub Jelinek  <jakub@redhat.com>

gcc/fortran/
	* trans-io.c (transfer_array_desc): Pass abi kind instead of kind
	to libgfortran.
libgfortran/
	* io/read.c (convert_real): Add missing break; for the
	HAVE_GFC_REAL_17 case.


	Jakub

Comments

Thomas Koenig Jan. 4, 2022, 2:36 p.m. UTC | #1
On 04.01.22 15:23, Jakub Jelinek via Fortran wrote:
> Ok for power-ieee128?

Also OK.

Best regards

	Thomas
Jakub Jelinek Jan. 4, 2022, 6:08 p.m. UTC | #2
Hi!

This test FAILs because
f951: Error: '-mabi=ieeelongdouble' requires full ISA 2.06 support
compiler exited with status 1
FAIL: gfortran.dg/pr47614.f   -O0  (test for excess errors)
As powerpc64le* only supports -mcpu=power8 and newer, I think we shouldn't
be testing with that option.

Ok for power-ieee128?

All the remaining FAILs I get are due to the -flto -mgnu-attribute issues
or FAIL also with -mabi=ibmlongdouble.

Though, I'm still unsure on what we should do with the array descriptors.
typedef struct dtype_type
{
  size_t elem_len;
  int version;
  signed char rank;
  signed char type;
  signed short attribute;
}
dtype_type;

Is elem_len really element length, or kind, or both?

It seems a lot of code uses that interchangeably, is there anything where
we'd rely on whether it is the IBM extended real(kind=16) or IEEE quad
real(kind=16) (either in libgfortran or elsewhere)?
At least in libgfortran/generates/*, GFC_DESCRIPTOR_SIZE is mostly used
as mask_kind (I think the mask arrays are always logical not real/complex,
right?), or for logical stuff like matmul_l*.

2022-01-04  Jakub Jelinek  <jakub@redhat.com>

	* gfortran.dg/pr47614.f: Don't use -mcpu=power4 for
	powerpc64le*-*-linux*.

--- gcc/testsuite/gfortran.dg/pr47614.f.jj	2021-12-31 11:00:53.733041354 +0000
+++ gcc/testsuite/gfortran.dg/pr47614.f	2022-01-04 17:51:05.422663254 +0000
@@ -1,6 +1,7 @@
 ! { dg-do run { target { powerpc*-*-* } } }
 ! { dg-skip-if "" { powerpc*-*-darwin* } }
 ! { dg-options "-O3 -funroll-loops -ffast-math -mcpu=power4" }
+! { dg-options "-O3 -funroll-loops -ffast-math" { target powerpc64le*-*-linux* } }
 
 
       SUBROUTINE SFCPAR(ZET,NZ,ZMH,TSL,TMES)

	Jakub
Thomas Koenig Jan. 4, 2022, 8:38 p.m. UTC | #3
Hi Jakub,

> This test FAILs because
> f951: Error: '-mabi=ieeelongdouble' requires full ISA 2.06 support
> compiler exited with status 1
> FAIL: gfortran.dg/pr47614.f   -O0  (test for excess errors)
> As powerpc64le* only supports -mcpu=power8 and newer, I think we shouldn't
> be testing with that option.
> 
> Ok for power-ieee128?

OK (I would also consider it obvious).


> Though, I'm still unsure on what we should do with the array descriptors.
> typedef struct dtype_type
> {
>    size_t elem_len;
>    int version;
>    signed char rank;
>    signed char type;
>    signed short attribute;
> }
> dtype_type;
> 
> Is elem_len really element length, or kind, or both?

It is specified as a length, and should be set correctly also
for complex (where it is twice the length).

> It seems a lot of code uses that interchangeably, is there anything where
> we'd rely on whether it is the IBM extended real(kind=16) or IEEE quad
> real(kind=16) (either in libgfortran or elsewhere)?

I think we use sizeof in all relevant files.

> At least in libgfortran/generates/*, GFC_DESCRIPTOR_SIZE is mostly used
> as mask_kind (I think the mask arrays are always logical not real/complex,
> right?), or for logical stuff like matmul_l*.

Yes, masks are always of type logical, so that should not be an issue.

There are two direct uses of elem_len in caf/singe.c, one in
date_and_time.c and one in io/transfer.c.  There is also some
use of a variable of that name ISO_Fortran_binding.c, which can
be checked later.

Best regards

	Thomas
diff mbox series

Patch

--- gcc/fortran/trans-io.c.jj	2022-01-04 10:27:56.498322942 +0000
+++ gcc/fortran/trans-io.c	2022-01-04 13:51:50.336998696 +0000
@@ -2528,7 +2528,7 @@  transfer_array_desc (gfc_se * se, gfc_ty
   else
     charlen_arg = build_int_cst (gfc_charlen_type_node, 0);
 
-  kind_arg = build_int_cst (integer_type_node, ts->kind);
+  kind_arg = build_int_cst (integer_type_node, gfc_type_abi_kind (ts));
 
   tmp = gfc_build_addr_expr (NULL_TREE, dt_parm);
   if (last_dt == READ)
--- libgfortran/io/read.c.jj	2022-01-04 10:27:56.518323381 +0000
+++ libgfortran/io/read.c	2022-01-04 13:58:51.676285518 +0000
@@ -203,6 +203,7 @@  convert_real (st_parameter_dt *dtp, void
 # else
       *((GFC_REAL_17*) dest) = __qmath_(strtoflt128) (buffer, &endptr);
 # endif
+      break;
 #endif
 
     default: