We get an ICE when using -mpower10 and a -mcpu= value that is older than power10. The -mpower10 option requires -mcpu=power10 or later. The following patch enforces that.
This passed bootstrap and regtesting with no errors. Ok for trunk? GCC 10 does not ICE on this test case, so I am not asking for a backport. Peter gcc/ PR target/95907 * config/rs6000/rs6000.c (rs6000_option_override_internal): Add check to require -mcpu=power10 if using -mpower10. gcc/testsuite/ PR target/95907 * g++.target/powerpc/pr95907.C: New test. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 6bea544d26a..96241a9d0a3 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -4094,6 +4094,14 @@ rs6000_option_override_internal (bool global_init_p) rs6000_isa_flags &= ~OPTION_MASK_FLOAT128_HW; } + /* If the user explicitly uses -mpower10, ensure our ISA flags are + compatible with it. */ + if (TARGET_POWER10 + && (rs6000_isa_flags_explicit & OPTION_MASK_POWER10) != 0 + && (processor_target_table[cpu_index].target_enable + & OPTION_MASK_POWER10) == 0) + error ("%qs requires %qs", "-mpower10", "-mcpu=power10"); + /* Enable -mprefixed by default on power10 systems. */ if (TARGET_POWER10 && (rs6000_isa_flags_explicit & OPTION_MASK_PREFIXED) == 0) rs6000_isa_flags |= OPTION_MASK_PREFIXED; diff --git a/gcc/testsuite/g++.target/powerpc/pr95907.C b/gcc/testsuite/g++.target/powerpc/pr95907.C new file mode 100644 index 00000000000..45d276f25a7 --- /dev/null +++ b/gcc/testsuite/g++.target/powerpc/pr95907.C @@ -0,0 +1,7 @@ +// PR target/95907 +// { dg-do compile } +// { dg-require-effective-target power10_ok } +// { dg-options "-mpower10" } + +int foobool_argc; +bool foobool() { return foobool_argc; }