On 3/11/20 2:00 PM, Carl Love wrote:
GCC maintianers:

The following patch add a check to make sure the user did not specify
-mno_fprnd with the builtins  __builtin_vsx_xsrdpim and
__builtin_vsx_xsrdpip.  These builtins are incompatible with the
-mno_fprnd command line.  The check prevents GCC crashing under these
conditions.

Manually tested the patch on

   powerpc64le-unknown-linux-gnu (Power 8 LE)
   powerpc64le-unknown-linux-gnu (Power 9 LE)

as follows:

    gcc -mno-fprnd -g -c vsx-builtin-3.c
    vsx-builtin-3.c: In function ‘do_math’:
    vsx-builtin-3.c:145:3: error: __builtin_vsx_xsrdpim is incompatible
    with mno-fprnd option
      145 |   z[i][0] = __builtin_vsx_xsrdpim (z[i][1]); i++;
          |   ^
    vsx-builtin-3.c:146:3: error: __builtin_vsx_xsrdpip is incompatible
    with mno-fprnd option
      146 |   z[i][0] = __builtin_vsx_xsrdpip (z[i][1]); i++;
          |   ^

I read thru the source code looking for other builtins with the same
issue.  I also created a script to compile all of the tests in
gcc/testsuite/gcc.target/powerpc with the -mno-fprnd option to check
for additional builtins that are incompatible with the -mno-fprnd
option.  These were the only two builtins that were identified as being
incompatible with the -mno-fprnd option.

Please let me know if the patch looks OK for mainline.  Thanks.

                          Carl Love

-----------------------------------------------------------------------
rs6000: Add command line and builtin compatibility check

PR/target 87583

gcc/ChangeLog

2020-03-10  Carl Love  <c...@us.ibm.com>

        * gcc/config/rs6000/rs6000-c.c
(altivec_resolve_overloaded_builtin):
        Add check for TARGET_FRND and VSX_BUILTIN_XSRDPIM,
VSX_BUILTIN_XSRDPIP
        compatibility.
---
  gcc/config/rs6000/rs6000-c.c | 8 ++++++++
  1 file changed, 8 insertions(+)

diff --git a/gcc/config/rs6000/rs6000-c.c b/gcc/config/rs6000/rs6000-
c.c
index 8c1fbbf..6820782 100644
--- a/gcc/config/rs6000/rs6000-c.c
+++ b/gcc/config/rs6000/rs6000-c.c
@@ -915,6 +915,14 @@ altivec_resolve_overloaded_builtin (location_t
loc, tree fndecl,
    const struct altivec_builtin_types *desc;
    unsigned int n;

+  /* Check builtin for command line argument conflicts.  */
+  if (!TARGET_FPRND &&
+      (fcode == VSX_BUILTIN_XSRDPIM || fcode == VSX_BUILTIN_XSRDPIP))
{
+      error ("%s is incompatible with mno-fprnd option",


I believe you need %qs here.  Also replace mno-fprnd with %qs and put "-mno-fprnd" as the associated parameter.

Example from nearby code:   error ("%qs requires %qs", "-mdirect-move", "-mvsx");

Thanks,
Bill

+            IDENTIFIER_POINTER (DECL_NAME (fndecl)));
+      return error_mark_node;
+  }
+
    if (!rs6000_overloaded_builtin_p (fcode))
      return NULL_TREE;

Reply via email to