Twelve failures have been occuring in the bfp test directory during -m32
regression testing.

The cause of these failures was two-fold:

1. Patches added subsequent to development of the tests caused new error
messages
to be emitted that are different than the error messages expected in the
dejagnu patterns.
These new patches also changed which built-in functions are legal when
compiling with the
-m32 command-line option.

2. The implementation of overloaded built-in functions maps overloaded
function names to
non-overloaded names.  Depending on the stage at which an error is
recognized, error
messages may refer either to the overloaded built-in function name or
the non-overloaded
name.

This patch:

1. Changes the expected error messages in certain test programs.

2. Disables certain test programs from being exercised on 32-bit targets.

3. Adds a "note" error message to explain the mapping from overloaded
built-in functions
to non-overloaded built-in functions.


This patch has bootstrapped and tested without regressions on both
powerpc64le-unknown-linux (P8) and on powerpc-linux (P7 big-endian, with
both -m32
and -m64 target options).

Is this ok for trunk?

gcc/ChangeLog:

2018-04-13  Kelvin Nilsen  <kel...@gcc.gnu.org>

    * config/rs6000/rs6000-protos.h (rs6000_builtin_is_supported_p):
    New prototype.
    * config/rs6000/rs6000-c.c (altivec_resolve_overloaded_builtin):
    Add note to error message to explain internal mapping of overloaded
    built-in function name to non-overloaded built-in function name.
    * config/rs6000/rs6000.c (rs6000_builtin_is_supported_p): New
    function.

gcc/testsuite/ChangeLog:

2018-04-13  Kelvin Nilsen  <kel...@gcc.gnu.org>

    * gcc.target/powerpc/bfp/scalar-extract-sig-5.c: Simplify to
    prevent cascading of errors and change expected error message.
    * gcc.target/powerpc/bfp/scalar-test-neg-4.c: Restrict this test
    to 64-bit targets.
    * gcc.target/powerpc/bfp/scalar-test-data-class-8.c: Likewise.
    * gcc.target/powerpc/bfp/scalar-test-data-class-9.c: Likewise.
    * gcc.target/powerpc/bfp/scalar-test-data-class-10.c: Likewise.
    * gcc.target/powerpc/bfp/scalar-insert-exp-11.c: Change expected
    error message.
    * gcc.target/powerpc/bfp/scalar-extract-exp-5.c: Likewise.

Index: gcc/testsuite/gcc.target/powerpc/bfp/scalar-extract-sig-5.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/bfp/scalar-extract-sig-5.c   
(revision 259316)
+++ gcc/testsuite/gcc.target/powerpc/bfp/scalar-extract-sig-5.c   
(working copy)
@@ -8,10 +8,10 @@
    error because the builtin requires 64 bits.  */
 #include <altivec.h>
 
-unsigned __int128 /* { dg-error "'__int128' is not supported on this
target" } */
+unsigned long long int
 get_significand (__ieee128 *p)
 {
   __ieee128 source = *p;
 
-  return __builtin_vec_scalar_extract_sig (source); /* { dg-error
"builtin function '__builtin_vec_scalar_extract_sig' not supported in
this compiler configuration" } */
+  return (long long int) __builtin_vec_scalar_extract_sig (source); /*
{ dg-error "requires ISA 3.0 IEEE 128-bit floating point" } */
 }
Index: gcc/testsuite/gcc.target/powerpc/bfp/scalar-test-neg-4.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/bfp/scalar-test-neg-4.c   
(revision 259316)
+++ gcc/testsuite/gcc.target/powerpc/bfp/scalar-test-neg-4.c    (working
copy)
@@ -1,5 +1,6 @@
 /* { dg-do compile { target { powerpc*-*-* } } } */
 /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" }
{ "-mcpu=power9" } } */
+/* { dg-require-effective-target lp64 } */
 /* { dg-require-effective-target powerpc_p9vector_ok } */
 /* { dg-options "-mcpu=power9" } */
 
@@ -11,6 +12,8 @@
 {
   __ieee128 source = *p;
 
+  /* IEEE 128-bit floating point operations are only supported
+     on 64-bit targets.  */
   return scalar_test_neg (source);
 }
 
Index: gcc/testsuite/gcc.target/powerpc/bfp/scalar-test-data-class-8.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/bfp/scalar-test-data-class-8.c   
(revision 259316)
+++ gcc/testsuite/gcc.target/powerpc/bfp/scalar-test-data-class-8.c   
(working copy)
@@ -1,5 +1,6 @@
 /* { dg-do compile { target { powerpc*-*-* } } } */
 /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" }
{ "-mcpu=power9" } } */
+/* { dg-require-effective-target lp64 } */
 /* { dg-require-effective-target powerpc_p9vector_ok } */
 /* { dg-options "-mcpu=power9" } */
 
