Also replace unspec_volatile with plain unspec - there no need to
prevent dead code elimination if the dependencies are correct.
gcc/ChangeLog:
* config/aarch64/aarch64-sme.md (aarch64_sme_write_zt): Add
ZTO_REGNUM use and make unspec non-volatile.
gcc/testsuite/ChangeLog:
* gcc.target/aarch64/sme/zt0_state_8.c: New test.
;; __arm_streaming __arm_out ("zt0");
(define_insn "@aarch64_sme_write_zt<SVE_FULL:mode>"
[(set (reg:V8DI ZT0_REGNUM)
- (unspec_volatile:V8DI
- [(match_operand:SVE_FULL 0 "register_operand" "w")
+ (unspec:V8DI
+ [(reg:V8DI ZT0_REGNUM)
+ (reg:DI SME_STATE_REGNUM)
+ (match_operand:SVE_FULL 0 "register_operand" "w")
(match_operand:DI 1 "const_int_operand")]
UNSPEC_SME_WRITE))]
"TARGET_SME_LUTv2 && TARGET_STREAMING"
--- /dev/null
+// { dg-options "-O3 -fomit-frame-pointer -fno-optimize-sibling-calls" }
+
+#include <arm_sme.h>
+
+#pragma GCC target "+sme2+sme-lutv2"
+
+__arm_streaming __arm_inout("zt0")
+void foo(svfloat32_t z)
+{
+ svzero_zt (0);
+ svwrite_lane_zt_f32 (0, z, 1);
+}
+
+// { dg-final { scan-assembler "zero" } }