Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2217475/?format=api
{ "id": 2217475, "url": "http://patchwork.ozlabs.org/api/patches/2217475/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/patch/CAMe9rOrVb=Bsyt8dN0Si9+vLOXdcT=uHGGeoHBRBMhTaXc8z=A@mail.gmail.com/", "project": { "id": 17, "url": "http://patchwork.ozlabs.org/api/projects/17/?format=api", "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": "<CAMe9rOrVb=Bsyt8dN0Si9+vLOXdcT=uHGGeoHBRBMhTaXc8z=A@mail.gmail.com>", "list_archive_url": null, "date": "2026-03-29T15:21:55", "name": "[v3] Adjust check for addressable misaligned stack argument", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "6d9c74b41ae1e44d3f0b20085eb318bccb2bfb82", "submitter": { "id": 4387, "url": "http://patchwork.ozlabs.org/api/people/4387/?format=api", "name": "H.J. Lu", "email": "hjl.tools@gmail.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/gcc/patch/CAMe9rOrVb=Bsyt8dN0Si9+vLOXdcT=uHGGeoHBRBMhTaXc8z=A@mail.gmail.com/mbox/", "series": [ { "id": 497924, "url": "http://patchwork.ozlabs.org/api/series/497924/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/list/?series=497924", "date": "2026-03-29T15:21:55", "name": "[v3] Adjust check for addressable misaligned stack argument", "version": 3, "mbox": "http://patchwork.ozlabs.org/series/497924/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2217475/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2217475/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=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=YP3MRDn/;\n\tdkim-atps=neutral", "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;\n\tdkim=pass (2048-bit key,\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=YP3MRDn/", "sourceware.org;\n dmarc=pass (p=none dis=none) header.from=gmail.com", "sourceware.org; spf=pass smtp.mailfrom=gmail.com", "server2.sourceware.org;\n arc=pass smtp.remote-ip=209.85.216.47" ], "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 4fkJ6h5dMDz1xrn\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 30 Mar 2026 02:23:07 +1100 (AEDT)", "from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 39B8D4BA23E8\n\tfor <incoming@patchwork.ozlabs.org>; Sun, 29 Mar 2026 15:23:05 +0000 (GMT)", "from mail-pj1-f47.google.com (mail-pj1-f47.google.com\n [209.85.216.47])\n by sourceware.org (Postfix) with ESMTPS id 6AAA14BA2E3A\n for <gcc-patches@gcc.gnu.org>; Sun, 29 Mar 2026 15:22:34 +0000 (GMT)", "by mail-pj1-f47.google.com with SMTP id\n 98e67ed59e1d1-35d971fb6f1so809990a91.0\n for <gcc-patches@gcc.gnu.org>; Sun, 29 Mar 2026 08:22:34 -0700 (PDT)" ], "DKIM-Filter": [ "OpenDKIM Filter v2.11.0 sourceware.org 39B8D4BA23E8", "OpenDKIM Filter v2.11.0 sourceware.org 6AAA14BA2E3A" ], "DMARC-Filter": "OpenDMARC Filter v1.4.2 sourceware.org 6AAA14BA2E3A", "ARC-Filter": "OpenARC Filter v1.0.0 sourceware.org 6AAA14BA2E3A", "ARC-Seal": [ "i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1774797754; cv=pass;\n b=szpvQjmqzIs4efDr/89a+8spDKTYBOskNk67g1OlvTuq6M1buqNjRDk/AtuhJwaMfvZdGvDkkeRUAYo+fMPO0ddDpfxpG7clkQ+N6qZVJAv2/2ciqMDwpwb3yj7W1v5akmYxiwSjLx8ChR0xwxpcGFfyH6enHvEzT/SXetCGfBw=", "i=1; a=rsa-sha256; t=1774797753; cv=none;\n d=google.com; s=arc-20240605;\n b=EXEH56Wop1a6ejtHEDHD9/BN/GyimKi0ecYC9m23/su2C98oVFPUwAjzPU5NkqM5zA\n TNm3SLT4Boqcs5q1XSoOrRMuT6oFCfeTjSJtU1VfUhe6JUt0WFGPbCWZT528oNZxkW2Z\n ZXKZr2sMRzT+P1OcASirzza/A3aBteYd/+cdJHCXJAGGE4EXt6j0F/+G50zJFdUGbvUn\n 4W7N2ylMtzUsDbgUcd9idxGwEe5GFWfRx2ZxHV4CbJz3mbPGx9/SORQcjKMMf9MG0os/\n MkPbp3VLscJ+wbOhDWNMVbxTtuP670ExaxYIgsvz/jprUHr3gh/EELA/va+B4NnOZS8U\n tubw==" ], "ARC-Message-Signature": [ "i=2; a=rsa-sha256; d=sourceware.org; s=key;\n t=1774797754; c=relaxed/simple;\n bh=C1fMbo5R0o6Ms0nleSEyMVZE8Sp2pPQEXFWYPVT/VZo=;\n h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To;\n b=QWyu5uYNPl86gqoMlMOMissVvo4pbA2nKH5EqrYTQBI1GmDKJt1RYsUecNAvsZba8shX+uPTszxdGzaCRWnA9sT6UyNNPQzSte37EfdPbPSauimqhQjuw7HAXgaHkk3rpt+Bbdb2KmjXQhG3kkTkZRQjaqkYxgnC3I9RBH9Jp0s=", "i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com;\n s=arc-20240605;\n h=cc:to:subject:message-id:date:from:in-reply-to:references\n :mime-version:dkim-signature;\n bh=LEt5rJfaIshSUfffsrGm0mkqHkF7UFMzIB0QoalgTQE=;\n fh=J/il2QCCqC9WjoLL5f80adZphXRoY2OdVRVrkPabtlE=;\n b=Dni4jl5cxjqSere/S+n/sR4CQCR1C/imIEeupJcCUWJVyP4tizwqFZNgrgLW4vWdDB\n BxuHnNt2+2k9Inyrzg/wKKo5BWPQky9+/FWue7/PTKei62c4l0K4v9xsFMfofm33roKg\n 8tCSv9d30HIU4kYGhcSuxi/6NYa1NNfF0kvLNhUqZAcoYHiQeX6wSLvhF8CGX3tcs6ah\n h0D1NpIw5IfyIkYJ4gxMSkFSkisHzijPcxfGKOil8tRG25qjhUsPgPB5p0lOGMThzlwL\n 5oysyuDDzXLeJQovZ17NHhZIKPJH733MNb5b48sWYsAloNLnpWoetvYDdAaMuxt0nPxa\n H5pQ==; darn=gcc.gnu.org" ], "ARC-Authentication-Results": [ "i=2; server2.sourceware.org", "i=1; mx.google.com; arc=none" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1774797753; x=1775402553; darn=gcc.gnu.org;\n h=cc:to:subject:message-id:date:from:in-reply-to:references\n :mime-version:from:to:cc:subject:date:message-id:reply-to;\n bh=LEt5rJfaIshSUfffsrGm0mkqHkF7UFMzIB0QoalgTQE=;\n b=YP3MRDn/xiNvqrfBH3pnJHF5bJATx5mCen1O+4wFiUsOFiZpH5KR+J/M2Nbn/Tneol\n hzO/5+z1U4kPvR4h2NB+IxOKr1aQDgJ1GH1wuz5iG9Tk69/2vnHqqXT3oKy+pz3ljYgx\n hilf6aFSTQyTTF/6OHVP5w5g4r0rgNr9/KkCY+igX3Gq1Imv/Sg2qDzuHHzoc337q/Vp\n 9UsWrAtz0Ea5f7dI/jbaTsX4jZibAFEofgCVJnwyYnJX6jhGbe0biazyAZ2G81YVe0ya\n tWSpvMj3lWMCZ6mBBqaJvzBeerD7lCAwnDxZUZ04HsrCTBA80/ZSDYw54YiYF8an4Igs\n 6Zvg==", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1774797753; x=1775402553;\n h=cc:to:subject:message-id:date:from:in-reply-to:references\n :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n :message-id:reply-to;\n bh=LEt5rJfaIshSUfffsrGm0mkqHkF7UFMzIB0QoalgTQE=;\n b=qtskNXcz0W/d62/B29CT7N9eMSbxnaf8fPjjhvnOZ0g9jQRbZpSd/qGqliXBrnG+NJ\n WTMScTFFmMb3jvHaCTdcfnn1VtA1H9J7cSVEy4GZ6LgE5MUiH45EOZ3BZ8XRLGvG64Br\n JHtqxKZKR0GnqyYbg8gVmi8zPS/X/arqhONgHNjPppLW6sNSC4O47pl9Wi88XLZixBIj\n woX2ff0ZpKbNRKJmzyYAIenuOBYBiK/9Mpqmjcfb5vzFsICegeo3M6Tp+PUoAbsYcsvj\n 5wnYkiKuZwa+Dv4Qb5d9Kend1N0LHc2Ywfy+QW+GB3YSRt77rXPhWXCbER/2R7v5MTBm\n XRFg==", "X-Gm-Message-State": "AOJu0YzOWpoBCSbtFFgVOfF68Odvh1x7zMqVnVooRZyr/T50qTItjNv1\n IS8rgF9f15/6F2iKACk7yGtSA1bSv0LcGiR8lXRwOdxlruawvDdAByec/NJUspgaGiqmJI+5/dN\n LxhAVSmB9mbCXWVoeNYfEo455SPTGvbw=", "X-Gm-Gg": "ATEYQzx65d7xkMxW1jgyeVrwT939oAqdJQhXRmTS2Zf1wjRy0PsWvB73k3pJR9mlNHW\n dPspwzR3TzRR0qXSoiBqJ9Q3zdCKU/Pt1eOgv0H3/5rKerSz99rYAOSVk9qGAOYDFFY3lxyoOh1\n 0MErXkKbI8vcgx+ATHk1RN5OWkCAlIdA8Vz60yRa2llol4a6gRm1PUHkJqKaF/OGoGclWi1U09q\n hDUQ3fs46HYFljKc1yg1K4ElqouQ+vw7TtPMSl7R0t7esQzwhOMsmoFTfLWSXVvNALHAL9/w8YP\n 0f3FDJc=", "X-Received": "by 2002:a17:903:3d0f:b0:2b0:774b:d89e with SMTP id\n d9443c01a7336-2b0cdcd1b69mr97092165ad.37.1774797752969; Sun, 29 Mar 2026\n 08:22:32 -0700 (PDT)", "MIME-Version": "1.0", "References": "\n <CAMe9rOqXFAi6XvMy+7yupgufFsTvUfgE7cPxMFb5ZZaywCz40Q@mail.gmail.com>\n <DC36AFA2-D741-4B08-AD26-D2585781CE8C@suse.de>\n <CAMe9rOoXKL5rToPgMPJekcsNg6nFXDunUMLkcT3UVvUQhnyyYA@mail.gmail.com>", "In-Reply-To": "\n <CAMe9rOoXKL5rToPgMPJekcsNg6nFXDunUMLkcT3UVvUQhnyyYA@mail.gmail.com>", "From": "\"H.J. Lu\" <hjl.tools@gmail.com>", "Date": "Sun, 29 Mar 2026 08:21:55 -0700", "X-Gm-Features": "AQROBzBWfiS0j4uOl2ZCerUPtwdtCkBTEvfCCUqbBQFW2PpvuJ36aAYMuiFXyiI", "Message-ID": "\n <CAMe9rOrVb=Bsyt8dN0Si9+vLOXdcT=uHGGeoHBRBMhTaXc8z=A@mail.gmail.com>", "Subject": "[PATCH v3] Adjust check for addressable misaligned stack argument", "To": "Richard Biener <rguenther@suse.de>", "Cc": "GCC Patches <gcc-patches@gcc.gnu.org>,\n Richard Sandiford <rdsandiford@googlemail.com>,\n Uros Bizjak <ubizjak@gmail.com>", "Content-Type": "multipart/mixed; boundary=\"0000000000009d3f52064e2b4dd9\"", "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": "On Sat, Mar 28, 2026 at 5:18 AM H.J. Lu <hjl.tools@gmail.com> wrote:\n>\n> On Sat, Mar 28, 2026 at 1:16 AM Richard Biener <rguenther@suse.de> wrote:\n> >\n> >\n> >\n> > > Am 28.03.2026 um 03:36 schrieb H.J. Lu <hjl.tools@gmail.com>:\n> > >\n> > > On Fri, Mar 27, 2026 at 4:14 AM Richard Biener <rguenther@suse.de> wrote:\n> > >>\n> > >> The following fixes a confusion seen in the x86 backend by\n> > >> assign_parm_adjust_stack_rtl failing to trigger a local stack copy\n> > >> for an incoming stack parameter that is not aligned according to\n> > >> its type. The condition was introduced in r0-64961-gbfc45551d5ace4\n> > >> but there is the MEM_ALIGN (stack_parm) < PREFERRED_STACK_BOUNDARY\n> > >> condition not triggering for the case in question where both\n> > >> MEM_ALIGN and PREFERRED_STACK_BOUNDARY are 128. x86 supports\n> > >> stack-realignment so we can honor the declared alignment and this\n> > >> clears up the confusion. The following replaces the bound\n> > >> by MAX_SUPPORTED_STACK_ALIGNMENT if SUPPORTS_STACK_ALIGNMENT\n> > >> and the parameter has it's address taken and with BIGGEST_ALIGNMENT\n> > >> if SUPPORTS_STACK_ALIGNMENT otherwise, only affecting x86 and nvptx\n> > >> at this point.\n> > >>\n> > >> In addition to this it changes the i386 backends computation of\n> > >> the maximum stack alignment used to bound itself to BIGGEST_ALIGNMENT\n> > >> because the middle-end does not (and in general cannot) enforce actual\n> > >> alignment of all stack objects according to their type.\n> > >>\n> > >> Bootstrapped and tested on x86_64-unknown-linux-gnu.\n> > >>\n> > >> Compared to v2 this uses BIGGEST_ALIGNMENT if the parameter does not\n> > >> have its address taken and caps ix86_update_stack_alignment on\n> > >> BIGGEST_ALIGNMENT as well.\n> > >>\n> > >> OK for the x86 parts? I assume the refined function.cc hunk is still\n> > >> LGTM from Richard S. side.\n> > >>\n> > >> Note I still fail to see why we need to scan all insns in the backend\n> > >> again after RTL expansion should have ensured to keep track of the\n> > >> maximum needed stack alignment. But I'm trying to avoid touching\n> > >> code I do not understand as much as possible.\n> > >>\n> > >> Thanks,\n> > >> Richard.\n> > >>\n> > >> PR middle-end/120839\n> > >> * function.cc (assign_parm_adjust_stack_rtl): Get the parameter\n> > >> as arugment. Adjust alignment check forcing a local copy for\n> > >> SUPPORTS_STACK_ALIGNMENT targets if the argument is not aligned\n> > >> to its type and the current alignment is less than\n> > >> MAX_SUPPORTED_STACK_ALIGNMENT if the parameter has its address\n> > >> taken or BIGGEST_ALIGNMENT otherwise.\n> > >> (assign_parms): Adjust.\n> > >> * config/i386/i386.cc (ix86_update_stack_alignment): Bound\n> > >> recorded stack alignment requirement by BIGGEST_ALIGNMENT.\n> > >>\n> > >> * gcc.dg/torture/pr120839.c: New testcase.\n> > >> * gcc.target/i386/pr120839-avx.c: Likewise.\n> > >> ---\n> > >> gcc/config/i386/i386.cc | 2 +-\n> > >> gcc/function.cc | 14 +++++++++++---\n> > >> gcc/testsuite/gcc.dg/torture/pr120839.c | 7 +++++++\n> > >> gcc/testsuite/gcc.target/i386/pr120839-avx.c | 8 ++++++++\n> > >> 4 files changed, 27 insertions(+), 4 deletions(-)\n> > >> create mode 100644 gcc/testsuite/gcc.dg/torture/pr120839.c\n> > >> create mode 100644 gcc/testsuite/gcc.target/i386/pr120839-avx.c\n> > >>\n> > >> diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc\n> > >> index 15e0dd547a9..f2a49bbaf46 100644\n> > >> --- a/gcc/config/i386/i386.cc\n> > >> +++ b/gcc/config/i386/i386.cc\n> > >> @@ -8627,7 +8627,7 @@ ix86_update_stack_alignment (rtx, const_rtx pat, void *data)\n> > >> unsigned int alignment = MEM_ALIGN (op);\n> > >>\n> > >> if (alignment > *p->stack_alignment)\n> > >> - *p->stack_alignment = alignment;\n> > >> + *p->stack_alignment = MIN (alignment, BIGGEST_ALIGNMENT);\n> > >\n> > > This is wrong. X86 backend supports MAX_OFILE_ALIGNMENT\n> > > stack alignment.\n> > >\n> > >> break;\n> > >> }\n> > >> else\n> > >> diff --git a/gcc/function.cc b/gcc/function.cc\n> > >> index bba05f3380d..41987b4f7a4 100644\n> > >> --- a/gcc/function.cc\n> > >> +++ b/gcc/function.cc\n> > >> @@ -2825,7 +2825,7 @@ assign_parm_remove_parallels (struct assign_parm_data_one *data)\n> > >> always valid and properly aligned. */\n> > >>\n> > >> static void\n> > >> -assign_parm_adjust_stack_rtl (struct assign_parm_data_one *data)\n> > >> +assign_parm_adjust_stack_rtl (tree parm, struct assign_parm_data_one *data)\n> > >> {\n> > >> rtx stack_parm = data->stack_parm;\n> > >>\n> > >> @@ -2840,7 +2840,15 @@ assign_parm_adjust_stack_rtl (struct assign_parm_data_one *data)\n> > >> MEM_ALIGN (stack_parm))))\n> > >> || (data->nominal_type\n> > >> && TYPE_ALIGN (data->nominal_type) > MEM_ALIGN (stack_parm)\n> > >> - && MEM_ALIGN (stack_parm) < PREFERRED_STACK_BOUNDARY)))\n> > >> + /* When we can re-align the stack ensure appropriate alignment\n> > >> + of the function local object up to BIGGEST_ALIGNMENT if\n> > >> + it is only accessed directly or up to the maximum supported\n> > >> + alignment if the address is exposed. */\n> > >> + && MEM_ALIGN (stack_parm) < (SUPPORTS_STACK_ALIGNMENT\n> > >> + ? (TREE_ADDRESSABLE (parm)\n> > >> + ? MAX_SUPPORTED_STACK_ALIGNMENT\n> > >> + : BIGGEST_ALIGNMENT)\n> > >> + : PREFERRED_STACK_BOUNDARY))))\n> > >\n> > > I think it should be\n> > >\n> > > @@ -2840,7 +2840,11 @@ assign_parm_adjust_stack_rtl (struct\n> > > assign_parm_data_one *data)\n> > > MEM_ALIGN (stack_parm))))\n> > > || (data->nominal_type\n> > > && TYPE_ALIGN (data->nominal_type) > MEM_ALIGN (stack_parm)\n> > > - && MEM_ALIGN (stack_parm) < PREFERRED_STACK_BOUNDARY)))\n> > > + /* The parm stack slot works if its address isn't taken. When\n> > > + making a local copy, MAX_SUPPORTED_STACK_ALIGNMENT is\n> > > + its maximum alignment. */\n> > > + && TREE_ADDRESSABLE (parm)\n> > > + && MEM_ALIGN (stack_parm) < MAX_SUPPORTED_STACK_ALIGNMENT)))\n> > > stack_parm = NULL;\n> >\n> > Even when not address taken the ABI guaranteed alignment of the stack slot might be less than the declared alignment. If the alignment itself is not exposed via the address we have still to avoid faulting, thus BIGGEST_ALIGNMENT\n>\n> There should be no fault. Otherwise, caller will fault first when\n> such an argument\n> is pushed onto stack.\n>\n\nHere is the combined patch with tests.\n\nAdjust alignment check forcing a local copy if the argument on stack is\nnot aligned to its type and the current alignment, which is determined\nby the backend, is less than MAX_SUPPORTED_STACK_ALIGNMENT when the\nparameter has its address taken.\n\nFor x86, ignore argument passed on stack when updating stack alignment\nsince caller is responsible to align the outgoing stack for arguments\npassed on stack.\n\ngcc/\n\nPR target/120839\nPR middle-end/124671\n* function.cc (assign_parm_adjust_stack_rtl): Get the parameter\nas argument. Adjust alignment check forcing a local copy.\n(assign_parms): Adjust.\n* config/i386/i386.cc (ix86_argument_passed_on_stack_p): New.\n(ix86_update_stack_alignment): Ignore argument passed on stack.\n\ngcc/testsuite/\n\nPR target/120839\nPR middle-end/124671\n* gcc.dg/pr124671.c: New test.\n* gcc.target/i386/pr120839-1a.c: Likewise.\n* gcc.target/i386/pr120839-1b.c: Likewise.\n* gcc.target/i386/pr120839-2.c: Likewise.\n\nSigned-off-by: H.J. Lu <hjl.tools@gmail.com>\nCo-Authored-By: Richard Biener <rguenther@suse.de>", "diff": "From 868309ed9c6756a0560062da55e17732bf12085a Mon Sep 17 00:00:00 2001\nFrom: \"H.J. Lu\" <hjl.tools@gmail.com>\nDate: Sat, 28 Jun 2025 06:27:25 +0800\nSubject: [PATCH v3] Adjust check for addressable misaligned stack argument\n\nAdjust alignment check forcing a local copy if the argument on stack is\nnot aligned to its type and the current alignment, which is determined\nby the backend, is less than MAX_SUPPORTED_STACK_ALIGNMENT when the\nparameter has its address taken.\n\nFor x86, ignore argument passed on stack when updating stack alignment\nsince caller is responsible to align the outgoing stack for arguments\npassed on stack.\n\ngcc/\n\n\tPR target/120839\n\tPR middle-end/124671\n\t* function.cc (assign_parm_adjust_stack_rtl): Get the parameter\n\tas argument. Adjust alignment check forcing a local copy.\n\t(assign_parms): Adjust.\n\t* config/i386/i386.cc (ix86_argument_passed_on_stack_p): New.\n\t(ix86_update_stack_alignment): Ignore argument passed on stack.\n\ngcc/testsuite/\n\n\tPR target/120839\n\tPR middle-end/124671\n\t* gcc.dg/pr124671.c: New test.\n\t* gcc.target/i386/pr120839-1a.c: Likewise.\n\t* gcc.target/i386/pr120839-1b.c: Likewise.\n\t* gcc.target/i386/pr120839-2.c: Likewise.\n\nSigned-off-by: H.J. Lu <hjl.tools@gmail.com>\nCo-Authored-By: Richard Biener <rguenther@suse.de>\n---\n gcc/config/i386/i386.cc | 20 +++++++++++-\n gcc/function.cc | 11 +++++--\n gcc/testsuite/gcc.dg/pr124671.c | 34 +++++++++++++++++++++\n gcc/testsuite/gcc.target/i386/pr120839-1a.c | 15 +++++++++\n gcc/testsuite/gcc.target/i386/pr120839-1b.c | 5 +++\n gcc/testsuite/gcc.target/i386/pr120839-2.c | 19 ++++++++++++\n 6 files changed, 100 insertions(+), 4 deletions(-)\n create mode 100644 gcc/testsuite/gcc.dg/pr124671.c\n create mode 100644 gcc/testsuite/gcc.target/i386/pr120839-1a.c\n create mode 100644 gcc/testsuite/gcc.target/i386/pr120839-1b.c\n create mode 100644 gcc/testsuite/gcc.target/i386/pr120839-2.c\n\ndiff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc\nindex 15e0dd547a9..3f7fe0bcf0c 100644\n--- a/gcc/config/i386/i386.cc\n+++ b/gcc/config/i386/i386.cc\n@@ -8607,6 +8607,20 @@ struct stack_access_data\n unsigned int *stack_alignment;\n };\n \n+/* Return true if OP references an argument passed on stack. */\n+\n+static bool\n+ix86_argument_passed_on_stack_p (const_rtx op)\n+{\n+ tree mem_expr = MEM_EXPR (op);\n+ if (mem_expr)\n+ {\n+ tree var = get_base_address (mem_expr);\n+ return TREE_CODE (var) == PARM_DECL;\n+ }\n+ return false;\n+}\n+\n /* Update the maximum stack slot alignment from memory alignment in PAT. */\n \n static void\n@@ -8622,7 +8636,11 @@ ix86_update_stack_alignment (rtx, const_rtx pat, void *data)\n auto op = *iter;\n if (MEM_P (op))\n \t{\n-\t if (reg_mentioned_p (p->reg, XEXP (op, 0)))\n+\t /* NB: Ignore arguments passed on stack since caller is\n+\t responsible to align the outgoing stack for arguments\n+\t passed on stack. */\n+\t if (reg_mentioned_p (p->reg, XEXP (op, 0))\n+\t && !ix86_argument_passed_on_stack_p (op))\n \t {\n \t unsigned int alignment = MEM_ALIGN (op);\n \ndiff --git a/gcc/function.cc b/gcc/function.cc\nindex bba05f3380d..b004508dd9a 100644\n--- a/gcc/function.cc\n+++ b/gcc/function.cc\n@@ -2825,7 +2825,7 @@ assign_parm_remove_parallels (struct assign_parm_data_one *data)\n always valid and properly aligned. */\n \n static void\n-assign_parm_adjust_stack_rtl (struct assign_parm_data_one *data)\n+assign_parm_adjust_stack_rtl (tree parm, struct assign_parm_data_one *data)\n {\n rtx stack_parm = data->stack_parm;\n \n@@ -2840,7 +2840,12 @@ assign_parm_adjust_stack_rtl (struct assign_parm_data_one *data)\n \t\t\t\t\t\t MEM_ALIGN (stack_parm))))\n \t || (data->nominal_type\n \t && TYPE_ALIGN (data->nominal_type) > MEM_ALIGN (stack_parm)\n-\t && MEM_ALIGN (stack_parm) < PREFERRED_STACK_BOUNDARY)))\n+\t /* Use the parm stack slot, whose alignment is determined\n+\t\t by targetm.calls.function_arg_boundary, if its address\n+\t\t isn't taken. When making a local copy, its maximum\n+\t\t alignment is MAX_SUPPORTED_STACK_ALIGNMENT. */\n+\t && TREE_ADDRESSABLE (parm)\n+\t && MEM_ALIGN (stack_parm) < MAX_SUPPORTED_STACK_ALIGNMENT)))\n stack_parm = NULL;\n \n /* If parm was passed in memory, and we need to convert it on entry,\n@@ -3714,7 +3719,7 @@ assign_parms (tree fndecl)\n else\n \tset_decl_incoming_rtl (parm, data.entry_parm, false);\n \n- assign_parm_adjust_stack_rtl (&data);\n+ assign_parm_adjust_stack_rtl (parm, &data);\n \n if (assign_parm_setup_block_p (&data))\n \tassign_parm_setup_block (&all, parm, &data);\ndiff --git a/gcc/testsuite/gcc.dg/pr124671.c b/gcc/testsuite/gcc.dg/pr124671.c\nnew file mode 100644\nindex 00000000000..339757f849e\n--- /dev/null\n+++ b/gcc/testsuite/gcc.dg/pr124671.c\n@@ -0,0 +1,34 @@\n+/* { dg-do run { target automatic_stack_alignment } } */\n+/* { dg-options \"-O2\" } */\n+\n+#define ALIGNMENT\t256\n+\n+#include <stddef.h>\n+\n+typedef struct {\n+ long double a;\n+ long double b;\n+} c __attribute__((aligned(ALIGNMENT)));\n+\n+__attribute__ ((noipa))\n+void foo (c *p)\n+{\n+ if ((((ptrdiff_t) p) & (ALIGNMENT - 1)) != 0)\n+ __builtin_abort ();\n+}\n+\n+__attribute__ ((noipa))\n+void\n+bar (c f)\n+{\n+ foo (&f);\n+}\n+\n+c f;\n+\n+int\n+main()\n+{\n+ bar (f);\n+ return 0;\n+}\ndiff --git a/gcc/testsuite/gcc.target/i386/pr120839-1a.c b/gcc/testsuite/gcc.target/i386/pr120839-1a.c\nnew file mode 100644\nindex 00000000000..d99237f8497\n--- /dev/null\n+++ b/gcc/testsuite/gcc.target/i386/pr120839-1a.c\n@@ -0,0 +1,15 @@\n+/* { dg-do compile } */\n+/* { dg-options \"-O2\" } */\n+/* { dg-final { scan-assembler-not \"and\\[lq\\]?\\[\\\\t \\]*\\\\$-32,\\[\\\\t \\]*%\\[re\\]?sp\" } } */\n+\n+typedef struct\n+{\n+ long double a;\n+ long double b;\n+} c __attribute__((aligned(32)));\n+extern double d;\n+void\n+bar (c f)\n+{\n+ d = f.a;\n+}\ndiff --git a/gcc/testsuite/gcc.target/i386/pr120839-1b.c b/gcc/testsuite/gcc.target/i386/pr120839-1b.c\nnew file mode 100644\nindex 00000000000..5362eb8fc5a\n--- /dev/null\n+++ b/gcc/testsuite/gcc.target/i386/pr120839-1b.c\n@@ -0,0 +1,5 @@\n+/* { dg-do compile } */\n+/* { dg-options \"-O2 -mavx2\" } */\n+/* { dg-final { scan-assembler-not \"and\\[lq\\]?\\[\\\\t \\]*\\\\$-32,\\[\\\\t \\]*%\\[re\\]?sp\" } } */\n+\n+#include \"pr120839-1a.c\"\ndiff --git a/gcc/testsuite/gcc.target/i386/pr120839-2.c b/gcc/testsuite/gcc.target/i386/pr120839-2.c\nnew file mode 100644\nindex 00000000000..e5b711c966f\n--- /dev/null\n+++ b/gcc/testsuite/gcc.target/i386/pr120839-2.c\n@@ -0,0 +1,19 @@\n+/* { dg-do compile } */\n+/* { dg-options \"-O2\" } */\n+/* { dg-final { scan-assembler-not \"and\\[lq\\]?\\[\\\\t \\]*\\\\$-32,\\[\\\\t \\]*%\\[re\\]?sp\" } } */\n+\n+typedef struct\n+{\n+ long double a;\n+ long double b;\n+} c __attribute__((aligned(32)));\n+extern c x;\n+extern double d;\n+extern void bar (c);\n+void\n+foo (void)\n+{\n+ x.a = d;\n+ x.b = d;\n+ bar (x);\n+}\n-- \n2.53.0\n\n", "prefixes": [ "v3" ] }