On Thu, Jun 11, 2015 at 12:28:08PM +0100, Alan Lawrence wrote: > Hi, > > This is a follow-up to Jim Wilson's patch fixing ICE's with > -march=armv8-a+nofp, and the discussion here: > https://gcc.gnu.org/ml/gcc-patches/2015-06/msg00177.html > > The first patch improves the error messages to describe what kind of code > caused the problem, and to error rather than "sorry" (we should not be sorry, > the user has asked the compiler to do something that makes no sense!). > Moreover, to issue an error, rather than ICE, on some testcases (supplied!). > > The error messages in aarch64_setup_incoming_varargs and > aarch64_expand_builtin_va_start are then never reached as error() has already > been called, so change them to asserts. > > Compiling with -mgeneral-regs-only on functions taking vector arguments, and > simple arithmetic using float/double, all raise the error; on functions using > vectors only internally not via ABI, at least some are handled by the midend > using scalar code. > > > The second patch cleans up the documentation in line with the previous > discussion.
Submissions on this list should be one patch per mail, it makes tracking review easier. Comments inline below. > gcc/ChangeLog: > > * config/aarch64/aarch64-protos.h (aarch64_err_no_fpadvsimd): New. > > * config/aarch64/aarch64.md (mov<mode>/GPF, movtf): Use > aarch64_err_no_fpadvsimd. > > * config/aarch64/aarch64.c (aarch64_err_no_fpadvsimd): New. > (aarch64_layout_arg, aarch64_init_cumulative_args): Use > aarch64_err_no_fpadvsimd if !TARGET_FLOAT and we need FP regs. > (aarch64_expand_builtin_va_start, aarch64_setup_incoming_varargs): > Turn error into assert, test TARGET_FLOAT. > (aarch64_gimplify_va_arg_expr): Use aarch64_err_no_fpadvsimd, test > TARGET_FLOAT. > > gcc/testsuite/ChangeLog: > > * gcc.target/aarch64/mgeneral-regs_1.c: New file. > * gcc.target/aarch64/mgeneral-regs_2.c: New file. > * gcc.target/aarch64/nofp_1.c: New file. > > gcc/ChangeLog: > > * doc/invoke.texi: Clarify AArch64 feature modifiers (no)fp, (no)simd > and (no)crypto. > commit efbf0f4699ac963472834c912b46b1a3a076fa64 > Author: Alan Lawrence <alan.lawre...@arm.com> > Date: Mon Jan 12 15:04:06 2015 +0000 > > Approved r/3008, rebased > > diff --git a/gcc/config/aarch64/aarch64-protos.h > b/gcc/config/aarch64/aarch64-protos.h > index 965a11b..ac92c59 100644 > --- a/gcc/config/aarch64/aarch64-protos.h > +++ b/gcc/config/aarch64/aarch64-protos.h > @@ -259,6 +259,7 @@ unsigned aarch64_dbx_register_number (unsigned); > unsigned aarch64_trampoline_size (void); > void aarch64_asm_output_labelref (FILE *, const char *); > void aarch64_elf_asm_named_section (const char *, unsigned, tree); > +void aarch64_err_no_fpadvsimd (machine_mode, const char *); > void aarch64_expand_epilogue (bool); > void aarch64_expand_mov_immediate (rtx, rtx); > void aarch64_expand_prologue (void); > diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c > index 968a6b6..5636e7b 100644 > --- a/gcc/config/aarch64/aarch64.c > +++ b/gcc/config/aarch64/aarch64.c > @@ -534,6 +534,16 @@ static const char * const aarch64_condition_codes[] = > "hi", "ls", "ge", "lt", "gt", "le", "al", "nv" > }; > > +void > +aarch64_err_no_fpadvsimd (machine_mode mode, const char *msg) > +{ > + const char *mc = FLOAT_MODE_P (mode) ? "floating point" : "vector"; GCC coding conventions, this should be floating-point (https://gcc.gnu.org/codingconventions.html). > + if (TARGET_GENERAL_REGS_ONLY) > + error ("%qs is incompatible with %s %s", "-mgeneral-regs-only", mc, msg); > + else > + error ("%qs feature modifier is incompatible with %s %s", "+nofp", mc, > msg); > +} > + > static unsigned int > aarch64_min_divisions_for_recip_mul (enum machine_mode mode) > { > @@ -1784,6 +1794,9 @@ aarch64_layout_arg (cumulative_args_t pcum_v, > machine_mode mode, > and homogenous short-vector aggregates (HVA). */ > if (allocate_nvrn) > { > + if (!TARGET_FLOAT) > + aarch64_err_no_fpadvsimd (mode, "argument"); > + > if (nvrn + nregs <= NUM_FP_ARG_REGS) > { > pcum->aapcs_nextnvrn = nvrn + nregs; > @@ -1910,6 +1923,17 @@ aarch64_init_cumulative_args (CUMULATIVE_ARGS *pcum, > pcum->aapcs_stack_words = 0; > pcum->aapcs_stack_size = 0; > > + if (!TARGET_FLOAT > + && fndecl && TREE_PUBLIC (fndecl) > + && fntype && fntype != error_mark_node) > + { > + const_tree args, type = TREE_TYPE (fntype); > + machine_mode mode; /* To pass pointer as argument; never used. */ > + int nregs; /* Likewise. */ Do these need annotations to avoid errors in a Werror build? I don't see any mention of what testing this patch has been through? > + if (aarch64_vfp_is_call_or_return_candidate (TYPE_MODE (type), type, > + &mode, &nregs, NULL)) > + aarch64_err_no_fpadvsimd (TYPE_MODE (type), "return type"); > + } > return; > } > > @@ -7573,9 +7597,7 @@ aarch64_expand_builtin_va_start (tree valist, rtx > nextarg ATTRIBUTE_UNUSED) > > if (!TARGET_FLOAT) > { > - if (cum->aapcs_nvrn > 0) > - sorry ("%qs and floating point or vector arguments", > - "-mgeneral-regs-only"); > + gcc_assert (cum->aapcs_nvrn == 0); This promotes an error to an ICE? Can we really never get to this point through the error control flow I would have expected that to report an error then return control-flow to here. > vr_save_area_size = 0; > } > > @@ -7682,8 +7704,7 @@ aarch64_gimplify_va_arg_expr (tree valist, tree type, > gimple_seq *pre_p, > { > /* TYPE passed in fp/simd registers. */ > if (!TARGET_FLOAT) > - sorry ("%qs and floating point or vector arguments", > - "-mgeneral-regs-only"); > + aarch64_err_no_fpadvsimd (mode, "varargs"); > > f_top = build3 (COMPONENT_REF, TREE_TYPE (f_vrtop), > unshare_expr (valist), f_vrtop, NULL_TREE); > @@ -7920,9 +7941,7 @@ aarch64_setup_incoming_varargs (cumulative_args_t > cum_v, machine_mode mode, > > if (!TARGET_FLOAT) > { > - if (local_cum.aapcs_nvrn > 0) > - sorry ("%qs and floating point or vector arguments", > - "-mgeneral-regs-only"); > + gcc_assert (local_cum.aapcs_nvrn == 0); As above? > vr_saved = 0; > } > > diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md > index 11123d6..99cefec 100644 > --- a/gcc/config/aarch64/aarch64.md > +++ b/gcc/config/aarch64/aarch64.md > @@ -981,10 +981,7 @@ > "" > " > if (!TARGET_FLOAT) > - { > - sorry (\"%qs and floating point code\", \"-mgeneral-regs-only\"); > - FAIL; > - } > + aarch64_err_no_fpadvsimd (<MODE>mode, \"code\"); You've dropped the FAIL? > > if (GET_CODE (operands[0]) == MEM) > operands[1] = force_reg (<MODE>mode, operands[1]); > @@ -1035,10 +1032,7 @@ > "" > " > if (!TARGET_FLOAT) > - { > - sorry (\"%qs and floating point code\", \"-mgeneral-regs-only\"); > - FAIL; > - } > + aarch64_err_no_fpadvsimd (TFmode, \"code\"); Likewise. > > if (GET_CODE (operands[0]) == MEM) > operands[1] = force_reg (TFmode, operands[1]); > diff --git a/gcc/testsuite/gcc.target/aarch64/mgeneral-regs_1.c > b/gcc/testsuite/gcc.target/aarch64/mgeneral-regs_1.c > new file mode 100644 > index 0000000..b5192a6 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/mgeneral-regs_1.c > @@ -0,0 +1,10 @@ > +/* { dg-options "-mgeneral-regs-only" } */ > + > +typedef int int32x2_t __attribute__ ((__vector_size__ ((8)))); > + > +/* { dg-error "'-mgeneral-regs-only' is incompatible with vector return > type" "" {target "aarch64*-*-*"} 7 } */ > +/* { dg-error "'-mgeneral-regs-only' is incompatible with vector argument" > "" {target "aarch64*-*-*"} 7 } */ > +int32x2_t test (int32x2_t a, int32x2_t b) > +{ > + return a + b; > +} > diff --git a/gcc/testsuite/gcc.target/aarch64/mgeneral-regs_2.c > b/gcc/testsuite/gcc.target/aarch64/mgeneral-regs_2.c > new file mode 100644 > index 0000000..8590199 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/mgeneral-regs_2.c > @@ -0,0 +1,15 @@ > +/* { dg-options "-mgeneral-regs-only" } */ > + > +#include <stdarg.h> > + > +typedef int int32x2_t __attribute__ ((__vector_size__ ((8)))); > + > +int > +test (int i, ...) > +{ > + va_list argp; > + va_start (argp, i); > + int32x2_t x = (int32x2_t) {0, 1}; > + x += va_arg (argp, int32x2_t); /* { dg-error "'-mgeneral-regs-only' is > incompatible with vector varargs" } */ > + return x[0] + x[1]; > +} > diff --git a/gcc/testsuite/gcc.target/aarch64/nofp_1.c > b/gcc/testsuite/gcc.target/aarch64/nofp_1.c > new file mode 100644 > index 0000000..3fc0036 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/nofp_1.c > @@ -0,0 +1,19 @@ > +/* { dg-skip-if "conflicting -march" { *-*-* } { "-march=*" } { > "-march=*+nofp" } } */ > +/* If there are multiple -march's, the latest wins; skip the test either way. > + -march overrides -mcpu, so there is no possibility of conflict. */ > + > +/* { dg-options "-march=armv8-a+nofp" } */ > + > +#include <stdarg.h> > + > +typedef int int32x2_t __attribute__ ((__vector_size__ ((8)))); > + > +int test (int i, ...); > + > +int > +main (int argc, char **argv) > +{ > + int32x2_t a = (int32x2_t) {0, 1}; > + int32x2_t b = (int32x2_t) {2, 3}; > + return test (2, a, b); /* { dg-error "'\\+nofp' feature modifier is > incompatible with vector argument" } */ > +} <----> > commit 298595e5254183de5b4c1cd2acaed43949b4dd30 > Author: Alan Lawrence <alan.lawre...@arm.com> > Date: Mon Jan 19 12:18:02 2015 +0000 > > doc/invoke.texi, as approved, with whitespace. > > diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi > index e25bd62..0d62edf 100644 > --- a/gcc/doc/invoke.texi > +++ b/gcc/doc/invoke.texi > @@ -12359,7 +12359,10 @@ Generate big-endian code. This is the default when > GCC is configured for an > > @item -mgeneral-regs-only > @opindex mgeneral-regs-only > -Generate code which uses only the general registers. > +Generate code which uses only the general registers. Equivalent to feature The ARMARM uses "general-purpose registers" to refer to these registers, we should match that style. s/Equivalent to feature/This is equivalent to the feature/ > +modifier @option{nofp} of @option{-march} or @option{-mcpu}, except that > +@option{-mgeneral-regs-only} takes precedence over any conflicting feature > +modifier regardless of sequence. > > @item -mlittle-endian > @opindex mlittle-endian > @@ -12498,22 +12501,28 @@ over the appropriate part of this option. > @subsubsection @option{-march} and @option{-mcpu} Feature Modifiers > @cindex @option{-march} feature modifiers > @cindex @option{-mcpu} feature modifiers > -Feature modifiers used with @option{-march} and @option{-mcpu} can be one > -the following: > +Feature modifiers used with @option{-march} and @option{-mcpu} can be any of > +the following, or their inverses @option{no@var{feature}}: s/inverses/inverse/ > @table @samp > @item crc > Enable CRC extension. > @item crypto > -Enable Crypto extension. This implies Advanced SIMD is enabled. > +Enable Crypto extension. This also enables Advanced SIMD and floating-point > +instructions. > @item fp > -Enable floating-point instructions. > +Enable floating-point instructions. This is on by default for all possible > +values for options @option{-march} and @option{-mcpu}. > @item simd > -Enable Advanced SIMD instructions. This implies floating-point instructions > -are enabled. This is the default for all current possible values for options > -@option{-march} and @option{-mcpu=}. > +Enable Advanced SIMD instructions. This also enables floating-point > +instructions. This is on by default for all possible values for options > +@option{-march} and @option{-mcpu}. > @end table > > +As stated above, @option{crypto} implies @option{simd} implies @option{fp}. Drop the "As stated above". > +Conversely, @option{nofp} (or equivalently, @option{-mgeneral-regs-only}) > +implies @option{nosimd} implies @option{nocrypto}. > + > @node Adapteva Epiphany Options > @subsection Adapteva Epiphany Options > Thanks, James