From patchwork Wed Jul 8 07:01:22 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Biener X-Patchwork-Id: 138712 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 28E994BA2E11 for ; Wed, 8 Jul 2026 07:02:02 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 28E994BA2E11 Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=LVTnY20C; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=ohA0N52W; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=LVTnY20C; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=ohA0N52W X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.223.130]) by sourceware.org (Postfix) with ESMTPS id 0C1EF4BA543C for ; Wed, 8 Jul 2026 07:01:24 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0C1EF4BA543C Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 0C1EF4BA543C Authentication-Results: sourceware.org; arc=none smtp.remote-ip=195.135.223.130 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1783494084; cv=none; b=vgZNqFCf/XVAQ1hBQ3HVc639lq3xSVJGerV1X/FAODxvlEYeCU5TIm/YWfqu5bqv9ZYjHfUcKW2p2aKthL4Nb7KqHdl7Vag19TUIWr4H/3UZZeybkk22iSUtqyqnrec7RJ8I7D6L8tRqKEDZWfHVVqWgz6SyxX1gDZa8IoI6YaM= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1783494084; c=relaxed/simple; bh=bjOSM50y4v55WDsswKCbF4BsVHKgKnd9izNzaZbC3WA=; h=DKIM-Signature:DKIM-Signature:DKIM-Signature:DKIM-Signature:Date: From:To:Subject:Message-ID:MIME-Version; b=Tbr4XM4WtaGKVgSf1a818vZHQzGG26eJx69iI+KI9yWxd2X9OEHK4dDbw+DULs2Y+FVRMllKLLQQpvI5EnozO10qWSCUFIh/R+lhKSk32s5+5pd/TMLQSw90miNUh1zQusaPlRg0mOG6lg0aOb55OEFDfMz+fi01V/zbAtIWPKA= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=LVTnY20C; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=ohA0N52W; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=LVTnY20C; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=ohA0N52W DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0C1EF4BA543C Received: from murzim.nue2.suse.org (unknown [10.168.4.243]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 01B1C74738 for ; Wed, 8 Jul 2026 07:01:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1783494083; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type; bh=m2i+NiPeG11pSRY3+IMia8BSDTGm35l/dzjXaVxhYMc=; b=LVTnY20CLDNbcl/z1y0jJiP24TPtiHdOloDkrDtp/EBUpxKgYVqjJdIQ7Wbu1qKw7MqD8C 4f+KHh0wD10lVCwjTY+zhJ+K1OfzV8gWSEuUlIeLUyySy+6dPz/Ts+4LGAElawY39Xt/Yd IzLdhEonP/RibUD5mCMvWAYxe79YKT8= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1783494083; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type; bh=m2i+NiPeG11pSRY3+IMia8BSDTGm35l/dzjXaVxhYMc=; b=ohA0N52WdpZ09CcEonqRcl1f1QaredkxXLrwUhhQewzEjtlki3yV5SXYNQWc56t9zXmHiH dbxkZJ+foAHRCuDA== Authentication-Results: smtp-out1.suse.de; none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1783494083; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type; bh=m2i+NiPeG11pSRY3+IMia8BSDTGm35l/dzjXaVxhYMc=; b=LVTnY20CLDNbcl/z1y0jJiP24TPtiHdOloDkrDtp/EBUpxKgYVqjJdIQ7Wbu1qKw7MqD8C 4f+KHh0wD10lVCwjTY+zhJ+K1OfzV8gWSEuUlIeLUyySy+6dPz/Ts+4LGAElawY39Xt/Yd IzLdhEonP/RibUD5mCMvWAYxe79YKT8= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1783494083; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type; bh=m2i+NiPeG11pSRY3+IMia8BSDTGm35l/dzjXaVxhYMc=; b=ohA0N52WdpZ09CcEonqRcl1f1QaredkxXLrwUhhQewzEjtlki3yV5SXYNQWc56t9zXmHiH dbxkZJ+foAHRCuDA== Date: Wed, 8 Jul 2026 09:01:22 +0200 (CEST) From: Richard Biener To: gcc-patches@gcc.gnu.org Subject: [PATCH] Improve variadic function call handling in PTA Message-ID: MIME-Version: 1.0 X-Spam-Score: -4.30 X-Spamd-Result: default: False [-4.30 / 50.00]; BAYES_HAM(-3.00)[100.00%]; NEURAL_HAM_LONG(-1.00)[-1.000]; NEURAL_HAM_SHORT(-0.20)[-1.000]; MIME_GOOD(-0.10)[text/plain]; TO_MATCH_ENVRCPT_ALL(0.00)[]; ARC_NA(0.00)[]; DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; FUZZY_RATELIMITED(0.00)[rspamd.com]; FROM_HAS_DN(0.00)[]; MISSING_XM_UA(0.00)[]; FROM_EQ_ENVFROM(0.00)[]; RCPT_COUNT_ONE(0.00)[1]; TO_DN_NONE(0.00)[]; RCVD_COUNT_ZERO(0.00)[0]; MIME_TRACE(0.00)[0:+] X-Spam-Level: X-Spam-Status: No, score=-11.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_PASS, TXREP shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces~patchwork=sourceware.org@gcc.gnu.org The following fixes handling of __builtin_va_start handling and implements .VA_ARG handling in PTA constraint generation to improve precision around variadic calls. I've added a testcase for IPA PTA involving an indirect variadic call verifying precision. The pr99679-1.C no longer emits an expected error that was triggered by PTA calling aggregate_value_p on the .VA_ARG call which we no longer do. Bootstrapped and tested on x86_64-unknown-linux-gnu, LTO bootstrapped with IPA PTA enabled and no testsuite differences when testing with IPA PTA enabled. Pushed. * gimple-ssa-pta-constraints.cc (find_func_aliases_for_builtin_call): Correctly use SCALAR rhs from the variadic argument part of the function info or from NONLOCAL in case of intra-PTA. (find_func_aliases_for_call): Handle .VA_ARG. * gcc.dg/ipa/ipa-pta-20.c: New testcase. * g++.dg/target/pr99679-1.C: Remove expected error. * g++.dg/target/pr99679-2.C: Likewise. --- gcc/gimple-ssa-pta-constraints.cc | 19 +++++++++++-- gcc/testsuite/g++.target/i386/pr99679-1.C | 2 +- gcc/testsuite/g++.target/i386/pr99679-2.C | 2 +- gcc/testsuite/gcc.dg/ipa/ipa-pta-20.c | 33 +++++++++++++++++++++++ 4 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/ipa/ipa-pta-20.c diff --git a/gcc/gimple-ssa-pta-constraints.cc b/gcc/gimple-ssa-pta-constraints.cc index dec3b2f6f14..a377b891d80 100644 --- a/gcc/gimple-ssa-pta-constraints.cc +++ b/gcc/gimple-ssa-pta-constraints.cc @@ -2010,12 +2010,12 @@ find_func_aliases_for_builtin_call (struct function *fn, gcall *t) { fi = lookup_vi_for_tree (fn->decl); rhs = get_function_part_constraint (fi, ~0); - rhs.type = ADDRESSOF; + rhs.type = SCALAR; } else { rhs.var = nonlocal_id; - rhs.type = ADDRESSOF; + rhs.type = SCALAR; rhs.offset = 0; } FOR_EACH_VEC_ELT (lhsc, i, lhsp) @@ -2108,6 +2108,21 @@ find_func_aliases_for_call (struct function *fn, gcall *t) && find_func_aliases_for_builtin_call (fn, t)) return; + if (gimple_call_internal_p (t, IFN_VA_ARG) + && gimple_call_lhs (t)) + { + tree valist = gimple_call_arg (t, 0); + auto_vec rhsc, lhsc; + get_constraint_for_rhs (valist, &rhsc); + do_deref (&rhsc); + get_constraint_for (gimple_call_lhs (t), &lhsc); + process_all_all_constraints (lhsc, rhsc); + /* va_list is used and clobbered. */ + make_constraint_to (get_call_use_vi (t)->id, valist); + make_constraint_to (get_call_clobber_vi (t)->id, valist); + return; + } + if (gimple_call_internal_p (t, IFN_DEFERRED_INIT)) return; diff --git a/gcc/testsuite/g++.target/i386/pr99679-1.C b/gcc/testsuite/g++.target/i386/pr99679-1.C index 36640a4e0a1..d3cd45b5d55 100644 --- a/gcc/testsuite/g++.target/i386/pr99679-1.C +++ b/gcc/testsuite/g++.target/i386/pr99679-1.C @@ -14,4 +14,4 @@ foo (int x, ...) ld = va_arg (ap, long double); if (ld) abort (); -} // { dg-error "x87 register return with x87 disabled" "" { target { ! ia32 } } } +} diff --git a/gcc/testsuite/g++.target/i386/pr99679-2.C b/gcc/testsuite/g++.target/i386/pr99679-2.C index cbd3c4958db..2773b29470a 100644 --- a/gcc/testsuite/g++.target/i386/pr99679-2.C +++ b/gcc/testsuite/g++.target/i386/pr99679-2.C @@ -14,4 +14,4 @@ foo (int x, ...) ld = va_arg (ap, double); // { dg-error "SSE register argument with SSE disabled" "" { target { ! ia32 } } } if (ld) abort (); -} // { dg-error "SSE register return with SSE disabled" "" { target { ! ia32 } } } +} diff --git a/gcc/testsuite/gcc.dg/ipa/ipa-pta-20.c b/gcc/testsuite/gcc.dg/ipa/ipa-pta-20.c new file mode 100644 index 00000000000..694a7c3b53a --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/ipa-pta-20.c @@ -0,0 +1,33 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fipa-pta -fdump-ipa-pta2-details" } */ + +#include + +static int __attribute__((noinline, noclone)) q (int n, ...) +{ + va_list va; + va_start (va, n); + int *a = va_arg (va, int *); + int *b = va_arg (va, int *); + va_end (va); + return *a + *b; +} + +static int __attribute__((noinline, noclone)) foo (int (*p)(int, ...)) +{ + int i = 1, j = 3; + return p(2, &i, &j); +} + +int main() +{ + if (foo (q) != 4) + __builtin_abort (); + return 0; +} + +/* Verify we properly handle variadic arguments for indirect calls and + .VA_ARG properly accesses only the variadic part. */ + +/* { dg-final { scan-ipa-dump "a_\[0-9\]\+ = { i j }" "pta2" } } */ +/* { dg-final { scan-ipa-dump "b_\[0-9\]\+ = { i j }" "pta2" } } */