--- /dev/null
+/* { dg-do compile } */
+/* { dg-additional-options "-O2" } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+/* If the compiler mistakenly vectorizes byte order reversal
+ * then the resultant code is inevitably less efficient than a
+ * rev instruction. Guard against such regressions.
+ */
+typedef unsigned int __u32;
+typedef unsigned char __u8;
+
+/*
+** rev:
+** rev w1, w1
+** str w1, \[x0\]
+** ret
+*/
+void
+rev (__u8 (*dst)[4], __u32 src)
+{
+ (*dst)[0] = src >> 24;
+ (*dst)[1] = src >> 16;
+ (*dst)[2] = src >> 8;
+ (*dst)[3] = src >> 0;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-additional-options "-O2" } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+/* If the compiler mistakenly vectorizes byte order reversal
+ * then the resultant code is inevitably less efficient than a
+ * rev instruction. Guard against such regressions.
+ */
+typedef unsigned int __u32;
+typedef unsigned char __u8;
+
+/*
+** rev2:
+** ldr w0, \[x0\]
+** rev w0, w0
+** ret
+*/
+__u32
+rev2 (const __u8 (*src)[4])
+{
+ __u32 dst = 0;
+
+ dst |= (__u32) (*src)[3] << 0;
+ dst |= (__u32) (*src)[2] << 8;
+ dst |= (__u32) (*src)[1] << 16;
+ dst |= (__u32) (*src)[0] << 24;
+
+ return dst;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-additional-options "-O2" } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+/* If the compiler mistakenly vectorizes byte order reversal
+ * then the resultant code is inevitably less efficient than a
+ * rev instruction. Guard against such regressions.
+ */
+typedef unsigned char __u8;
+
+/*
+** rev3:
+** ldr w1, \[x1\]
+** rev w1, w1
+** str w1, \[x0\]
+** ret
+*/
+void
+rev3 (unsigned char (*__restrict dst)[4],
+ const unsigned char (*__restrict src)[4])
+{
+ (*dst)[0] = (*src)[3];
+ (*dst)[1] = (*src)[2];
+ (*dst)[2] = (*src)[1];
+ (*dst)[3] = (*src)[0];
+}