diff --git a/gcc/testsuite/gcc.target/powerpc/pure-builtin-redundant-load.c b/gcc/testsuite/gcc.target/powerpc/pure-builtin-redundant-load.c
new file mode 100644
index 0000000000000000000000000000000000000000..16ab6abfc3bf9330f8f8f640481196314f089a5a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pure-builtin-redundant-load.c
@@ -0,0 +1,47 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target powerpc_vsx_ok } */
+/* { dg-options "-O2 -fdump-tree-fre-all -mvsx" } */
+
+/* Verify we remove a redundant load that occurs both before and after
+we call a vector load builtin.
+This testcase is introduced as we updated a number of our vector load
+built-ins with the attribute of PURE instead of MEM, to indicate that
+those builtins only read from memory, versus reading from and writing
+to the same.
+This means we can identify the redundant load instructions in an earlier
+pass, and optimize them away.  */
+
+#include <altivec.h>
+
+vector signed short load_data;
+
+vector signed short foo()
+{
+	vector signed short r11,r12,r13;
+	r11 = load_data;
+	r12 = vec_xl (0, &load_data[0]);
+	r13 = load_data;
+	return (r11 + r12 + r13);
+}
+
+vector signed short biz()
+{
+	vector signed short r21,r22,r23;
+	r21 = load_data;
+	r22 = vec_lvehx (0, &load_data[0]);
+	r23 = load_data;
+	return (r21 + r22 + r23);
+}
+
+vector signed short bar()
+{
+	vector signed short r31,r32,r33;
+	r31 = load_data;
+	r32 = vec_lvx (0, &load_data[0]);
+	r33 = load_data;
+	return (r31 + r32 + r33);
+}
+
+/* { dg-final { scan-tree-dump-times "Removing dead stmt r13_. = load_data;" 1 "fre1" } } */
+/* { dg-final { scan-tree-dump-times "Removing dead stmt r23_. = load_data;" 1 "fre1" } } */
+/* { dg-final { scan-tree-dump-times "Removing dead stmt r33_. = load_data;" 1 "fre1" } } */