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

Reply via email to