This patch reports an error if code tries to use variable-length SVE types when SVE is disabled. We already report a similar error for definitions or uses of SVE functions when SVE is disabled.
Tested on aarch64-linux-gnu and applied as r278909. Richard 2019-12-02 Richard Sandiford <richard.sandif...@arm.com> gcc/ * config/aarch64/aarch64.c (aarch64_report_sve_required): New function. (aarch64_expand_mov_immediate): Use it when attempting to measure the length of an SVE vector. (aarch64_mov_operand_p): Only allow SVE CNT immediates when SVE is enabled. gcc/testsuite/ * gcc.target/aarch64/sve/acle/general/nosve_4.c: New test. * gcc.target/aarch64/sve/acle/general/nosve_5.c: Likewise. * gcc.target/aarch64/sve/pcs/nosve_4.c: Expected a second error for the copy. * gcc.target/aarch64/sve/pcs/nosve_5.c: Likewise. * gcc.target/aarch64/sve/pcs/nosve_6.c: Likewise. Index: gcc/config/aarch64/aarch64.c =================================================================== --- gcc/config/aarch64/aarch64.c 2019-11-30 18:48:18.491984384 +0000 +++ gcc/config/aarch64/aarch64.c 2019-12-02 17:47:25.856701262 +0000 @@ -1473,6 +1473,25 @@ aarch64_err_no_fpadvsimd (machine_mode m " vector types", "+nofp"); } +/* Report when we try to do something that requires SVE when SVE is disabled. + This is an error of last resort and isn't very high-quality. It usually + involves attempts to measure the vector length in some way. */ +static void +aarch64_report_sve_required (void) +{ + static bool reported_p = false; + + /* Avoid reporting a slew of messages for a single oversight. */ + if (reported_p) + return; + + error ("this operation requires the SVE ISA extension"); + inform (input_location, "you can enable SVE using the command-line" + " option %<-march%>, or by using the %<target%>" + " attribute or pragma"); + reported_p = true; +} + /* Return true if REGNO is P0-P15 or one of the special FFR-related registers. */ inline bool @@ -4525,6 +4544,11 @@ aarch64_expand_mov_immediate (rtx dest, folding it into the relocation. */ if (!offset.is_constant (&const_offset)) { + if (!TARGET_SVE) + { + aarch64_report_sve_required (); + return; + } if (base == const0_rtx && aarch64_sve_cnt_immediate_p (offset)) emit_insn (gen_rtx_SET (dest, imm)); else @@ -16864,7 +16888,7 @@ aarch64_mov_operand_p (rtx x, machine_mo if (GET_CODE (x) == SYMBOL_REF && mode == DImode && CONSTANT_ADDRESS_P (x)) return true; - if (aarch64_sve_cnt_immediate_p (x)) + if (TARGET_SVE && aarch64_sve_cnt_immediate_p (x)) return true; return aarch64_classify_symbolic_expression (x) Index: gcc/testsuite/gcc.target/aarch64/sve/acle/general/nosve_4.c =================================================================== --- /dev/null 2019-09-17 11:41:18.176664108 +0100 +++ gcc/testsuite/gcc.target/aarch64/sve/acle/general/nosve_4.c 2019-12-02 17:47:25.856701262 +0000 @@ -0,0 +1,8 @@ +/* { dg-options "-march=armv8-a" } */ + +void +f (__SVBool_t *x, __SVBool_t *y) +{ + *x = *y; /* { dg-error {this operation requires the SVE ISA extension} } */ + *x = *y; +} Index: gcc/testsuite/gcc.target/aarch64/sve/acle/general/nosve_5.c =================================================================== --- /dev/null 2019-09-17 11:41:18.176664108 +0100 +++ gcc/testsuite/gcc.target/aarch64/sve/acle/general/nosve_5.c 2019-12-02 17:47:25.856701262 +0000 @@ -0,0 +1,8 @@ +/* { dg-options "-march=armv8-a" } */ + +void +f (__SVInt8_t *x, __SVInt8_t *y) +{ + *x = *y; /* { dg-error {this operation requires the SVE ISA extension} } */ + *x = *y; +} Index: gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_4.c =================================================================== --- gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_4.c 2019-10-29 17:01:12.679889042 +0000 +++ gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_4.c 2019-12-02 17:47:25.868701178 +0000 @@ -10,5 +10,6 @@ void take_svuint8 (svuint8_t); void f (svuint8_t *ptr) { - take_svuint8 (*ptr); /* { dg-error {'take_svuint8' requires the SVE ISA extension} } */ + take_svuint8 (*ptr); /* { dg-error {this operation requires the SVE ISA extension} } */ + /* { dg-error {'take_svuint8' requires the SVE ISA extension} "" { target *-*-* } .-1 } */ } Index: gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_5.c =================================================================== --- gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_5.c 2019-10-29 17:01:12.679889042 +0000 +++ gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_5.c 2019-12-02 17:47:25.868701178 +0000 @@ -11,5 +11,6 @@ void take_svuint8_eventually (float, flo void f (svuint8_t *ptr) { - take_svuint8_eventually (0, 0, 0, 0, 0, 0, 0, 0, *ptr); /* { dg-error {arguments of type '(svuint8_t|__SVUint8_t)' require the SVE ISA extension} } */ + take_svuint8_eventually (0, 0, 0, 0, 0, 0, 0, 0, *ptr); /* { dg-error {this operation requires the SVE ISA extension} } */ + /* { dg-error {arguments of type '(svuint8_t|__SVUint8_t)' require the SVE ISA extension} "" { target *-*-* } .-1 } */ } Index: gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_6.c =================================================================== --- gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_6.c 2019-10-29 17:01:12.679889042 +0000 +++ gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_6.c 2019-12-02 17:47:25.868701178 +0000 @@ -10,5 +10,6 @@ void unprototyped (); void f (svuint8_t *ptr) { - unprototyped (*ptr); /* { dg-error {arguments of type '(svuint8_t|__SVUint8_t)' require the SVE ISA extension} } */ + unprototyped (*ptr); /* { dg-error {this operation requires the SVE ISA extension} } */ + /* { dg-error {arguments of type '(svuint8_t|__SVUint8_t)' require the SVE ISA extension} "" { target *-*-* } .-1 } */ }