From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 985693858D37 for ; Mon, 9 Jan 2023 10:32:45 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 985693858D37 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1673260365; h=from:from:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type; bh=HCbgYssWx8F8snpYObr13jLS2jq+0bKNdOemZPMG9PQ=; b=DaTCjVLhJdPUi395kvOHYEpp/YMIq2yNnTg9Hq2MQQU3b1gvZDBnZ/OfA+3Ww+Zs5GKXAY M8XWNR7a4Dnz/wRpPRcqP7hnT0mhP9lkyoT5dJyWMeaNULCsuvseReNv4foHZDpiDhlN54 0sHj8HhS4FxM38WKo7mEBePgKQcQ19c= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-94-uM3HF_0GP-KaIBsaD6Bh_w-1; Mon, 09 Jan 2023 05:32:44 -0500 X-MC-Unique: uM3HF_0GP-KaIBsaD6Bh_w-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id CA0043814584; Mon, 9 Jan 2023 10:32:43 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.39.192.223]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 856C02026D4B; Mon, 9 Jan 2023 10:32:43 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.17.1/8.17.1) with ESMTPS id 309AWZNj2666219 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 9 Jan 2023 11:32:40 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.17.1/8.17.1/Submit) id 309AWXA22666218; Mon, 9 Jan 2023 11:32:33 +0100 Date: Mon, 9 Jan 2023 11:32:33 +0100 From: Jakub Jelinek To: "Joseph S. Myers" , Richard Biener , Jeff Law Cc: gcc-patches@gcc.gnu.org Subject: [PATCH] calls: Fix up TYPE_NO_NAMED_ARGS_STDARG_P handling [PR107453] Message-ID: Reply-To: Jakub Jelinek MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.4 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-3.9 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Hi! On powerpc64le-linux, the following patch fixes -FAIL: gcc.dg/c2x-stdarg-4.c execution test -FAIL: gcc.dg/torture/c2x-stdarg-split-1a.c -O0 execution test -FAIL: gcc.dg/torture/c2x-stdarg-split-1a.c -O1 execution test -FAIL: gcc.dg/torture/c2x-stdarg-split-1a.c -O2 execution test -FAIL: gcc.dg/torture/c2x-stdarg-split-1a.c -O2 -flto -fno-use-linker-plugin -flto-partition=none execution test -FAIL: gcc.dg/torture/c2x-stdarg-split-1a.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects execution test -FAIL: gcc.dg/torture/c2x-stdarg-split-1a.c -O3 -g execution test -FAIL: gcc.dg/torture/c2x-stdarg-split-1a.c -Os execution test The problem is mismatch between the caller and callee side. On the callee side, we do: /* NAMED_ARG is a misnomer. We really mean 'non-variadic'. */ if (!cfun->stdarg) data->arg.named = 1; /* No variadic parms. */ else if (DECL_CHAIN (parm)) data->arg.named = 1; /* Not the last non-variadic parm. */ else if (targetm.calls.strict_argument_naming (all->args_so_far)) data->arg.named = 1; /* Only variadic ones are unnamed. */ else data->arg.named = 0; /* Treat as variadic. */ which is later passed to the target hooks to determine if a particular argument is named or not. Now, cfun->stdarg is determined from the stdarg_p call, which for the new C2X TYPE_NO_NAMED_ARGS_STDARG_P function types (rettype fn (...)) returns true. Such functions have no named arguments, so data->arg.named will be 0 in function.cc. But on the caller side, as TYPE_NO_NAMED_ARGS_STDARG_P function types have TYPE_ARG_TYPES NULL, we instead treat those calls as unprototyped even when they are prototyped - /* If we know nothing, treat all args as named. */ n_named_args = num_actuals; in 2 spots. We need to treat the TYPE_NO_NAMED_ARGS_STDARG_P cases as prototyped with no named arguments. Bootstrapped/regtested on x86_64-linux, i686-linux, powerpc64le-linux (where it fixes the above failures), aarch64-linux and s390x-linux, ok for trunk? 2023-01-09 Jakub Jelinek PR target/107453 * calls.cc (expand_call): For calls with TYPE_NO_NAMED_ARGS_STDARG_P (funtype) use zero for n_named_args. Formatting fix. --- gcc/calls.cc.jj 2023-01-02 09:32:28.834192105 +0100 +++ gcc/calls.cc 2023-01-06 14:52:14.740594896 +0100 @@ -2908,8 +2908,8 @@ expand_call (tree exp, rtx target, int i } /* Count the arguments and set NUM_ACTUALS. */ - num_actuals = - call_expr_nargs (exp) + num_complex_actuals + structure_value_addr_parm; + num_actuals + = call_expr_nargs (exp) + num_complex_actuals + structure_value_addr_parm; /* Compute number of named args. First, do a raw count of the args for INIT_CUMULATIVE_ARGS. */ @@ -2919,6 +2919,8 @@ expand_call (tree exp, rtx target, int i = (list_length (type_arg_types) /* Count the struct value address, if it is passed as a parm. */ + structure_value_addr_parm); + else if (TYPE_NO_NAMED_ARGS_STDARG_P (funtype)) + n_named_args = 0; else /* If we know nothing, treat all args as named. */ n_named_args = num_actuals; @@ -2957,6 +2959,8 @@ expand_call (tree exp, rtx target, int i && ! targetm.calls.pretend_outgoing_varargs_named (args_so_far)) /* Don't include the last named arg. */ --n_named_args; + else if (TYPE_NO_NAMED_ARGS_STDARG_P (funtype)) + n_named_args = 0; else /* Treat all args as named. */ n_named_args = num_actuals; Jakub