After previous patches, we should always get a VNx16BI result for ACLE intrinsics that return svbool_t. This patch adds an assert that checks a more general condition than that.
gcc/ * config/aarch64/aarch64-sve-builtins.cc (function_expander::expand): Assert that the return value has an appropriate mode. --- gcc/config/aarch64/aarch64-sve-builtins.cc | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/gcc/config/aarch64/aarch64-sve-builtins.cc b/gcc/config/aarch64/aarch64-sve-builtins.cc index 01833a8de73..e394c9a84a0 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins.cc +++ b/gcc/config/aarch64/aarch64-sve-builtins.cc @@ -4593,7 +4593,27 @@ function_expander::expand () gcc_assert (args.last ()->mode == DImode); emit_move_insn (gen_rtx_REG (DImode, FPM_REGNUM), args.last ()); } - return base->expand (*this); + rtx result = base->expand (*this); + if (function_returns_void_p ()) + gcc_assert (result == const0_rtx); + else + { + auto expected_mode = result_mode (); + if (GET_MODE_CLASS (expected_mode) == MODE_INT) + /* Scalar integer constants don't store a mode. + + It's OK for a variable result to have a different mode from the + function return type. In particular, some functions that return int + expand into instructions that have a DImode result, with all 64 bits + of the DImode being well-defined (usually zero). */ + gcc_assert (CONST_SCALAR_INT_P (result) + || GET_MODE_CLASS (GET_MODE (result)) == MODE_INT); + else + /* In other cases, the return value should have the same mode + as the return type. */ + gcc_assert (GET_MODE (result) == expected_mode); + } + return result; } /* Return a structure type that contains a single field of type FIELD_TYPE. -- 2.43.0