Is the attached refinement of this patch previously applied to mainline
ok for backport to gcc 6?  I have bootstrapped and tested without
regressions on powerpc64le-unknown-linux-gnu.

This patch differs from the original mainline patch in the following
regards:

 1. Certain commentary changes are omitted because the context to which
they applied is missing from GCC 6.

 2. A typo in a test case has been corrected.  The typo was discovered
during scrutiny of the backport regression testing results.  I will
momentarily submit a patch to correct the same test case on main line.

On 03/24/2017 04:14 PM, Segher Boessenkool wrote:
> On Fri, Mar 24, 2017 at 04:04:33PM -0600, Kelvin Nilsen wrote:
>> PR 80103 provides a test case which results in an internal
>> compiler error when invoked with -mno-direct-move -mpower9-dform-
>> vector target options.  The internal compiler error results because
>> these two target options are incompatible with each other.
>>
>> The enclosed patch simply disables this particular combination of
>> target options, terminating gcc with an error message instead of
>> producing an internal compiler error.  Additionally, this patch
>> includes new comments to address omissions from a patch committed
>> on 2017/03/23 which deals with conflicts between the 
>> -mno-power9-vector and -mcpu=power9 target options.
>>
>> This patch has been bootstrapped and tested with no regressions on
>> both powerpc64-unknown-linux-gnu and powerpc64le-unknown-linux-gnu.
>> Is this ok for the trunk?
> 
> This looks good, please apply.  Thanks,
> 
> 
> Segher
> 
> 

gcc/ChangeLog:

2017-06-28  Kelvin Nilsen  <kel...@gcc.gnu.org>

        Backport from mainline
        2017-03-27  Kelvin Nilsen  <kel...@gcc.gnu.org>

        PR target/80103
        * config/rs6000/rs6000.c (rs6000_option_override_internal): Add
        special handling for target option conflicts between dform options
        (-mpower9-dform, -mpower9-dform-vector, -mpower9-dform-scalar) and
        -mno-direct-move.

gcc/testsuite/ChangeLog:

2017-06-28  Kelvin Nilsen  <kel...@gcc.gnu.org>

        Backport from mainline
        2017-03-27  Kelvin Nilsen  <kel...@gcc.gnu.org>

        PR target/80103
        * gcc.target/powerpc/pr80103-1.c: New test.

Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c  (revision 249572)
+++ gcc/config/rs6000/rs6000.c  (working copy)
@@ -4295,6 +4295,33 @@ rs6000_option_override_internal (bool global_init_
                            | OPTION_MASK_P9_DFORM_VECTOR);
     }
 
+  if ((TARGET_P9_DFORM_SCALAR || TARGET_P9_DFORM_VECTOR)
+      && !TARGET_DIRECT_MOVE)
+    {
+      /* We prefer to not mention undocumented options in
+        error messages.  However, if users have managed to select
+        power9-dform without selecting power9-vector, they
+        already know about undocumented flags.  */
+      if ((rs6000_isa_flags_explicit & OPTION_MASK_DIRECT_MOVE)
+         && ((rs6000_isa_flags_explicit & OPTION_MASK_P9_DFORM_VECTOR) ||
+             (rs6000_isa_flags_explicit & OPTION_MASK_P9_DFORM_SCALAR) ||
+             (TARGET_P9_DFORM_BOTH == 1)))
+       error ("-mpower9-dform, -mpower9-dform-vector, -mpower9-dform-scalar"
+              " require -mdirect-move");
+      else if ((rs6000_isa_flags_explicit & OPTION_MASK_DIRECT_MOVE) == 0)
+       {
+         rs6000_isa_flags |= OPTION_MASK_DIRECT_MOVE;
+         rs6000_isa_flags_explicit |= OPTION_MASK_DIRECT_MOVE;
+       }
+      else
+       {
+         rs6000_isa_flags &=
+           ~(OPTION_MASK_P9_DFORM_SCALAR | OPTION_MASK_P9_DFORM_VECTOR);
+         rs6000_isa_flags_explicit |=
+           (OPTION_MASK_P9_DFORM_SCALAR | OPTION_MASK_P9_DFORM_VECTOR);
+       }
+    }
+
   if (TARGET_P9_DFORM_SCALAR && !TARGET_UPPER_REGS_DF)
     {
       /* We prefer to not mention undocumented options in
Index: gcc/testsuite/gcc.target/powerpc/pr80103-1.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/pr80103-1.c        (revision 0)
+++ gcc/testsuite/gcc.target/powerpc/pr80103-1.c        (working copy)
@@ -0,0 +1,16 @@
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { 
"-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-options "-mpower9-dform-vector -mno-direct-move" } */
+/* { dg-excess-errors "expect error due to conflicting target options" } */
+/* Since the error message is not associated with a particular line
+   number, we cannot use the dg-error directive and cannot specify a
+   regexp to describe the expected error message.  The expected error
+   message is: "-mpower9-dform, -mpower9-dform-vector,
+                -mpower9-dform-scalar require -mdirect-move" */
+
+int a;
+void b (__attribute__ ((__vector_size__ (16))) char c)
+{
+  a = ((__attribute__ ((__vector_size__ (2 * sizeof (long)))) long) c)[0];
+}

Reply via email to