{"id":2226264,"url":"http://patchwork.ozlabs.org/api/1.2/patches/2226264/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/patch/bmm.hhubeob5uw.gcc.gcc-TEST.pinskia.21.1.4@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.hhubeob5uw.gcc.gcc-TEST.pinskia.21.1.4@forge-stage.sourceware.org>","list_archive_url":null,"date":"2026-04-22T10:31:27","name":"[v1,4/4] cfgexpand: Handle integral vector types and constructors for scope conflicts [PR105769]","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"68960e5cf13a3034829c3e6748ae61a786c21e35","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.hhubeob5uw.gcc.gcc-TEST.pinskia.21.1.4@forge-stage.sourceware.org/mbox/","series":[{"id":500980,"url":"http://patchwork.ozlabs.org/api/1.2/series/500980/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/list/?series=500980","date":"2026-04-22T10:31:24","name":"scoped_conflicts","version":1,"mbox":"http://patchwork.ozlabs.org/series/500980/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2226264/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2226264/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 4g0x0T4kZgz1yD5\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 22 Apr 2026 20:53:29 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 5F02B407EE03\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 22 Apr 2026 10:53:27 +0000 (GMT)","from forge-stage.sourceware.org (vm08.sourceware.org [38.145.34.39])\n by sourceware.org (Postfix) with ESMTPS id E0C4C4B920FB\n for <gcc-patches@gcc.gnu.org>; Wed, 22 Apr 2026 10:32:22 +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 B789542B27\n for <gcc-patches@gcc.gnu.org>; Wed, 22 Apr 2026 10:32:22 +0000 (UTC)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 5F02B407EE03","OpenDKIM Filter v2.11.0 sourceware.org E0C4C4B920FB"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org E0C4C4B920FB","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org E0C4C4B920FB","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776853943; cv=none;\n b=KH8Jc7SMS2vbJ403j5vONirSEpqauBRPXjTVf+pVnzaDgnpy5GfA5buxosGsgt0dDXNehH5AuvBbrZiX6C7ZgbkWhsXs9pyHlol3Q8bcUmVzI3l2XN1AxD55GO7nWe0bW8FuJ2nAf3Afj0aUpcoeuDKfRlaIjHFbC5XtHXMFbxQ=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1776853943; c=relaxed/simple;\n bh=zVvLCwJQZopabPftkl0YNCbNp6KUaBn4dcwYzf+1aMY=;\n h=From:Date:Subject:To:Message-ID;\n b=LfhQ90gWKPX0TGUYZX8i2HSupyW04Djw9i2fDdHa1Ym9q7h0BSlVddWS9rqCzai5/xT++nauxt+0b/ROVh5ULDgK30cCy7DVeLPFlIGRtieOJob0QcE+C1RrcLdb6GR8qb26Mn4lDKeusnr4zoYUOoILGHBlcKK6Z45w0LwHheU=","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:31:27 +0000","Subject":"[PATCH v1 4/4] cfgexpand: Handle integral vector types and\n constructors for scope conflicts [PR105769]","To":"gcc-patches mailing list <gcc-patches@gcc.gnu.org>","Message-ID":"\n <bmm.hhubeob5uw.gcc.gcc-TEST.pinskia.21.1.4@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/21","References":"\n <bmm.hhubeob5uw.gcc.gcc-TEST.pinskia.21.1.0@forge-stage.sourceware.org>","In-Reply-To":"\n <bmm.hhubeob5uw.gcc.gcc-TEST.pinskia.21.1.0@forge-stage.sourceware.org>","X-Patch-URL":"\n https://forge.sourceware.org/pinskia/gcc-TEST/commit/ed5fea646cb7b9477d043b247b2d046e0b5b83a7","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 is an expansion of the last patch to also track pointers via vector types and the\nconstructor that are used with vector types.\nIn this case we had:\n```\n_15 = (long unsigned int) &bias;\n_10 = (long unsigned int) &cov_jn;\n_12 = {_10, _15};\n...\n\nMEM[(struct vec *)&cov_jn] ={v} {CLOBBER(bob)};\nbias ={v} {CLOBBER(bob)};\nMEM[(struct function *)&D.6156] ={v} {CLOBBER(bob)};\n\n...\nMEM <vector(2) long unsigned int> [(void *)&D.6172 + 32B] = _12;\nMEM[(struct function *)&D.6157] ={v} {CLOBBER(bob)};\n```\n\nAnyways tracking the pointers via vector types to say they are alive\nat the point where the store of the vector happens fixes the bug by saying\nit is alive at the same time as another variable is alive.\n\nBootstrapped and tested on x86_64-linux-gnu.\n\n\tPR tree-optimization/105769\n\ngcc/ChangeLog:\n\n\t* cfgexpand.cc (vars_ssa_cache::operator()): For constructors\n\twalk over the elements.\n\ngcc/testsuite/ChangeLog:\n\n\t* g++.dg/torture/pr105769-1.C: New test.\n\nSigned-off-by: Andrew Pinski <quic_apinski@quicinc.com>\n---\n gcc/cfgexpand.cc                          | 20 +++++--\n gcc/testsuite/g++.dg/torture/pr105769-1.C | 67 +++++++++++++++++++++++\n 2 files changed, 83 insertions(+), 4 deletions(-)\n create mode 100644 gcc/testsuite/g++.dg/torture/pr105769-1.C","diff":"diff --git a/gcc/cfgexpand.cc b/gcc/cfgexpand.cc\nindex 841d3c1254e9..50262b38c2da 100644\n--- a/gcc/cfgexpand.cc\n+++ b/gcc/cfgexpand.cc\n@@ -729,7 +729,7 @@ vars_ssa_cache::operator() (tree name)\n   gcc_assert (TREE_CODE (name) == SSA_NAME);\n \n   if (!POINTER_TYPE_P (TREE_TYPE (name))\n-      && !INTEGRAL_TYPE_P (TREE_TYPE (name)))\n+      && !ANY_INTEGRAL_TYPE_P (TREE_TYPE (name)))\n     return empty;\n \n   if (exists (name))\n@@ -759,7 +759,7 @@ vars_ssa_cache::operator() (tree name)\n \tcontinue;\n \n       if (!POINTER_TYPE_P (TREE_TYPE (use))\n-\t  && !INTEGRAL_TYPE_P (TREE_TYPE (use)))\n+\t  && !ANY_INTEGRAL_TYPE_P (TREE_TYPE (use)))\n \tcontinue;\n \n       /* Mark the old ssa name needs to be update from the use. */\n@@ -773,10 +773,22 @@ vars_ssa_cache::operator() (tree name)\n \t so we don't go into an infinite loop for some phi nodes with loops.  */\n       create (use);\n \n+      gimple *g = SSA_NAME_DEF_STMT (use);\n+ \n+      /* CONSTRUCTOR here is always a vector initialization,\n+\t walk each element too. */\n+      if (gimple_assign_single_p (g)\n+\t  && TREE_CODE (gimple_assign_rhs1 (g)) == CONSTRUCTOR)\n+\t{\n+\t  tree ctr = gimple_assign_rhs1 (g);\n+\t  unsigned i;\n+\t  tree elm;\n+\t  FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (ctr), i, elm)\n+\t    work_list.safe_push (std::make_pair (elm, use));\n+\t}\n       /* For assignments, walk each operand for possible addresses.\n \t For PHI nodes, walk each argument. */\n-      gimple *g = SSA_NAME_DEF_STMT (use);\n-      if (gassign *a = dyn_cast <gassign *> (g))\n+      else if (gassign *a = dyn_cast <gassign *> (g))\n \t{\n \t  /* operand 0 is the lhs. */\n \t  for (unsigned i = 1; i < gimple_num_ops (g); i++)\ndiff --git a/gcc/testsuite/g++.dg/torture/pr105769-1.C b/gcc/testsuite/g++.dg/torture/pr105769-1.C\nnew file mode 100644\nindex 000000000000..3fe973656b84\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/torture/pr105769-1.C\n@@ -0,0 +1,67 @@\n+// { dg-do run }\n+\n+// PR tree-optimization/105769\n+\n+// The partitioning code would incorrectly have bias\n+// and a temporary in the same partitioning because\n+// it was thought bias was not alive when those were alive\n+// do to vectorization of a store of pointers (that included bias).\n+\n+#include <functional>\n+\n+template<size_t n, class T>\n+struct vec {\n+  T dat[n];\n+  vec() {}\n+  explicit vec(const T& x) { for(size_t i = 0; i < n; i++) dat[i] = x; }\n+  T& operator [](size_t i) { return dat[i]; }\n+  const T& operator [](size_t i) const { return dat[i]; }\n+};\n+\n+template<size_t m, size_t n, class T>\n+using mat = vec<m, vec<n, T>>;\n+template<size_t n, class T>\n+using sq_mat = mat<n, n, T>;\n+using map_t = std::function<size_t(size_t)>;\n+template<class T_v>\n+using est_t = std::function<T_v(map_t map)>;\n+template<class T_v> using est2_t = std::function<T_v(map_t map)>;\n+map_t id_map() { return [](size_t j) -> size_t { return j; }; }\n+\n+template<size_t n, class T>\n+est2_t<void> jacknife(const est_t<vec<n, T>> est, sq_mat<n, T>& cov, vec<n, T>& bias) {\n+  return [est, &cov, &bias](map_t map) -> void\n+  {\n+        bias = est(map);\n+        for(size_t i = 0; i < n; i++)\n+        {\n+          bias[i].print();\n+        }\n+  };\n+}\n+\n+template<class T>\n+void print_cov_ratio() {\n+  sq_mat<2, T> cov_jn;\n+  vec<2, T> bias;\n+  jacknife<2, T>([](map_t map) -> vec<2, T> { vec<2, T> retv; retv[0] = 1; retv[1] = 1; return retv; }, cov_jn, bias)(id_map());\n+}\n+struct ab {\n+  long long unsigned a;\n+  short unsigned b;\n+  double operator()() { return a; }\n+  ab& operator=(double rhs) { a = rhs; return *this; }\n+ void print();\n+};\n+\n+void\n+ab::print()\n+{\n+\n+}\n+\n+int main() {\n+  print_cov_ratio<ab>();\n+  return 0;\n+}\n+\n","prefixes":["v1","4/4"]}