Commit c0e0174b by Richard Sandiford Committed by Richard Sandiford

[AArch64] Catch attempts to use SVE types when SVE is disabled

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.

2019-12-02  Richard Sandiford  <richard.sandiford@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.

From-SVN: r278909
parent 6da4c454
2019-12-02 Richard Sandiford <richard.sandiford@arm.com> 2019-12-02 Richard Sandiford <richard.sandiford@arm.com>
* 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.
2019-12-02 Richard Sandiford <richard.sandiford@arm.com>
* config/aarch64/aarch64-sve-builtins.h * config/aarch64/aarch64-sve-builtins.h
(gimple_folder::force_vector): Declare. (gimple_folder::force_vector): Declare.
* config/aarch64/aarch64-sve-builtins.cc * config/aarch64/aarch64-sve-builtins.cc
...@@ -1473,6 +1473,25 @@ aarch64_err_no_fpadvsimd (machine_mode mode) ...@@ -1473,6 +1473,25 @@ aarch64_err_no_fpadvsimd (machine_mode mode)
" vector types", "+nofp"); " 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 /* Return true if REGNO is P0-P15 or one of the special FFR-related
registers. */ registers. */
inline bool inline bool
...@@ -4525,6 +4544,11 @@ aarch64_expand_mov_immediate (rtx dest, rtx imm) ...@@ -4525,6 +4544,11 @@ aarch64_expand_mov_immediate (rtx dest, rtx imm)
folding it into the relocation. */ folding it into the relocation. */
if (!offset.is_constant (&const_offset)) if (!offset.is_constant (&const_offset))
{ {
if (!TARGET_SVE)
{
aarch64_report_sve_required ();
return;
}
if (base == const0_rtx && aarch64_sve_cnt_immediate_p (offset)) if (base == const0_rtx && aarch64_sve_cnt_immediate_p (offset))
emit_insn (gen_rtx_SET (dest, imm)); emit_insn (gen_rtx_SET (dest, imm));
else else
...@@ -16864,7 +16888,7 @@ aarch64_mov_operand_p (rtx x, machine_mode mode) ...@@ -16864,7 +16888,7 @@ aarch64_mov_operand_p (rtx x, machine_mode mode)
if (GET_CODE (x) == SYMBOL_REF && mode == DImode && CONSTANT_ADDRESS_P (x)) if (GET_CODE (x) == SYMBOL_REF && mode == DImode && CONSTANT_ADDRESS_P (x))
return true; return true;
if (aarch64_sve_cnt_immediate_p (x)) if (TARGET_SVE && aarch64_sve_cnt_immediate_p (x))
return true; return true;
return aarch64_classify_symbolic_expression (x) return aarch64_classify_symbolic_expression (x)
......
2019-12-02 Richard Sandiford <richard.sandiford@arm.com> 2019-12-02 Richard Sandiford <richard.sandiford@arm.com>
* 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.
2019-12-02 Richard Sandiford <richard.sandiford@arm.com>
* gcc.target/aarch64/sve/acle/aarch64-sve-acle.exp: Run the * gcc.target/aarch64/sve/acle/aarch64-sve-acle.exp: Run the
general/* tests too. general/* tests too.
......
/* { 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;
}
/* { 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;
}
...@@ -10,5 +10,6 @@ void take_svuint8 (svuint8_t); ...@@ -10,5 +10,6 @@ void take_svuint8 (svuint8_t);
void void
f (svuint8_t *ptr) 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 } */
} }
...@@ -11,5 +11,6 @@ void take_svuint8_eventually (float, float, float, float, ...@@ -11,5 +11,6 @@ void take_svuint8_eventually (float, float, float, float,
void void
f (svuint8_t *ptr) 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 } */
} }
...@@ -10,5 +10,6 @@ void unprototyped (); ...@@ -10,5 +10,6 @@ void unprototyped ();
void void
f (svuint8_t *ptr) 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 } */
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment