{"id":2226308,"url":"http://patchwork.ozlabs.org/api/1.2/patches/2226308/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/patch/bmm.hhubwh7m90.gcc.gcc-TEST.pinskia.33.1.15@forge-stage.sourceware.org/","project":{"id":17,"url":"http://patchwork.ozlabs.org/api/1.2/projects/17/?format=json","name":"GNU Compiler Collection","link_name":"gcc","list_id":"gcc-patches.gcc.gnu.org","list_email":"gcc-patches@gcc.gnu.org","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<bmm.hhubwh7m90.gcc.gcc-TEST.pinskia.33.1.15@forge-stage.sourceware.org>","list_archive_url":null,"date":"2026-04-22T10:49:24","name":"[v1,15/15] Copy prop for aggregates working for references","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"6aa1382a5f4d02494182197402db3a76f0283e23","submitter":{"id":93219,"url":"http://patchwork.ozlabs.org/api/1.2/people/93219/?format=json","name":"Andrew Pinski via Sourceware Forge","email":"forge-bot+pinskia@forge-stage.sourceware.org"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/gcc/patch/bmm.hhubwh7m90.gcc.gcc-TEST.pinskia.33.1.15@forge-stage.sourceware.org/mbox/","series":[{"id":500990,"url":"http://patchwork.ozlabs.org/api/1.2/series/500990/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/list/?series=500990","date":"2026-04-22T10:49:12","name":"copy-prop-arg","version":1,"mbox":"http://patchwork.ozlabs.org/series/500990/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2226308/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2226308/checks/","tags":{},"related":[],"headers":{"Return-Path":"<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":["incoming@patchwork.ozlabs.org","gcc-patches@gcc.gnu.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","gcc-patches@gcc.gnu.org"],"Authentication-Results":["legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)","sourceware.org; dmarc=none (p=none dis=none)\n header.from=forge-stage.sourceware.org","sourceware.org;\n spf=pass smtp.mailfrom=forge-stage.sourceware.org","server2.sourceware.org;\n arc=none smtp.remote-ip=38.145.34.39"],"Received":["from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g0xhf5N3Vz1yD5\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 22 Apr 2026 21:24:50 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id EADA6409FBB2\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 22 Apr 2026 11:24:48 +0000 (GMT)","from forge-stage.sourceware.org (vm08.sourceware.org [38.145.34.39])\n by sourceware.org (Postfix) with ESMTPS id 627E343413F7\n for <gcc-patches@gcc.gnu.org>; Wed, 22 Apr 2026 10:50:38 +0000 (GMT)","from forge-stage.sourceware.org (localhost [IPv6:::1])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256)\n (No client certificate requested)\n by forge-stage.sourceware.org (Postfix) with ESMTPS id 1C92442BE4\n for <gcc-patches@gcc.gnu.org>; Wed, 22 Apr 2026 10:50:32 +0000 (UTC)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org EADA6409FBB2","OpenDKIM Filter v2.11.0 sourceware.org 627E343413F7"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 627E343413F7","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 627E343413F7","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776855038; cv=none;\n b=WYvSZWfeKsvvTgb3UU5e0JDGbX9VOQnjru3kAwdu44HGeo3KufBE5TBUWz/RwiTTombEk191gyKAtIFfqswa6de4roObTWAT39b3NAr3WJDpo1bBWrAnOcl+HpGUE3Tm18OKbkF9/qTZqfroJa6FKDbImGvwhvaH/ocMIVWyBn0=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1776855038; c=relaxed/simple;\n bh=XXkEuz6M2tMtofLhzWftWuFt3MDvRxHru83YUw0tCf0=;\n h=From:Date:Subject:To:Message-ID;\n b=SeNGcyU7ZznrTCUQrbgY7ko1YSIK0QTLAdiseh7gHYhNQoa/691wFUHpFdP0LA3z1R2XAcBz924uwUsNV0z6HkrUnDhZmNO5elTlQGL/RE1bpLWgUJX8WjCfH/bNPJANvFVyob7pxxGAB5NmGJobp5KVMdkdcTgZWdhPwjSH+0g=","ARC-Authentication-Results":"i=1; server2.sourceware.org","From":"Andrew Pinski via Sourceware Forge\n <forge-bot+pinskia@forge-stage.sourceware.org>","Date":"Wed, 22 Apr 2026 10:49:24 +0000","Subject":"[PATCH v1 15/15] Copy prop for aggregates working for references","To":"gcc-patches mailing list <gcc-patches@gcc.gnu.org>","Message-ID":"\n <bmm.hhubwh7m90.gcc.gcc-TEST.pinskia.33.1.15@forge-stage.sourceware.org>","X-Mailer":"batrachomyomachia","X-Pull-Request-Organization":"gcc","X-Pull-Request-Repository":"gcc-TEST","X-Pull-Request":"https://forge.sourceware.org/gcc/gcc-TEST/pulls/33","References":"\n <bmm.hhubwh7m90.gcc.gcc-TEST.pinskia.33.1.0@forge-stage.sourceware.org>","In-Reply-To":"\n <bmm.hhubwh7m90.gcc.gcc-TEST.pinskia.33.1.0@forge-stage.sourceware.org>","X-Patch-URL":"\n https://forge.sourceware.org/pinskia/gcc-TEST/commit/bbdc05f12ac331ba2244d84603db2f3c1fa17e67","X-BeenThere":"gcc-patches@gcc.gnu.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Gcc-patches mailing list <gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>","List-Archive":"<https://gcc.gnu.org/pipermail/gcc-patches/>","List-Post":"<mailto:gcc-patches@gcc.gnu.org>","List-Help":"<mailto:gcc-patches-request@gcc.gnu.org?subject=help>","List-Subscribe":"<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>","Reply-To":"gcc-patches mailing list <gcc-patches@gcc.gnu.org>,\n pinskia@gcc.gnu.org","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"},"content":"From: Andrew Pinski <quic_apinski@quicinc.com>\n\nThis addds aggregates working for references.\n\ntestresults need fixing:\nFAIL: gcc.dg/tree-ssa/sra-11.c scan-tree-dump-times esra \"Created a replacement for s2\" 1\nXPASS: gcc.dg/tree-ssa/sra-2.c scan-tree-dump-times optimized \"link_error\" 0\nFAIL: gcc.dg/tree-ssa/ssa-fre-26.c scan-tree-dump fre1 \"Replaced u.i with 0 in\"\n\ngcc.dg/tree-ssa/sra-11.c is because copy prop for aggregates happens and then SRA does not need do anything.\ngcc.dg/tree-ssa/sra-2.c is basically testing copy prop for aggregates.\ngcc.dg/tree-ssa/ssa-fre-26.c is testing fre handling of copies of aggregates (will disable forwprop)\n\ngcc/ChangeLog:\n\n\t* gimple-fold.cc (optimize_agr_copyprop):\n\t(maybe_canonicalize_mem_ref_addr):\n\t(fold_gimple_assign):\n\nSigned-off-by: Andrew Pinski <quic_apinski@quicinc.com>\n---\n gcc/gimple-fold.cc                         | 131 +++++++++++++++++----\n gcc/testsuite/g++.dg/pr95768.C             |   4 +-\n gcc/testsuite/gcc.dg/ipa/ipa-pta-16.c      |   3 +-\n gcc/testsuite/gcc.dg/tree-ssa/copy-arg-2.c |  27 +++++\n gcc/testsuite/gcc.dg/tree-ssa/sra-11.c     |   4 +-\n gcc/testsuite/gcc.dg/tree-ssa/sra-17.c     |   3 +-\n gcc/testsuite/gcc.dg/tree-ssa/sra-2.c      |   2 +-\n gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-26.c |   4 +-\n 8 files changed, 146 insertions(+), 32 deletions(-)\n create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/copy-arg-2.c","diff":"diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc\nindex db9d47868d18..26dae0538620 100644\n--- a/gcc/gimple-fold.cc\n+++ b/gcc/gimple-fold.cc\n@@ -1053,31 +1053,31 @@ optimize_memcpy_to_memset (gimple_stmt_iterator *gsip, tree dest, tree src, tree\n    between the statements and is the location of what\n    will be replaced.\n */\n-static bool\n-optimize_agr_copyprop (gimple_stmt_iterator *gsip, tree dest, tree *src)\n+static tree\n+optimize_agr_copyprop (gimple_stmt_iterator *gsip, tree dest, tree src)\n {\n   gimple *stmt = gsi_stmt (*gsip);\n   if (gimple_has_volatile_ops (stmt))\n-    return false;\n+    return NULL_TREE;\n \n   tree vuse = gimple_vuse (stmt);\n   if (vuse == NULL || TREE_CODE (vuse) != SSA_NAME)\n-    return false;\n+    return NULL_TREE;\n \n   gimple *defstmt = SSA_NAME_DEF_STMT (vuse);\n   if (!gimple_assign_load_p (defstmt)\n       || !gimple_store_p (defstmt))\n-    return false;\n+    return NULL_TREE;\n   if (gimple_has_volatile_ops (defstmt))\n-    return false;\n+    return NULL_TREE;\n \n   tree dest2 = gimple_assign_lhs (defstmt);\n   tree src2 = gimple_assign_rhs1 (defstmt);\n-  if (!operand_equal_p (*src, dest2, 0))\n-    return false;\n+  if (!operand_equal_p (src, dest2, 0))\n+    return NULL_TREE;\n   /* If replacing with the same thing, just skip it. */\n-  if (operand_equal_p (*src, src2, 0))\n-    return false;\n+  if (operand_equal_p (src, src2, 0))\n+    return NULL_TREE;\n \n   /* For 2 memory refences and using a temporary to do the copy,\n      don't remove the temporary as the 2 memory references might overlap.\n@@ -1089,8 +1089,8 @@ optimize_agr_copyprop (gimple_stmt_iterator *gsip, tree dest, tree *src)\n      t = *a;\n      *b = *a;\n   */\n-  if (dest && !DECL_P (dest) && DECL_P (*src) && !DECL_P (src2))\n-    return false;\n+  if (dest && !DECL_P (dest) && DECL_P (src) && !DECL_P (src2))\n+    return NULL_TREE;\n \n   if (dump_file && (dump_flags & TDF_DETAILS))\n     {\n@@ -1098,16 +1098,13 @@ optimize_agr_copyprop (gimple_stmt_iterator *gsip, tree dest, tree *src)\n       print_gimple_stmt (dump_file, stmt, 0, dump_flags);\n       fprintf (dump_file, \"after previous\\n  \");\n       print_gimple_stmt (dump_file, defstmt, 0, dump_flags);\n+      fprintf(dump_file, \"\\nReplaced \");\n+      print_generic_expr (dump_file, src, TDF_SLIM);\n+      fprintf (dump_file, \" with \");\n+      print_generic_expr (dump_file, src2, TDF_SLIM);\n+      fprintf(dump_file, \"\\n\");\n     }\n-  *src = unshare_expr (src2);\n-  update_stmt (stmt);\n-\n-  if (dump_file && (dump_flags & TDF_DETAILS))\n-    {\n-      fprintf (dump_file, \"into\\n  \");\n-      print_gimple_stmt (dump_file, stmt, 0, dump_flags);\n-    }\n-  return true;\n+  return unshare_expr (src2);\n }\n \n /* Fold function call to builtin mem{{,p}cpy,move}.  Try to detect and\n@@ -6016,7 +6013,12 @@ gimple_fold_call (gimple_stmt_iterator *gsi, bool inplace)\n     {\n       tree *a = gimple_call_arg_ptr (stmt, arg);\n       if (TREE_CODE (*a) != SSA_NAME && !is_gimple_min_invariant (*a))\n-\tchanged |= optimize_agr_copyprop (gsi, nullptr, a);\n+\tif (tree na = optimize_agr_copyprop (gsi, nullptr, *a))\n+\t  {\n+\t    changed = true;\n+\t    *a = na;\n+\t    update_stmt (stmt);\n+\t  }\n     }\n \n   if (inplace)\n@@ -6494,7 +6496,20 @@ maybe_canonicalize_mem_ref_addr (tree *t, bool is_debug = false)\n \t      gcc_unreachable ();\n \t    }\n \n-\t  TREE_OPERAND (*t, 0) = build_fold_addr_expr (base);\n+\t  /* For MEM[&MEM[ssa + CST0] + CST1] just reduce it to\n+\t     MEM[ssa + (CST0 + CST1)]. */\n+\t  if (TREE_CODE (base) == MEM_REF)\n+\t    {\n+\t      TREE_OPERAND (*t, 0) = TREE_OPERAND (base, 0);\n+\t      poly_offset_int off = mem_ref_offset (base);\n+\t      coffset += off.force_shwi ();\n+\t    }\n+\t  else\n+\t    {\n+\t      TREE_OPERAND (*t, 0) = build_fold_addr_expr (base);\n+\t      STRIP_USELESS_TYPE_CONVERSION (TREE_OPERAND (*t, 0));\n+\t    }\n+\n \t  TREE_OPERAND (*t, 1) = int_const_binop (PLUS_EXPR,\n \t\t\t\t\t\t  TREE_OPERAND (*t, 1),\n \t\t\t\t\t\t  size_int (coffset));\n@@ -6771,9 +6786,11 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace, tree (*valueize) (tree),\n \t\tchanged = true;\n \t\tbreak;\n \t      }\n-\t    if (optimize_agr_copyprop (gsi, gimple_assign_lhs (stmt),\n-\t\t\t\t       gimple_assign_rhs1_ptr (stmt)))\n+\t    if (tree na = optimize_agr_copyprop (gsi, gimple_assign_lhs (stmt),\n+\t\t\t\t\t\t gimple_assign_rhs1 (stmt)))\n \t      {\n+\t\tgimple_assign_set_rhs_from_tree (gsi, na);\n+\t\tupdate_stmt (stmt);\n \t\tchanged = true;\n \t\tbreak;\n \t      }\n@@ -6834,6 +6851,70 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace, tree (*valueize) (tree),\n \t    gimple_assign_set_rhs_from_tree (gsi, new_rhs);\n \t    changed = true;\n \t  }\n+\ttree rhs = gimple_assign_rhs1 (stmt);\n+\tif (!inplace && REFERENCE_CLASS_P (rhs))\n+\t  {\n+\t    bool was_inside_mem = false;\n+\t    tree val = unshare_expr (rhs);\n+\t    tree *rhsptr = &val;\n+\t    while (handled_component_p (*rhsptr))\n+\t      rhsptr = &TREE_OPERAND (*rhsptr, 0);\n+\t    if (TREE_CODE (*rhsptr) == MEM_REF\n+\t\t&& TREE_CODE (TREE_OPERAND (*rhsptr, 0)) == ADDR_EXPR)\n+\t      {\n+\t\twas_inside_mem = true;\n+\t\trhsptr = &TREE_OPERAND (TREE_OPERAND (*rhsptr, 0), 0);\n+\t      }\n+\t    if (DECL_P (*rhsptr))\n+\t      if (tree nrhs = optimize_agr_copyprop (gsi, nullptr, *rhsptr))\n+\t      {\n+\t\t/* Check that the alignment is ok for the replacement.  */\n+\t\tunsigned new_inner_align = DECL_P (nrhs) ? DECL_ALIGN (nrhs) : TYPE_ALIGN (TREE_TYPE (nrhs));\n+\t\tunsigned old_inner_align = DECL_ALIGN (*rhsptr);\n+\t\tunsigned old_outer_align = TYPE_ALIGN (TREE_TYPE (rhs));\n+\t\t/* FIXME: Handle doing unaligned loads. */\n+\t\tif (old_inner_align > new_inner_align\n+\t\t    && old_outer_align > new_inner_align)\n+\t\t  {\n+\t\t    if (dump_file && (dump_flags & TDF_DETAILS))\n+\t\t      {\n+\t\t\tfprintf (dump_file, \"Rejected due to alignment (%u > %u).\\n\",\n+\t\t\t\t old_inner_align, new_inner_align);\n+\t\t      }\n+\t\t    nrhs = nullptr;\n+\t\t  }\n+\t\tif (nrhs)\n+\t\t  {\n+\t\t    poly_int64 coffset;\n+\t\t    /* If this was `MEM_REF[&a]`, want to replace\n+\t\t       a with MEM_REF[&nrhs] so maybe_canonicalize_mem_ref_addr\n+\t\t       can re-canonicalized the mem ref and the correct the ADDR_EXPR. */\n+\t\t    if (was_inside_mem)\n+\t\t      {\n+\t\t\ttree tnrhs = nrhs;\n+\t\t\t/* VCE in this case can be removed is because we are building MEM_REF[&a]. */\n+\t\t\tif (TREE_CODE (nrhs) == VIEW_CONVERT_EXPR)\n+\t\t\t  nrhs = TREE_OPERAND (nrhs, 0);\n+\t\t\tnrhs = build_fold_addr_expr (nrhs);\n+\t\t\tSTRIP_USELESS_TYPE_CONVERSION (nrhs);\n+\t\t\t/* Since we are replacing inside a MEM_REF,\n+\t\t\t   the address needs simple and can't\n+\t\t\t   have non constant parts to it.  */\n+\t\t\tif (!get_addr_base_and_unit_offset (tnrhs, &coffset))\n+\t\t\t  nrhs = force_gimple_operand_gsi (gsi, nrhs, true,\n+\t\t\t\t\t\t\t   NULL_TREE, true,\n+\t\t\t\t\t\t\t   GSI_SAME_STMT);\n+\t\t\tnrhs = fold_build2 (MEM_REF, TREE_TYPE (*rhsptr),\n+\t\t\t\t\t    nrhs,\n+\t\t\t\t\t    build_zero_cst (TREE_TYPE (nrhs)));\n+\t\t      }\n+\t\t    *rhsptr = nrhs;\n+\t\t    maybe_canonicalize_mem_ref_addr (&val);\n+\t\t    gimple_assign_set_rhs_from_tree (gsi, val);\n+\t\t    changed = true;\n+\t\t  }\n+\t      }\n+\t  }\n \tbreak;\n       }\n \ndiff --git a/gcc/testsuite/g++.dg/pr95768.C b/gcc/testsuite/g++.dg/pr95768.C\nindex d34d51331346..f66b2f955358 100644\n--- a/gcc/testsuite/g++.dg/pr95768.C\n+++ b/gcc/testsuite/g++.dg/pr95768.C\n@@ -8,7 +8,7 @@ struct f\n {\n   int i;\n   static int e (int);\n-  void operator= (int) { e (i); }\n+  void operator= (int) { e (i); }  // { dg-warning \"\\\\\\[-Wuninitialized\" }\n };\n \n struct m {\n@@ -24,7 +24,7 @@ struct p {\n   n *header;\n   p () {\n     header = (n *)malloc (0);\n-    m b = *header->o();       // { dg-warning \"\\\\\\[-Wuninitialized\" }\n+    m b = *header->o();\n     b.length = 0;\n   }\n };\ndiff --git a/gcc/testsuite/gcc.dg/ipa/ipa-pta-16.c b/gcc/testsuite/gcc.dg/ipa/ipa-pta-16.c\nindex 68fa1c940187..d66a1fb90f22 100644\n--- a/gcc/testsuite/gcc.dg/ipa/ipa-pta-16.c\n+++ b/gcc/testsuite/gcc.dg/ipa/ipa-pta-16.c\n@@ -1,5 +1,6 @@\n /* { dg-do run } */\n-/* { dg-options \"-O2 -fno-tree-sra -fipa-pta -fdump-ipa-pta2-details\" } */\n+/* Turn off fowrprop and vrp as they do some copy prop for argagates.  */\n+/* { dg-options \"-O2 -fno-tree-sra -fipa-pta -fdump-ipa-pta2-details -fno-tree-forwprop -fno-tree-vrp\" } */\n \n struct X\n {\ndiff --git a/gcc/testsuite/gcc.dg/tree-ssa/copy-arg-2.c b/gcc/testsuite/gcc.dg/tree-ssa/copy-arg-2.c\nnew file mode 100644\nindex 000000000000..fb0edb28c9ef\n--- /dev/null\n+++ b/gcc/testsuite/gcc.dg/tree-ssa/copy-arg-2.c\n@@ -0,0 +1,27 @@\n+/* { dg-do compile } */\n+/* { dg-options \"-O1 -fno-tree-fre -fno-tree-sra -fdump-tree-optimized\" } */\n+\n+/* Test for SRA. */\n+\n+void link_error (void);\n+\n+typedef struct teststruct\n+{\n+  double d;\n+  char f1;\n+} teststruct;\n+\n+\n+void\n+copystruct11 (teststruct *param)\n+{\n+  static teststruct local;\n+  param->f1 = 0;\n+  local = *param;\n+  if (local.f1 != 0)\n+    link_error ();\n+}\n+\n+\n+/* There should be no reference to link_error. */\n+/* { dg-final { scan-tree-dump-times \"link_error\" 0 \"optimized\"  } } */\ndiff --git a/gcc/testsuite/gcc.dg/tree-ssa/sra-11.c b/gcc/testsuite/gcc.dg/tree-ssa/sra-11.c\nindex 282f327bbad2..05f56d62e6d6 100644\n--- a/gcc/testsuite/gcc.dg/tree-ssa/sra-11.c\n+++ b/gcc/testsuite/gcc.dg/tree-ssa/sra-11.c\n@@ -1,5 +1,7 @@\n /* { dg-do compile } */\n-/* { dg-options \"-O1 -fdump-tree-esra-details\" } */\n+/* Disable forwprop as it does simple copy prop for aggregates and\n+   for foo2, the load from s2.i becomes g->i instead so s2 becomes unused. */\n+/* { dg-options \"-O1 -fno-tree-forwprop -fdump-tree-esra-details\" } */\n \n struct S\n {\ndiff --git a/gcc/testsuite/gcc.dg/tree-ssa/sra-17.c b/gcc/testsuite/gcc.dg/tree-ssa/sra-17.c\nindex f1c74274b302..885b65c9afa1 100644\n--- a/gcc/testsuite/gcc.dg/tree-ssa/sra-17.c\n+++ b/gcc/testsuite/gcc.dg/tree-ssa/sra-17.c\n@@ -1,5 +1,6 @@\n /* { dg-do run { target { aarch64*-*-* alpha*-*-* arm*-*-* hppa*-*-* powerpc*-*-* s390*-*-* } } } */\n-/* { dg-options \"-O2 -fdump-tree-esra --param sra-max-scalarization-size-Ospeed=32\" } */\n+/* VRP and forwprop is able to remove a and use LC? directly inside the loop. */\n+/* { dg-options \"-O2 -fno-tree-forwprop -fno-vrp -fdump-tree-esra --param sra-max-scalarization-size-Ospeed=32\" } */\n /* { dg-additional-options \"-mcpu=ev4\" { target alpha*-*-* } } */\n /* { dg-additional-options \"-mno-vsx\" { target { powerpc*-*-* && ilp32 } } } */\n \ndiff --git a/gcc/testsuite/gcc.dg/tree-ssa/sra-2.c b/gcc/testsuite/gcc.dg/tree-ssa/sra-2.c\nindex e838ea4fba34..aeb8eded11ae 100644\n--- a/gcc/testsuite/gcc.dg/tree-ssa/sra-2.c\n+++ b/gcc/testsuite/gcc.dg/tree-ssa/sra-2.c\n@@ -1,5 +1,5 @@\n /* { dg-do compile } */\n-/* { dg-options \"-O1 -fno-tree-fre -fdump-tree-optimized\" } */\n+/* { dg-options \"-O1 -fno-tree-fre -fno-tree-forwprop -fdump-tree-optimized\" } */\n \n /* Test for SRA. */\n \ndiff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-26.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-26.c\nindex 05ce9af48c75..189c232e6fa5 100644\n--- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-26.c\n+++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-26.c\n@@ -1,5 +1,7 @@\n /* { dg-do compile } */\n-/* { dg-options \"-O -fno-tree-sra -fdump-tree-fre1-details\" } */\n+/* forwprop needs to be disable as it does copy prop for aggregates\n+   and the load from u.i became p->i already. */\n+/* { dg-options \"-O -fno-tree-sra -fno-tree-forwprop -fdump-tree-fre1-details\" } */\n \n union U {\n   float f;\n","prefixes":["v1","15/15"]}