diff -Nurp a/gcc/testsuite/gcc.target/aarch64/pr94266.c b/gcc/testsuite/gcc.target/aarch64/pr94266.c
--- a/gcc/testsuite/gcc.target/aarch64/pr94266.c	1969-12-31 19:00:00.000000000 -0500
+++ b/gcc/testsuite/gcc.target/aarch64/pr94266.c	2020-03-22 23:09:18.408000000 -0400
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-march=armv8.2-a+sve -msve-vector-bits=256 -ftree-loop-vectorize -O2" } */
+
+#include <stdarg.h>
+#define N 16
+int out[N];
+int a[2*N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
+
+/* Outer-loop vectorization.  */
+__attribute__ ((noinline)) void 
+foo () 
+{
+  int i, j;
+  int res;
+  for (i = 0; i < N; i++)
+    {
+      res = 1000;
+
+      for (j = 0; j < N; j++) 
+        res = res - a[i+j];
+        
+      out[i] = res;
+    }
+}
+
+int main ()
+{
+  foo ();
+  return 0;
+}
+
+
diff -Nurp a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
--- a/gcc/tree-ssa-forwprop.c	2020-03-16 03:30:42.564000000 -0400
+++ b/gcc/tree-ssa-forwprop.c	2020-03-22 21:51:47.884000000 -0400
@@ -781,6 +781,8 @@ forward_propagate_addr_expr_1 (tree name
 	    }
 	  else
 	    new_ptr = build_fold_addr_expr (def_rhs_base);
+	  if (!is_gimple_mem_ref_addr (new_ptr))
+	    return false;
 	  TREE_OPERAND (lhs, 0) = new_ptr;
 	  TREE_OPERAND (lhs, 1)
 	    = wide_int_to_tree (TREE_TYPE (TREE_OPERAND (lhs, 1)), off);
@@ -872,6 +874,8 @@ forward_propagate_addr_expr_1 (tree name
 	    }
 	  else
 	    new_ptr = build_fold_addr_expr (def_rhs_base);
+	  if (!is_gimple_mem_ref_addr (new_ptr))
+	     return false;
 	  TREE_OPERAND (rhs, 0) = new_ptr;
 	  TREE_OPERAND (rhs, 1)
 	    = wide_int_to_tree (TREE_TYPE (TREE_OPERAND (rhs, 1)), off);
