From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1285) id EDCEF3846410; Thu, 25 Apr 2024 10:48:17 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org EDCEF3846410 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1714042097; bh=PD6FBhtK+ycjqqX4VGxjmxCsCMEWj1gbeBk846wUan0=; h=From:To:Subject:Date:From; b=yKYNEs8p4Htm31YluSm7dvDqqVhRTygWGBH6gaJUjTjKAiWVo81z/QNM2V4s9aKrk zZtSS/9TdzezIVOmk5A7LhgKzU9hriVbbb0NTH6+iCClgJalrUFgSTXGQWMc0VPBg0 mzaEsIuYgOAv7njcMc0h+4tWO1QjBC0j8Gtw79oQ= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Eric Botcazou To: gcc-cvs@gcc.gnu.org Subject: [gcc r14-10119] Fix calling convention incompatibility with vendor compiler X-Act-Checkin: gcc X-Git-Author: Eric Botcazou X-Git-Refname: refs/heads/master X-Git-Oldrev: af7d981ba40f145256f6f6d3409451e8fa647f75 X-Git-Newrev: 1d238c84025aaef1641e4000bd2a8f4328b474dd Message-Id: <20240425104817.EDCEF3846410@sourceware.org> Date: Thu, 25 Apr 2024 10:48:17 +0000 (GMT) List-Id: https://gcc.gnu.org/g:1d238c84025aaef1641e4000bd2a8f4328b474dd commit r14-10119-g1d238c84025aaef1641e4000bd2a8f4328b474dd Author: Eric Botcazou Date: Thu Apr 25 12:44:14 2024 +0200 Fix calling convention incompatibility with vendor compiler For the 20th anniversary of https://gcc.gnu.org/gcc-3.4/sparc-abi.html, a new calling convention incompatibility with the vendor compiler (and the ABI) has been discovered in 64-bit mode, affecting small structures containing arrays of floating-point components. The decision has been made to fix it on Solaris only at this point. gcc/ PR target/114416 * config/sparc/sparc.h (SUN_V9_ABI_COMPATIBILITY): New macro. * config/sparc/sol2.h (SUN_V9_ABI_COMPATIBILITY): Redefine it. * config/sparc/sparc.cc (fp_type_for_abi): New predicate. (traverse_record_type): Use it to spot floating-point types. (compute_fp_layout): Also deal with array types. gcc/testsuite/ * gcc.target/sparc/small-struct-1.c: New test. * gcc.target/sparc/pr105573.c: Rename to... * gcc.target/sparc/20230425-1.c: ...this. * gcc.target/sparc/pr109541.c: Rename to... * gcc.target/sparc/20230607-1.c: ...this Diff: --- gcc/config/sparc/sol2.h | 3 ++ gcc/config/sparc/sparc.cc | 26 +++++++++++- gcc/config/sparc/sparc.h | 3 ++ .../gcc.target/sparc/{pr105573.c => 20230425-1.c} | 3 ++ .../gcc.target/sparc/{pr109541.c => 20230607-1.c} | 3 ++ gcc/testsuite/gcc.target/sparc/small-struct-1.c | 46 ++++++++++++++++++++++ 6 files changed, 82 insertions(+), 2 deletions(-) diff --git a/gcc/config/sparc/sol2.h b/gcc/config/sparc/sol2.h index e849af9038b..552f58b2cc8 100644 --- a/gcc/config/sparc/sol2.h +++ b/gcc/config/sparc/sol2.h @@ -456,3 +456,6 @@ extern const char *host_detect_local_cpu (int argc, const char **argv); #undef SPARC_LOW_FE_EXCEPT_VALUES #define SPARC_LOW_FE_EXCEPT_VALUES 1 + +#undef SUN_V9_ABI_COMPATIBILITY +#define SUN_V9_ABI_COMPATIBILITY 1 diff --git a/gcc/config/sparc/sparc.cc b/gcc/config/sparc/sparc.cc index 30fa4474bbd..8a5f76c8885 100644 --- a/gcc/config/sparc/sparc.cc +++ b/gcc/config/sparc/sparc.cc @@ -6782,6 +6782,22 @@ sparc_pass_by_reference (cumulative_args_t, const function_arg_info &arg) || GET_MODE_SIZE (mode) > 16); } +/* Return true if TYPE is considered as a floating-point type by the ABI. */ + +static bool +fp_type_for_abi (const_tree type) +{ + /* This is the original GCC implementation. */ + if (FLOAT_TYPE_P (type) || VECTOR_TYPE_P (type)) + return true; + + /* This has been introduced in GCC 14 to match the vendor compiler. */ + if (SUN_V9_ABI_COMPATIBILITY && TREE_CODE (type) == ARRAY_TYPE) + return fp_type_for_abi (TREE_TYPE (type)); + + return false; +} + /* Traverse the record TYPE recursively and call FUNC on its fields. NAMED is true if this is for a named parameter. DATA is passed to FUNC for each field. OFFSET is the starting position and @@ -6820,8 +6836,7 @@ traverse_record_type (const_tree type, bool named, T *data, packed); else { - const bool fp_type - = FLOAT_TYPE_P (field_type) || VECTOR_TYPE_P (field_type); + const bool fp_type = fp_type_for_abi (field_type); Func (field, bitpos, fp_type && named && !packed && TARGET_FPU, data); } @@ -7072,6 +7087,13 @@ compute_fp_layout (const_tree field, int bitpos, assign_data_t *data, mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (field))); nregs = 2; } + else if (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE) + { + tree elt_type = strip_array_types (TREE_TYPE (field)); + mode = TYPE_MODE (elt_type); + nregs + = int_size_in_bytes (TREE_TYPE (field)) / int_size_in_bytes (elt_type); + } else nregs = 1; diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h index fb074808d30..232ecb30ddc 100644 --- a/gcc/config/sparc/sparc.h +++ b/gcc/config/sparc/sparc.h @@ -1700,3 +1700,6 @@ extern int sparc_indent_opcode; #define SPARC_LOW_FE_EXCEPT_VALUES 0 #define TARGET_SUPPORTS_WIDE_INT 1 + +/* Define this to 1 to accept ABI changes to match the vendor compiler. */ +#define SUN_V9_ABI_COMPATIBILITY 0 diff --git a/gcc/testsuite/gcc.target/sparc/pr105573.c b/gcc/testsuite/gcc.target/sparc/20230425-1.c similarity index 82% rename from gcc/testsuite/gcc.target/sparc/pr105573.c rename to gcc/testsuite/gcc.target/sparc/20230425-1.c index 14043a5fdad..c07dd3261fc 100644 --- a/gcc/testsuite/gcc.target/sparc/pr105573.c +++ b/gcc/testsuite/gcc.target/sparc/20230425-1.c @@ -1,3 +1,6 @@ +/* PR target/105573 */ +/* Reported by Sam James */ + /* { dg-do compile } */ /* { dg-options "-O3 -mvis3" } */ diff --git a/gcc/testsuite/gcc.target/sparc/pr109541.c b/gcc/testsuite/gcc.target/sparc/20230607-1.c similarity index 92% rename from gcc/testsuite/gcc.target/sparc/pr109541.c rename to gcc/testsuite/gcc.target/sparc/20230607-1.c index 1360f101930..3613dca602f 100644 --- a/gcc/testsuite/gcc.target/sparc/pr109541.c +++ b/gcc/testsuite/gcc.target/sparc/20230607-1.c @@ -1,3 +1,6 @@ +/* PR target.109541 */ +/* Reported by Sam James */ + /* { dg-do compile } */ /* { dg-options "-O1 -mcpu=niagara4 -fpic -w" } */ diff --git a/gcc/testsuite/gcc.target/sparc/small-struct-1.c b/gcc/testsuite/gcc.target/sparc/small-struct-1.c new file mode 100644 index 00000000000..4897288766b --- /dev/null +++ b/gcc/testsuite/gcc.target/sparc/small-struct-1.c @@ -0,0 +1,46 @@ +/* PR target/114416 */ +/* Reported by Rainer Orth */ + +/* { dg-do compile } */ +/* { dg-options "-O" } */ +/* { dg-require-effective-target lp64 } */ + +struct vec2 +{ + double x[2]; +}; + +struct vec2x +{ + double x; + double y; +}; + +struct vec2 sum2 (double val) +{ + struct vec2 v; + v.x[0] = val; + v.x[1] = val; + return v; +} + +struct vec2x sum2x (double val) +{ + struct vec2x v; + v.x = val; + v.y = val; + return v; +} + +double get2 (struct vec2 v) +{ + return v.x[0] + v.x[1]; +} + +double get2x (struct vec2x v) +{ + return v.x + v.y; +} + +/* { dg-final { scan-assembler-not "ldx" } } */ +/* { dg-final { scan-assembler-not "stx" } } */