diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pred-combine-and.c b/gcc/testsuite/gcc.target/aarch64/sve/pred-combine-and.c
new file mode 100644
index 0000000000000000000000000000000000000000..ed7fb591ec69dbdafe27fc9aa08a0b0910c94003
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/pred-combine-and.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 --save-temps" } */
+
+void f5(float * restrict z0, float * restrict z1, float *restrict x, float * restrict y, float c, int n)
+{
+    for (int i = 0; i < n; i++) {
+        float a = x[i];
+        float b = y[i];
+        if (a > b) {
+            z0[i] = a + b;
+            if (a > c) {
+                z1[i] = a - b;
+            }
+        }
+    }
+}
+
+/* { dg-final { scan-assembler-times {\tfcmgt\tp[0-9]+\.s, p[0-9]+/z, z[0-9]+\.s, z[0-9]+\.s} 2 } } */
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 1f56e10709e8f27d768c04f7ef914e2cd9347c36..27ee48aea429810a37777d907435a92b8fd1817d 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -6302,10 +6302,39 @@ vectorizable_operation (vec_info *vinfo,
 	}
       else
 	{
+	  /* When combining two masks check is either of them has already been
+	     combined with a loop mask, if that's the case we can mark that the
+	     new combined mask doesn't need to be combined with a loop mask.  */
+	  if (masked_loop_p && code == BIT_AND_EXPR)
+	    {
+	      scalar_cond_masked_key cond1 (op0, ncopies);
+	      if (loop_vinfo->scalar_cond_masked_set.contains (cond1))
+		{
+		  tree mask = vect_get_loop_mask (gsi, masks, vec_num * ncopies,
+						  vectype, i);
+
+		  vop0 = prepare_load_store_mask (TREE_TYPE (mask), mask, vop0, gsi);
+		  scalar_cond_masked_key cond (scalar_dest, ncopies);
+		  loop_vinfo->scalar_cond_masked_set.add (cond);
+		}
+
+	      scalar_cond_masked_key cond2 (op1, ncopies);
+	      if (loop_vinfo->scalar_cond_masked_set.contains (cond2))
+		{
+		  tree mask = vect_get_loop_mask (gsi, masks, vec_num * ncopies,
+						  vectype, i);
+
+		  vop1 = prepare_load_store_mask (TREE_TYPE (mask), mask, vop1, gsi);
+		  scalar_cond_masked_key cond (scalar_dest, ncopies);
+		  loop_vinfo->scalar_cond_masked_set.add (cond);
+		}
+	    }
+
 	  new_stmt = gimple_build_assign (vec_dest, code, vop0, vop1, vop2);
 	  new_temp = make_ssa_name (vec_dest, new_stmt);
 	  gimple_assign_set_lhs (new_stmt, new_temp);
 	  vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
+
 	  if (vec_cvt_dest)
 	    {
 	      new_temp = build1 (VIEW_CONVERT_EXPR, vectype_out, new_temp);