@@ -11,6 +12,8 @@
 {
   __ieee128 source = *p;
 
+  /* IEEE 128-bit floating point operations are only supported
+     on 64-bit targets.  */
   return scalar_test_data_class (source, 3);
 }
 
Index: gcc/testsuite/gcc.target/powerpc/bfp/scalar-insert-exp-11.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/bfp/scalar-insert-exp-11.c   
(revision 259316)
+++ gcc/testsuite/gcc.target/powerpc/bfp/scalar-insert-exp-11.c   
(working copy)
@@ -17,5 +17,5 @@
   __ieee128 significand = *significand_p;
   unsigned long long int exponent = *exponent_p;
 
-  return scalar_insert_exp (significand, exponent); /* { dg-error
"builtin function '__builtin_vec_scalar_insert_exp' not supported in
this compiler configuration" } */
+  return scalar_insert_exp (significand, exponent); /* { dg-error
"requires ISA 3.0 IEEE 128-bit floating point" } */
 }
Index: gcc/testsuite/gcc.target/powerpc/bfp/scalar-test-data-class-9.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/bfp/scalar-test-data-class-9.c   
(revision 259316)
+++ gcc/testsuite/gcc.target/powerpc/bfp/scalar-test-data-class-9.c   
(working copy)
@@ -1,5 +1,6 @@
 /* { dg-do compile { target { powerpc*-*-* } } } */
 /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" }
{ "-mcpu=power9" } } */
+/* { dg-require-effective-target lp64 } */
 /* { dg-require-effective-target powerpc_p9vector_ok } */
 /* { dg-options "-mcpu=power9" } */
 
@@ -11,6 +12,8 @@
 {
   __ieee128 source = *p;
 
+  /* IEEE 128-bit floating point operations are only supported
+     on 64-bit targets.  */
   return scalar_test_data_class (source, 256);    /* { dg-error
"argument 2 must be a 7-bit unsigned literal" } */
 }
 
Index: gcc/testsuite/gcc.target/powerpc/bfp/scalar-extract-exp-5.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/bfp/scalar-extract-exp-5.c   
(revision 259316)
+++ gcc/testsuite/gcc.target/powerpc/bfp/scalar-extract-exp-5.c   
(working copy)
@@ -15,7 +15,7 @@
 {
   __ieee128 source = *p;
 
-  return scalar_extract_exp (source);    /* { dg-error "builtin
function '__builtin_vec_scalar_extract_exp' not supported in this
compiler configuration" } */
+  return scalar_extract_exp (source);    /* { dg-error "requires ISA
3.0 IEEE 128-bit floating point" } */
 }
 
 
Index: gcc/testsuite/gcc.target/powerpc/bfp/scalar-test-data-class-10.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/bfp/scalar-test-data-class-10.c   
(revision 259316)
+++ gcc/testsuite/gcc.target/powerpc/bfp/scalar-test-data-class-10.c   
(working copy)
@@ -1,5 +1,8 @@
 /* { dg-do compile { target { powerpc*-*-* } } } */
 /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" }
{ "-mcpu=power9" } } */
+/* Require 64-bit target to select expected error message below.  32-bit
+   target produces different error message.  */
+/* { dg-require-effective-target lp64 } */
 /* { dg-require-effective-target powerpc_p9vector_ok } */
 /* { dg-options "-mcpu=power9" } */
 
Index: gcc/config/rs6000/rs6000-protos.h
===================================================================
--- gcc/config/rs6000/rs6000-protos.h    (revision 259316)
+++ gcc/config/rs6000/rs6000-protos.h    (working copy)
@@ -212,6 +212,7 @@
 extern void rs6000_aix_asm_output_dwarf_table_ref (char *);
 extern void get_ppc476_thunk_name (char name[32]);
 extern bool rs6000_overloaded_builtin_p (enum rs6000_builtins);
+extern bool rs6000_builtin_is_supported_p (enum rs6000_builtins);
 extern const char *rs6000_overloaded_builtin_name (enum rs6000_builtins);
 extern int rs6000_store_data_bypass_p (rtx_insn *, rtx_insn *);
 extern HOST_WIDE_INT rs6000_builtin_mask_calculate (void);
