From 04da747a063850333b062e48d0531debe314dff9 Mon Sep 17 00:00:00 2001 From: Kewen Lin Date: Tue, 23 Jul 2024 00:47:49 -0500 Subject: rs6000: Escalate warning to error for VSX with explicit no-altivec etc. As the discussion in PR115688, for now when users specify -mvsx and -mno-altivec explicitly, compiler emits warning rather than error, but considering both options are given explicitly, emitting hard error should be better. So this patch is to escalate some related warning to error when both are incompatible. PR target/115713 gcc/ChangeLog: * config/rs6000/rs6000.cc (rs6000_option_override_internal): Emit error messages when explicit VSX encounters explicit soft-float, no-altivec or avoid-indexed-addresses. gcc/testsuite/ChangeLog: * gcc.target/powerpc/warn-1.c: Move to ... * gcc.target/powerpc/error-1.c: ... here. Adjust dg-warning with dg-error and remove ineffective scan. --- gcc/config/rs6000/rs6000.cc | 41 +++++++++++++++++------------- gcc/testsuite/gcc.target/powerpc/error-1.c | 18 +++++++++++++ gcc/testsuite/gcc.target/powerpc/warn-1.c | 19 -------------- 3 files changed, 41 insertions(+), 37 deletions(-) create mode 100644 gcc/testsuite/gcc.target/powerpc/error-1.c delete mode 100644 gcc/testsuite/gcc.target/powerpc/warn-1.c (limited to 'gcc') diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index eddd2ad..019bb7c 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -3830,32 +3830,37 @@ rs6000_option_override_internal (bool global_init_p) /* Add some warnings for VSX. */ if (TARGET_VSX) { - const char *msg = NULL; + bool explicit_vsx_p = rs6000_isa_flags_explicit & OPTION_MASK_VSX; if (!TARGET_HARD_FLOAT) { - if (rs6000_isa_flags_explicit & OPTION_MASK_VSX) - msg = N_("%<-mvsx%> requires hardware floating point"); - else + if (explicit_vsx_p) { - rs6000_isa_flags &= ~ OPTION_MASK_VSX; - rs6000_isa_flags_explicit |= OPTION_MASK_VSX; + if (rs6000_isa_flags_explicit & OPTION_MASK_SOFT_FLOAT) + error ("%<-mvsx%> and %<-msoft-float%> are incompatible"); + else + warning (0, N_("%<-mvsx%> requires hardware floating-point")); } + rs6000_isa_flags &= ~OPTION_MASK_VSX; + rs6000_isa_flags_explicit |= OPTION_MASK_VSX; } else if (TARGET_AVOID_XFORM > 0) - msg = N_("%<-mvsx%> needs indexed addressing"); - else if (!TARGET_ALTIVEC && (rs6000_isa_flags_explicit - & OPTION_MASK_ALTIVEC)) - { - if (rs6000_isa_flags_explicit & OPTION_MASK_VSX) - msg = N_("%<-mvsx%> and %<-mno-altivec%> are incompatible"); + { + if (explicit_vsx_p && OPTION_SET_P (TARGET_AVOID_XFORM)) + error ("%<-mvsx%> and %<-mavoid-indexed-addresses%>" + " are incompatible"); else - msg = N_("%<-mno-altivec%> disables vsx"); - } - - if (msg) + warning (0, N_("%<-mvsx%> needs indexed addressing")); + rs6000_isa_flags &= ~OPTION_MASK_VSX; + rs6000_isa_flags_explicit |= OPTION_MASK_VSX; + } + else if (!TARGET_ALTIVEC + && (rs6000_isa_flags_explicit & OPTION_MASK_ALTIVEC)) { - warning (0, msg); - rs6000_isa_flags &= ~ OPTION_MASK_VSX; + if (explicit_vsx_p) + error ("%<-mvsx%> and %<-mno-altivec%> are incompatible"); + else + warning (0, N_("%<-mno-altivec%> disables vsx")); + rs6000_isa_flags &= ~OPTION_MASK_VSX; rs6000_isa_flags_explicit |= OPTION_MASK_VSX; } } diff --git a/gcc/testsuite/gcc.target/powerpc/error-1.c b/gcc/testsuite/gcc.target/powerpc/error-1.c new file mode 100644 index 0000000..d38eba8 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/error-1.c @@ -0,0 +1,18 @@ +/* { dg-do compile { target { powerpc*-*-* } } } */ +/* { dg-skip-if "" { powerpc*-*-darwin* } } */ +/* { dg-require-effective-target powerpc_vsx_ok } */ +/* { dg-options "-O -mvsx -mno-altivec" } */ + +/* { dg-error "'-mvsx' and '-mno-altivec' are incompatible" "" { target *-*-* } 0 } */ + +double +foo (double *x, double *y) +{ + double z[2]; + int i; + + for (i = 0; i < 2; i++) + z[i] = x[i] + y[i]; + return z[0] * z[1]; +} + diff --git a/gcc/testsuite/gcc.target/powerpc/warn-1.c b/gcc/testsuite/gcc.target/powerpc/warn-1.c deleted file mode 100644 index 76ac0c4..0000000 --- a/gcc/testsuite/gcc.target/powerpc/warn-1.c +++ /dev/null @@ -1,19 +0,0 @@ -/* { dg-do compile { target { powerpc*-*-* } } } */ -/* { dg-skip-if "" { powerpc*-*-darwin* } } */ -/* { dg-require-effective-target powerpc_vsx_ok } */ -/* { dg-options "-O -mvsx -mno-altivec" } */ - -/* { dg-warning "'-mvsx' and '-mno-altivec' are incompatible" "" { target *-*-* } 0 } */ - -double -foo (double *x, double *y) -{ - double z[2]; - int i; - - for (i = 0; i < 2; i++) - z[i] = x[i] + y[i]; - return z[0] * z[1]; -} - -/* { dg-final { scan-assembler-not "xsadddp" } } */ -- cgit v1.1