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]; +}