Index: gcc/config/rs6000/rs6000-c.c
===================================================================
--- gcc/config/rs6000/rs6000-c.c    (revision 259316)
+++ gcc/config/rs6000/rs6000-c.c    (working copy)
@@ -6885,6 +6885,8 @@
 
   {
     bool unsupported_builtin = false;
+    enum rs6000_builtins overloaded_code;
+    tree result = NULL;
     for (desc = altivec_overloaded_builtins;
      desc->code && desc->code != fcode; desc++)
       continue;
@@ -6897,7 +6899,6 @@
        discrimination between the desired forms of the function.  */
     if (fcode == P6_OV_BUILTIN_CMPB)
       {
-    int overloaded_code;
     machine_mode arg1_mode = TYPE_MODE (types[0]);
     machine_mode arg2_mode = TYPE_MODE (types[1]);
 
@@ -6932,14 +6933,20 @@
         && rs6000_builtin_type_compatible (types[1], desc->op2))
       {
         if (rs6000_builtin_decls[desc->overloaded_code] != NULL_TREE)
-          return altivec_build_resolved_builtin (args, n, desc);
+          {
+        result = altivec_build_resolved_builtin (args, n, desc);
+        /* overloaded_code is set above */
+        if (!rs6000_builtin_is_supported_p (overloaded_code))
+          unsupported_builtin = true;
+        else
+          return result;
+          }
         else
           unsupported_builtin = true;
       }
       }
     else if (fcode == P9V_BUILTIN_VEC_VSIEDP)
       {
-    int overloaded_code;
     machine_mode arg1_mode = TYPE_MODE (types[0]);
 
     if (nargs != 2)
@@ -6974,12 +6981,20 @@
     while (desc->code && desc->code == fcode
            && desc->overloaded_code != overloaded_code)
       desc++;
+
     if (desc->code && (desc->code == fcode)
         && rs6000_builtin_type_compatible (types[0], desc->op1)
         && rs6000_builtin_type_compatible (types[1], desc->op2))
       {
         if (rs6000_builtin_decls[desc->overloaded_code] != NULL_TREE)
-          return altivec_build_resolved_builtin (args, n, desc);
+          {
+        result = altivec_build_resolved_builtin (args, n, desc);
+        /* overloaded_code is set above.  */
+        if (!rs6000_builtin_is_supported_p (overloaded_code))
+          unsupported_builtin = true;
+        else
+          return result;
+          }
         else
           unsupported_builtin = true;
       }
@@ -6998,7 +7013,18 @@
             || rs6000_builtin_type_compatible (types[2], desc->op3)))
           {
         if (rs6000_builtin_decls[desc->overloaded_code] != NULL_TREE)
-          return altivec_build_resolved_builtin (args, n, desc);
+          {
+            result = altivec_build_resolved_builtin (args, n, desc);
+            if (!rs6000_builtin_is_supported_p (desc->overloaded_code))
+              {
+            /* Allow loop to continue in case a different
+               definition is supported.  */
+            overloaded_code = desc->overloaded_code;
+            unsupported_builtin = true;
+              }
+            else
+              return result;
+          }
         else
           unsupported_builtin = true;
           }
@@ -7008,9 +7034,24 @@
     if (unsupported_builtin)
       {
     const char *name = rs6000_overloaded_builtin_name (fcode);
-    error ("builtin function %qs not supported in this compiler "
-           "configuration", name);
-    return error_mark_node;
+    if (result != NULL)
+      {
+        const char *internal_name
+          = rs6000_overloaded_builtin_name (overloaded_code);
+        /* An error message making reference to the name of the
+           non-overloaded function has already been issued.  Add
+           clarification of the previous message.  */
+        rich_location richloc (line_table, input_location);
+        inform (&richloc, "builtin %qs requires builtin %qs",
+            name, internal_name);
+      }
+    else
+      /* on 64-bit, i seem to end up here */
+      error ("builtin function %qs not supported in this compiler "
+         "configuration", name);
+    /* If an error-representing  result tree was returned from
+       altivec_build_resolved_builtin above, use it.  */
+    return (result != NULL)? result: error_mark_node;
       }
   }
  bad:
Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c    (revision 259316)
+++ gcc/config/rs6000/rs6000.c    (working copy)
@@ -15897,6 +15897,18 @@
   return target;
 }
 
+/* Check whether a builtin function is supported in this target
+   configuration.  */
+bool
+rs6000_builtin_is_supported_p (enum rs6000_builtins fncode)
+{
+  HOST_WIDE_INT fnmask = rs6000_builtin_info[fncode].mask;
+  if ((fnmask & rs6000_builtin_mask) != fnmask)
+    return false;
+  else
+    return true;
+}
+
 /* Raise an error message for a builtin function that is called without the
    appropriate target options being set.  */
 

Reply via email to