{"id":2222578,"url":"http://patchwork.ozlabs.org/api/1.2/patches/2222578/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/patch/20260413014751.62631-2-chris@chrisnc.net/","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":"<20260413014751.62631-2-chris@chrisnc.net>","list_archive_url":null,"date":"2026-04-13T01:47:52","name":"[v3] ipa: honor memory clobbers in ipa-reference [PR124218]","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"dc06e63274bfdab647b55c24abd4c986e7b63b6b","submitter":{"id":92775,"url":"http://patchwork.ozlabs.org/api/1.2/people/92775/?format=json","name":"Chris Copeland","email":"chris@chrisnc.net"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/gcc/patch/20260413014751.62631-2-chris@chrisnc.net/mbox/","series":[{"id":499638,"url":"http://patchwork.ozlabs.org/api/1.2/series/499638/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/list/?series=499638","date":"2026-04-13T01:47:52","name":"[v3] ipa: honor memory clobbers in ipa-reference [PR124218]","version":3,"mbox":"http://patchwork.ozlabs.org/series/499638/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2222578/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2222578/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\tdkim=pass (2048-bit key;\n unprotected) header.d=chrisnc.net header.i=@chrisnc.net header.a=rsa-sha256\n header.s=sig1 header.b=hmlLNEc1;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=38.145.34.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;\n\tdkim=pass (2048-bit key,\n unprotected) header.d=chrisnc.net header.i=@chrisnc.net header.a=rsa-sha256\n header.s=sig1 header.b=hmlLNEc1","sourceware.org;\n dmarc=none (p=none dis=none) header.from=chrisnc.net","sourceware.org; spf=pass smtp.mailfrom=chrisnc.net","server2.sourceware.org;\n arc=none smtp.remote-ip=57.103.64.191"],"Received":["from vm01.sourceware.org (vm01.sourceware.org [38.145.34.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 4fv9Sz0lWrz1yGC\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 13 Apr 2026 11:54:40 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id C1F784BA2E3C\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 13 Apr 2026 01:54:37 +0000 (GMT)","from outbound.pv.icloud.com (pv-2002b-snip4-11.eps.apple.com\n [57.103.64.191])\n by sourceware.org (Postfix) with ESMTPS id 5A4394BA2E09\n for <gcc-patches@gcc.gnu.org>; Mon, 13 Apr 2026 01:54:08 +0000 (GMT)","from outbound.pv.icloud.com (unknown [127.0.0.2])\n by p00-icloudmta-asmtp-us-west-1a-20-percent-2 (Postfix) with ESMTPS id\n 467E71800126; Mon, 13 Apr 2026 01:54:06 +0000 (UTC)","from nereus (unknown [17.56.9.36])\n by p00-icloudmta-asmtp-us-west-1a-20-percent-2 (Postfix) with ESMTPSA id\n 6E140180011B; Mon, 13 Apr 2026 01:54:05 +0000 (UTC)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org C1F784BA2E3C","OpenDKIM Filter v2.11.0 sourceware.org 5A4394BA2E09"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 5A4394BA2E09","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 5A4394BA2E09","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776045248; cv=none;\n b=TG5KrOB+57/KmWjR+EyH/0jDkvBJ4ruasHIrkaG+ARjwFSx+pTje18c6TGmu7m4zGYTnFurrFQRdrSlgrZGXF1elX40Eg3JFth64L27iumA2fDz/wptgzOcFsnwz7f6KAafBXt4qjCGjEJF+F7PoVlWmCi81bSg8htRWMTDzNYc=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1776045248; c=relaxed/simple;\n bh=WH/iKyr/ph3qd8SUJuL0SwJ47yP+BK0KUOFMKxzTGio=;\n h=Dkim-Signature:From:To:Subject:Date:Message-ID:MIME-Version;\n b=Qy4/B6R/ejC9Nj5N0opYa/fn0A7/PSDp5ps8UvbFiU3Y9F22sGtaIdeAKTwKAMSmuL0LVpRw8sZt/7uDl6Bylo5O+9vWfR8SiX9KqHjRohAv459Sc1Q4pr0vNt0XG182yzTil9xMaRsz5D9Pa/ALjRIUpQzIVzdH9nmjI9F9GdQ=","ARC-Authentication-Results":"i=1; server2.sourceware.org","Dkim-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=chrisnc.net; s=sig1;\n t=1776045247; x=1778637247; bh=jwMOSXgXQCvEmEsK8eSmAB9K5r7SURJL+JqZRRvDcqA=;\n h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme;\n b=hmlLNEc1x2p14aJTL9z3uL7yZLBCXDXgW/yt6oNF9Y4W5zzJBZEEpVSXDR/kfdFBX2b720A81W0iQcX3zJalskWRqs2WFltlumVxDkzEfdbafdlTssCHyVnIgXtK0no0QHf/WfvBGTBvRtR9KP8FKTZvjykK1IsQC//2NhIucUozhHNYZcWpX3TPLnVEVG0+uFJ/eyPen2Z2EVka35IkB9nm+CkroBovgNlqr9wIEWSMoeNDBVNnEjIEx0ex56vQP7KAGYgjSOO2jV1mJRhY9j5kZ1zCkLwulFrI2NwpSbJ8Qd0nCliJUkuGuDzT8nZethl8fCn3GCFSmwVY8qj3Rw==","mail-alias-created-date":"1633366900000","From":"Chris Copeland <chris@chrisnc.net>","To":"gcc-patches@gcc.gnu.org","Cc":"Chris Copeland <chris@chrisnc.net>","Subject":"[PATCH v3] ipa: honor memory clobbers in ipa-reference [PR124218]","Date":"Sun, 12 Apr 2026 18:47:52 -0700","Message-ID":"<20260413014751.62631-2-chris@chrisnc.net>","X-Mailer":"git-send-email 2.53.0","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","X-Authority-Info-Out":"v=2.4 cv=Ye+wJgRf c=1 sm=1 tr=0 ts=69dc4cbe\n cx=c_apl:c_pps:t_out a=azHRBMxVc17uSn+fyuI/eg==:117\n a=azHRBMxVc17uSn+fyuI/eg==:17 a=A5OVakUREuEA:10 a=VkNPw1HP01LnGYTKEx00:22\n a=mDV3o1hIAAAA:8 a=EJHnG6ylAAAA:8 a=E_z_a3cTnQf1hJV6TA8A:9 a=O8hF6Hzn-FEA:10\n a=3Es6Gil5AuxR-dLjfNE0:22","X-Proofpoint-Spam-Details-Enc":"AW1haW4tMjYwNDEzMDAxMyBTYWx0ZWRfX6LD4JWVPqxmi\n 37G8Xn+3tEE66mFCejywBD6LBSvAAXXQs60C/MB8rrk/PJGSZcChV+t9/+k2MSytnRuMMZ949OA\n 5v3hj43waGuTCMpWdRb+Pi3Xh1eupOxXTyLW2pIynnj0YKFmN2z8DaCssaXC8TvvvFF/FZh9y5I\n uLK95U7WTIIvIPdXv2Lhtf7Z8e+1RRpW9UB66ng+W2hIItEYrxyuw42eHDo9LF/S1inubLRCMDJ\n E+iDqbxOzPUQrsdMzxROi1xjU5mOZty6yEDeEwrlYQEs+l+gAwW+3tNa7udkVQv5FglpALkeMFc\n sOz3+yzHva5POYMs15zeH3YsdOzhn3uFaP7Bjm/ZVZit2BR0fH+sjBLK2kgRtQ=","X-Proofpoint-GUID":"3AnGP23MvsIxUL4_065PMUW3_DZWMyk_","X-Proofpoint-ORIG-GUID":"3AnGP23MvsIxUL4_065PMUW3_DZWMyk_","X-Proofpoint-Virus-Version":"vendor=baseguard\n engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49\n definitions=2026-04-13_01,2026-04-09_02,2025-10-01_01","X-Proofpoint-Spam-Details":"rule=notspam policy=default score=0 phishscore=0\n malwarescore=0 mlxscore=0 mlxlogscore=339 lowpriorityscore=0 suspectscore=0\n bulkscore=0 clxscore=1030 adultscore=0 spamscore=0 classifier=spam\n authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000\n definitions=main-2604130013","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>","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"},"content":"Changes from v2: remove memory clobber from pr55665.C. This memory\nclobber was being ignored in ipa without these changes, and leaving it\nin now triggers a DWARF bug which is tracked by\nhttps://gcc.gnu.org/bugzilla/show_bug.cgi?id=124864. This bug can be\nreproduced without the changes in this patch.\n\n---\n\nRecord the presence of asm memory clobbers in ipa_fn_summary and use it\nin ipa-reference's analyze_function to mark all module statics as read\nand written.  Move pass_ipa_reference before pass_ipa_free_fn_summary so\nthe summary is still available when needed.\n\ngcc/ChangeLog:\n\n\tPR ipa/124218\n\t* ipa-fnsummary.h (ipa_fn_summary): Add asm_memory_clobber field.\n\t* ipa-fnsummary.cc (analyze_function_body): Set asm_memory_clobber\n\twhen a GIMPLE_ASM with a memory clobber is found.\n\t(ipa_merge_fn_summary_after_inlining): Merge asm_memory_clobber.\n\t(inline_read_section): Stream in asm_memory_clobber.\n\t(ipa_fn_summary_write): Stream out asm_memory_clobber.\n\t* ipa-reference.cc (analyze_function): Use asm_memory_clobber from\n\tfn summary to mark all module statics as read and written.\n\t* passes.def: Move pass_ipa_reference before pass_ipa_free_fn_summary.\n\ngcc/testsuite/ChangeLog:\n\n\tPR ipa/124218\n\t* gcc.dg/ipa/pr124218.c: New test.\n\t* g++.dg/guality/pr55665.C: Remove memory clobber. This memory clobber\n\twas being ignored before, and leaving it in now triggers PR124864,\n\tbreaking the test. Correct PR number in first comment.\n---\n gcc/ChangeLog                          | 13 +++++++++++\n gcc/ipa-fnsummary.cc                   |  9 ++++++++\n gcc/ipa-fnsummary.h                    |  6 +++++-\n gcc/ipa-reference.cc                   | 13 +++++++++++\n gcc/passes.def                         |  2 +-\n gcc/testsuite/ChangeLog                |  8 +++++++\n gcc/testsuite/g++.dg/guality/pr55665.C |  4 ++--\n gcc/testsuite/gcc.dg/ipa/pr124218.c    | 30 ++++++++++++++++++++++++++\n 8 files changed, 81 insertions(+), 4 deletions(-)\n create mode 100644 gcc/testsuite/gcc.dg/ipa/pr124218.c","diff":"diff --git a/gcc/ChangeLog b/gcc/ChangeLog\nindex 51f9c66b071..730423fb1f4 100644\n--- a/gcc/ChangeLog\n+++ b/gcc/ChangeLog\n@@ -1,3 +1,16 @@\n+2026-04-12  Chris Copeland  <chris@chrisnc.net>\n+\n+\tPR ipa/124218\n+\t* ipa-fnsummary.h (ipa_fn_summary): Add asm_memory_clobber field.\n+\t* ipa-fnsummary.cc (analyze_function_body): Set asm_memory_clobber\n+\twhen a GIMPLE_ASM with a memory clobber is found.\n+\t(ipa_merge_fn_summary_after_inlining): Merge asm_memory_clobber.\n+\t(inline_read_section): Stream in asm_memory_clobber.\n+\t(ipa_fn_summary_write): Stream out asm_memory_clobber.\n+\t* ipa-reference.cc (analyze_function): Use asm_memory_clobber from\n+\tfn summary to mark all module statics as read and written.\n+\t* passes.def: Move pass_ipa_reference before pass_ipa_free_fn_summary.\n+\n 2026-04-11  Christopher Albert  <albert@tugraz.at>\n \n \tPR fortran/93554\ndiff --git a/gcc/ipa-fnsummary.cc b/gcc/ipa-fnsummary.cc\nindex e187231dfb6..2e1387ec746 100644\n--- a/gcc/ipa-fnsummary.cc\n+++ b/gcc/ipa-fnsummary.cc\n@@ -3200,6 +3200,11 @@ analyze_function_body (struct cgraph_node *node, bool early)\n \t\t}\n \t    }\n \n+\t  if (!info->asm_memory_clobber\n+\t      && gimple_code (stmt) == GIMPLE_ASM\n+\t      && gimple_asm_clobbers_memory_p (as_a <gasm *> (stmt)))\n+\t    info->asm_memory_clobber = true;\n+\n \t  /* For target specific information, we want to scan all statements\n \t     rather than those statements with non-zero weights, to avoid\n \t     missing to scan something interesting for target information,\n@@ -4492,6 +4497,7 @@ ipa_merge_fn_summary_after_inlining (struct cgraph_edge *edge)\n     toplev_predicate = true;\n \n   info->fp_expressions |= callee_info->fp_expressions;\n+  info->asm_memory_clobber |= callee_info->asm_memory_clobber;\n   info->target_info |= callee_info->target_info;\n \n   if (callee_info->conds)\n@@ -4838,11 +4844,13 @@ inline_read_section (struct lto_file_decl_data *file_data, const char *data,\n \t{\n \t  info->inlinable = bp_unpack_value (&bp, 1);\n \t  info->fp_expressions = bp_unpack_value (&bp, 1);\n+\t  info->asm_memory_clobber = bp_unpack_value (&bp, 1);\n \t  if (!lto_stream_offload_p)\n \t    info->target_info = streamer_read_uhwi (&ib);\n \t}\n       else\n \t{\n+\t  bp_unpack_value (&bp, 1);\n \t  bp_unpack_value (&bp, 1);\n \t  bp_unpack_value (&bp, 1);\n \t  if (!lto_stream_offload_p)\n@@ -5084,6 +5092,7 @@ ipa_fn_summary_write (void)\n \t  bp = bitpack_create (ob->main_stream);\n \t  bp_pack_value (&bp, info->inlinable, 1);\n \t  bp_pack_value (&bp, info->fp_expressions, 1);\n+\t  bp_pack_value (&bp, info->asm_memory_clobber, 1);\n \t  streamer_write_bitpack (&bp);\n \t  if (!lto_stream_offload_p)\n \t    streamer_write_uhwi (ob, info->target_info);\ndiff --git a/gcc/ipa-fnsummary.h b/gcc/ipa-fnsummary.h\nindex de7b7f61cb1..896cb6c1725 100644\n--- a/gcc/ipa-fnsummary.h\n+++ b/gcc/ipa-fnsummary.h\n@@ -126,7 +126,8 @@ public:\n   ipa_fn_summary ()\n     : min_size (0),\n       inlinable (false), single_caller (false),\n-      fp_expressions (false), safe_to_inline_to_always_inline (0),\n+      fp_expressions (false), asm_memory_clobber (false),\n+      safe_to_inline_to_always_inline (0),\n       target_info (0), estimated_stack_size (false),\n       time (0), conds (NULL),\n       size_time_table (), call_size_time_table (vNULL),\n@@ -141,6 +142,7 @@ public:\n     : min_size (s.min_size),\n     inlinable (s.inlinable), single_caller (s.single_caller),\n     fp_expressions (s.fp_expressions),\n+    asm_memory_clobber (s.asm_memory_clobber),\n     target_info (s.target_info),\n     estimated_stack_size (s.estimated_stack_size),\n     time (s.time), conds (s.conds), size_time_table (),\n@@ -165,6 +167,8 @@ public:\n   unsigned int single_caller : 1;\n   /* True if function contains any floating point expressions.  */\n   unsigned int fp_expressions : 1;\n+  /* True if function contains an asm statement that clobbers memory.  */\n+  unsigned int asm_memory_clobber : 1;\n   /* Cache for analysis of can_early_inline_edge_p.  */\n   unsigned int safe_to_inline_to_always_inline : 2;\n   /* Like fp_expressions field above, but it's to hold some target specific\ndiff --git a/gcc/ipa-reference.cc b/gcc/ipa-reference.cc\nindex c5699312c8f..12b593b0f50 100644\n--- a/gcc/ipa-reference.cc\n+++ b/gcc/ipa-reference.cc\n@@ -50,6 +50,11 @@ along with GCC; see the file COPYING3.  If not see\n #include \"ipa-reference.h\"\n #include \"alloc-pool.h\"\n #include \"symbol-summary.h\"\n+#include \"tree-vrp.h\"\n+#include \"sreal.h\"\n+#include \"ipa-cp.h\"\n+#include \"ipa-prop.h\"\n+#include \"ipa-fnsummary.h\"\n \n /* The static variables defined within the compilation unit that are\n    loaded or stored directly by function that owns this structure.  */\n@@ -507,6 +512,7 @@ analyze_function (struct cgraph_node *fn)\n {\n   ipa_reference_local_vars_info_t local;\n   struct ipa_ref *ref = NULL;\n+  ipa_fn_summary *sum;\n   int i;\n   tree var;\n \n@@ -548,6 +554,13 @@ analyze_function (struct cgraph_node *fn)\n \t}\n     }\n \n+  sum = ipa_fn_summaries->get (fn);\n+  if (sum && sum->asm_memory_clobber)\n+    {\n+      local->statics_read = all_module_statics;\n+      local->statics_written = all_module_statics;\n+    }\n+\n   if (fn->cannot_return_p ())\n     bitmap_clear (local->statics_written);\n }\ndiff --git a/gcc/passes.def b/gcc/passes.def\nindex cdddb87302f..8344ea1a584 100644\n--- a/gcc/passes.def\n+++ b/gcc/passes.def\n@@ -176,8 +176,8 @@ along with GCC; see the file COPYING3.  If not see\n   NEXT_PASS (pass_ipa_locality_cloning);\n   NEXT_PASS (pass_ipa_pure_const);\n   NEXT_PASS (pass_ipa_modref);\n-  NEXT_PASS (pass_ipa_free_fn_summary, false /* small_p */);\n   NEXT_PASS (pass_ipa_reference);\n+  NEXT_PASS (pass_ipa_free_fn_summary, false /* small_p */);\n   /* This pass needs to be scheduled after any IP code duplication.   */\n   NEXT_PASS (pass_ipa_single_use);\n   /* Comdat privatization come last, as direct references to comdat local\ndiff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog\nindex 14820bfe8fb..31243de6eb2 100644\n--- a/gcc/testsuite/ChangeLog\n+++ b/gcc/testsuite/ChangeLog\n@@ -1,3 +1,11 @@\n+2026-04-12  Chris Copeland  <chris@chrisnc.net>\n+\n+\tPR ipa/124218\n+\t* gcc.dg/ipa/pr124218.c: New test.\n+\t* g++.dg/guality/pr55665.C: Remove memory clobber. This memory clobber\n+\twas being ignored before, and leaving it in now triggers PR124864,\n+\tbreaking the test. Correct PR number in first comment.\n+\n 2026-04-11  Christopher Albert  <albert@tugraz.at>\n \n \tPR fortran/93554\ndiff --git a/gcc/testsuite/g++.dg/guality/pr55665.C b/gcc/testsuite/g++.dg/guality/pr55665.C\nindex 16c6d281661..d100d0abc29 100644\n--- a/gcc/testsuite/g++.dg/guality/pr55665.C\n+++ b/gcc/testsuite/g++.dg/guality/pr55665.C\n@@ -1,4 +1,4 @@\n-// PR debug/55655\n+// PR debug/55665\n // { dg-do run }\n // { dg-options \"-g\" }\n \n@@ -14,7 +14,7 @@ bar (void)\n __attribute__((noinline, noclone)) void\n foo (int x)\n {\n-  __asm volatile (\"\" : : \"r\" (x) : \"memory\");\n+  __asm volatile (\"\" : : \"r\" (x));\n }\n \n A::A (int x)\ndiff --git a/gcc/testsuite/gcc.dg/ipa/pr124218.c b/gcc/testsuite/gcc.dg/ipa/pr124218.c\nnew file mode 100644\nindex 00000000000..67e95914d6b\n--- /dev/null\n+++ b/gcc/testsuite/gcc.dg/ipa/pr124218.c\n@@ -0,0 +1,30 @@\n+/* { dg-do run { target arm*-*-eabi* } } */\n+/* { dg-options \"-O1 -fwhole-program\" } */\n+\n+/* PR ipa/124218: ipa-reference must honor memory clobbers in inline asm.  */\n+\n+int flag;\n+\n+__attribute__ ((used))\n+void\n+asm_set (void)\n+{\n+  flag = 1;\n+}\n+\n+__attribute__ ((noinline))\n+static void\n+clobber_and_set (void)\n+{\n+  __asm__ volatile (\"bl asm_set\" ::: \"r0\", \"r1\", \"r2\", \"r3\",\n+\t\t    \"ip\", \"lr\", \"memory\", \"cc\");\n+}\n+\n+int main (void)\n+{\n+  flag = 0;\n+  clobber_and_set ();\n+  if (!flag)\n+    __builtin_abort ();\n+  return 0;\n+}\n","prefixes":["v3"]}