From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2063) id 39C063858CDB; Mon, 16 Jan 2023 08:17:02 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 39C063858CDB DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1673857022; bh=0HVF5d80zYd4gEALoMyW34bCdejhYP0V+yPFF7Y3EsY=; h=From:To:Subject:Date:From; b=rsRZKNraz4JKZ8U/91dZ8jAlefvKmgz4o/ZfThcFLyVAYF+mq1gj+41p8qhEnXtAi VN2unO19A44x++vcGW7npc4WVpoaxgsrRCqSD2/mYbEHkRLu7XsIYUg25WgjZ8hK/C zMES81m1rR6Y+woii+jlsZ79NKvpnFNa9wHPk5kM= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Kewen Lin To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-5184] rs6000: Teach rs6000_opaque_type_invalid_use_p about inline asm [PR108272] X-Act-Checkin: gcc X-Git-Author: Kewen Lin X-Git-Refname: refs/heads/master X-Git-Oldrev: cc44e55e55d2efb57e995f9b8f29dec939fd7cf9 X-Git-Newrev: 074b0c03eabeb8e9c8de813c81bf87a1f88fdb65 Message-Id: <20230116081702.39C063858CDB@sourceware.org> Date: Mon, 16 Jan 2023 08:17:02 +0000 (GMT) List-Id: https://gcc.gnu.org/g:074b0c03eabeb8e9c8de813c81bf87a1f88fdb65 commit r13-5184-g074b0c03eabeb8e9c8de813c81bf87a1f88fdb65 Author: Kewen Lin Date: Mon Jan 16 02:15:39 2023 -0600 rs6000: Teach rs6000_opaque_type_invalid_use_p about inline asm [PR108272] As PR108272 shows, there are some invalid uses of MMA opaque types in inline asm statements. This patch is to teach the function rs6000_opaque_type_invalid_use_p for inline asm, check and error any invalid use of MMA opaque types in input and output operands. PR target/108272 gcc/ChangeLog: * config/rs6000/rs6000.cc (rs6000_opaque_type_invalid_use_p): Add the support for invalid uses in inline asm, factor out the checking and erroring to lambda function check_and_error_invalid_use. gcc/testsuite/ChangeLog: * gcc.target/powerpc/pr108272-1.c: New test. * gcc.target/powerpc/pr108272-2.c: New test. * gcc.target/powerpc/pr108272-3.c: New test. * gcc.target/powerpc/pr108272-4.c: New test. Diff: --- gcc/config/rs6000/rs6000.cc | 51 +++++++++++++++++++++------ gcc/testsuite/gcc.target/powerpc/pr108272-1.c | 17 +++++++++ gcc/testsuite/gcc.target/powerpc/pr108272-2.c | 17 +++++++++ gcc/testsuite/gcc.target/powerpc/pr108272-3.c | 17 +++++++++ gcc/testsuite/gcc.target/powerpc/pr108272-4.c | 18 ++++++++++ 5 files changed, 110 insertions(+), 10 deletions(-) diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index 3baa2c3b7b0..4287a6b1a61 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -28928,9 +28928,9 @@ constant_generates_xxspltidp (vec_const_128bit_type *vsx_const) __vector_pair built-in types. They are target specific and only available when MMA is supported. With MMA supported, it simply returns true, otherwise it checks if the given gimple - STMT is an assignment stmt and uses either of these two opaque - types unexpectedly, if yes, it would raise an error message - and returns true, otherwise it returns false. */ + STMT is an assignment or asm stmt and uses either of these two + opaque types unexpectedly, if yes, it would raise an error + message and returns true, otherwise it returns false. */ bool rs6000_opaque_type_invalid_use_p (gimple *stmt) @@ -28938,23 +28938,54 @@ rs6000_opaque_type_invalid_use_p (gimple *stmt) if (TARGET_MMA) return false; + /* If the given TYPE is one MMA opaque type, emit the corresponding + error messages and return true, otherwise return false. */ + auto check_and_error_invalid_use = [](tree type) + { + tree mv = TYPE_MAIN_VARIANT (type); + if (mv == vector_quad_type_node) + { + error ("type %<__vector_quad%> requires the %qs option", "-mmma"); + return true; + } + else if (mv == vector_pair_type_node) + { + error ("type %<__vector_pair%> requires the %qs option", "-mmma"); + return true; + } + return false; + }; + if (stmt) { /* The usage of MMA opaque types is very limited for now, - to check with gassign is enough so far. */ + to check with gassign and gasm is enough so far. */ if (gassign *ga = dyn_cast (stmt)) { tree lhs = gimple_assign_lhs (ga); tree type = TREE_TYPE (lhs); - if (type == vector_quad_type_node) + if (check_and_error_invalid_use (type)) + return true; + } + else if (gasm *gs = dyn_cast (stmt)) + { + unsigned ninputs = gimple_asm_ninputs (gs); + for (unsigned i = 0; i < ninputs; i++) { - error ("type %<__vector_quad%> requires the %qs option", "-mmma"); - return true; + tree op = gimple_asm_input_op (gs, i); + tree val = TREE_VALUE (op); + tree type = TREE_TYPE (val); + if (check_and_error_invalid_use (type)) + return true; } - else if (type == vector_pair_type_node) + unsigned noutputs = gimple_asm_noutputs (gs); + for (unsigned i = 0; i < noutputs; i++) { - error ("type %<__vector_pair%> requires the %qs option", "-mmma"); - return true; + tree op = gimple_asm_output_op (gs, i); + tree val = TREE_VALUE (op); + tree type = TREE_TYPE (val); + if (check_and_error_invalid_use (type)) + return true; } } } diff --git a/gcc/testsuite/gcc.target/powerpc/pr108272-1.c b/gcc/testsuite/gcc.target/powerpc/pr108272-1.c new file mode 100644 index 00000000000..b99e6a4d86d --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr108272-1.c @@ -0,0 +1,17 @@ +/* { dg-require-effective-target powerpc_p9modulo_ok } */ +/* If the default cpu type is power10 or later, type __vector_quad is + supported. To keep the test point available all the time, this case + specifies -mdejagnu-cpu=power9 here. */ +/* { dg-options "-mdejagnu-cpu=power9" } */ + +/* Verify there is no ICE and don't check the error messages on unsupported + type since they could be fragile and are not test points of this case. */ + +/* { dg-excess-errors "pr108272-1" } */ + +void +foo (void) +{ + __vector_quad acc; + asm("#..." : "=d"(acc)); +} diff --git a/gcc/testsuite/gcc.target/powerpc/pr108272-2.c b/gcc/testsuite/gcc.target/powerpc/pr108272-2.c new file mode 100644 index 00000000000..51b2100d0f1 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr108272-2.c @@ -0,0 +1,17 @@ +/* { dg-require-effective-target powerpc_p9modulo_ok } */ +/* If the default cpu type is power10 or later, type __vector_pair is + supported. To keep the test point available all the time, this case + specifies -mdejagnu-cpu=power9 here. */ +/* { dg-options "-mdejagnu-cpu=power9" } */ + +/* Verify there is no ICE and don't check the error messages on unsupported + type since they could be fragile and are not test points of this case. */ + +/* { dg-excess-errors "pr108272-2" } */ + +void +foo (void) +{ + __vector_pair acc; + asm("#..." :: "d"(acc)); +} diff --git a/gcc/testsuite/gcc.target/powerpc/pr108272-3.c b/gcc/testsuite/gcc.target/powerpc/pr108272-3.c new file mode 100644 index 00000000000..634a529b5c8 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr108272-3.c @@ -0,0 +1,17 @@ +/* { dg-require-effective-target powerpc_p9modulo_ok } */ +/* If the default cpu type is power10 or later, type __vector_quad is + supported. To keep the test point available all the time, this case + specifies -mdejagnu-cpu=power9 here. */ +/* { dg-options "-mdejagnu-cpu=power9" } */ + +/* Verify there is no ICE and don't check the error messages on unsupported + type since they could be fragile and are not test points of this case. */ + +/* { dg-excess-errors "pr108272-3" } */ + +void +foo (void) +{ + volatile __vector_quad acc; + asm("#..." : "=d"(acc)); +} diff --git a/gcc/testsuite/gcc.target/powerpc/pr108272-4.c b/gcc/testsuite/gcc.target/powerpc/pr108272-4.c new file mode 100644 index 00000000000..7eecd6c5a0d --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr108272-4.c @@ -0,0 +1,18 @@ +/* { dg-require-effective-target powerpc_p9modulo_ok } */ +/* If the default cpu type is power10 or later, type __vector_pair is + supported. To keep the test point available all the time, this case + specifies -mdejagnu-cpu=power9 here. */ +/* { dg-options "-mdejagnu-cpu=power9" } */ + +/* Verify there is no ICE and don't check the error messages on unsupported + type since they could be fragile and are not test points of this case. */ + +/* { dg-excess-errors "pr108272-4" } */ + +typedef __vector_pair vpair_t; +void +foo (void) +{ + vpair_t acc; + asm("#..." : "=d"(acc)); +}