From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x32d.google.com (mail-wm1-x32d.google.com [IPv6:2a00:1450:4864:20::32d]) by sourceware.org (Postfix) with ESMTPS id BEF4D388187A for ; Thu, 27 Jun 2024 21:20:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org BEF4D388187A Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=baylibre.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org BEF4D388187A Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::32d ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1719523229; cv=none; b=tyxih+jy8inHXUqH9LkD3gJPJZwNgklOs4b99TE6Nd0XHfutvHjOMN166xcyGRtCxGUXROXLGK9sCdmxawwoQjLouxPWHZ+hpqVsJ7yOGXefjI3jUYgm+0hC9TlEMG1H5g51yBboacINAxUR5LR4fg6GeaSaJxD0ZfGOxK2y61E= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1719523229; c=relaxed/simple; bh=TqjnzptEAtHshFfKLH3cgkiABcsczd6tjgfFmoiKA6w=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=Fc2IpOf4CeWLSIYH8+LkQY1JbXsjltBUdDzftK9F9X83okps5lW35Y6WVwrjC3JxdDJRQ00uKEByWe2QuvnTjKYM7mOaRi5FlD1p9sMG+u3VhLQSTXhv/gELpsbeG6P4N2TtSeW7rCbWzC/D2WSXu9yo4veNGP1cZKJFdKJc5sg= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-wm1-x32d.google.com with SMTP id 5b1f17b1804b1-424ad991c1cso28299115e9.1 for ; Thu, 27 Jun 2024 14:20:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1719523225; x=1720128025; darn=gcc.gnu.org; h=mime-version:message-id:date:user-agent:references:in-reply-to :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=GvBz+UdZGqDAWyDK+Dhc5H4wmFxYiILPg0Ng9VPYkfo=; b=WBO9MkGbCcAAmZt3S6Mq/w1a+KetrLCqJZcibSmDcZBv+34T0Uw2USb8GFsWQyHAI5 z/Ow7t15AjPFSgN6tivwWPt63kwPdQz+XFhhG/lFvmfOkJGBlVVL5GVP4+rgYjK2juXV XY4dWlGZQLLPUbVzdRUIvoUQVpLYLy4JQV+HonT7+IniEodjtepUAdBjnsV0XqrDks9k eN08T/pnUW7rID1HjFjGmnPCPvcskSnwpWLdFsyQxPvso6QF6bPly4MM2mCyY47Af/UG TIQbl09NvKeG42tPgNJkgVPXZts5J/WgaHn65YcpzowMnZtOIoF4wU5SgoZq7H633n3P 6hjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719523225; x=1720128025; h=mime-version:message-id:date:user-agent:references:in-reply-to :subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=GvBz+UdZGqDAWyDK+Dhc5H4wmFxYiILPg0Ng9VPYkfo=; b=E9xP38ujri1SM8+GDIfjijDfboDYdKgLY+EMFhi2EHfXO9JuWA3oEidJICR1v77kL8 Cp+JC/cpCzy79txzA1HUr+yf5ZxCcNfRasngzBF6ufKDCE1c/6UQRINyLyHJdcb27pU4 5GQM53FGS+v6pHvToh4vdbWtqTTbSE55V9jfDetgvwaK2t29SZVoX1DHd9S3r8fHB2I5 8JauRbOQiG9pKHLCqM0N3ZismPJGnck3I71lgU8oJfAji1fKrOsGmULWuaMzXUZuCg5C qPChs2xRArog0t1xSLM5CPPA+6L3S05Wt/OWkbCik7pV5mtUoPPmYbgglSAfEphvcTtd CXhQ== X-Forwarded-Encrypted: i=1; AJvYcCXqLiBGnGpoJdqy/zBjA/A41O3EMC5c2mqCxeexKOSsSM+5cdUEoZ1+JEaG6mtMz24JhjSa2uI6CNepNUkpjLd5bZGdZxdbgg== X-Gm-Message-State: AOJu0YxfDDMg7qJp1CDp8YltQRyA1gIEoUPjjmjWqN9rQcM2DcSffbkp t6GvR7owxSaa7+Dbz2FyT4zi3QRENYp2pP2SIVl7N4Ci15MN6PF3jUb4/gfSDPo= X-Google-Smtp-Source: AGHT+IFMJvXpxPDLfo2skeFj+hzpkI6ZGeBRAR6PrrNXIeo3R5w0zBp2r2nEgZrXVNg1GzoPF/Ji2A== X-Received: by 2002:a05:600c:484f:b0:424:ac79:5504 with SMTP id 5b1f17b1804b1-424ac7955demr58903315e9.17.1719523225123; Thu, 27 Jun 2024 14:20:25 -0700 (PDT) Received: from euler.schwinge.ddns.net (p200300c8b733b9005e8fc6f38b6af531.dip0.t-ipconnect.de. [2003:c8:b733:b900:5e8f:c6f3:8b6a:f531]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4256b0c17f1sm7446865e9.44.2024.06.27.14.20.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Jun 2024 14:20:24 -0700 (PDT) From: Thomas Schwinge To: Richard Sandiford Cc: jlaw@ventanamicro.com, rdapp.gcc@gmail.com, gcc-patches@gcc.gnu.org, Tom de Vries , Roger Sayle Subject: Re: nvptx vs. [PATCH] Add a late-combine pass [PR106594] In-Reply-To: <87r0ci2kt2.fsf@euler.schwinge.ddns.net> References: <87r0citjoy.fsf@euler.schwinge.ddns.net> <87r0ci2kt2.fsf@euler.schwinge.ddns.net> User-Agent: Notmuch/0.30+8~g47a4bad (https://notmuchmail.org) Emacs/29.3 (x86_64-pc-linux-gnu) Date: Thu, 27 Jun 2024 23:20:18 +0200 Message-ID: <87jzia2ict.fsf@euler.schwinge.ddns.net> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Status: No, score=-5.3 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,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: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi! On 2024-06-27T22:27:21+0200, I wrote: > On 2024-06-27T18:49:17+0200, I wrote: >> On 2023-10-24T19:49:10+0100, Richard Sandiford wrote: >>> This patch adds a combine pass that runs late in the pipeline. > > [After sending, I realized I replied to a previous thread of this work.] > >> I've beek looking a bit through recent nvptx target code generation >> changes for GCC target libraries, and thought I'd also share here my >> findings for the "late-combine" changes in isolation, for nvptx target. >>=20 >> First the unexpected thing: > > So much for "unexpected thing" -- next level of unexpected here... > Appreciated if anyone feels like helping me find my way through this, but > I totally understand if you've got other things to do. OK, I found something already. (Unexpectedly quickly...) ;-) >> there are a few cases where we now see unused >> registers get declared, for example (random) in >> 'nvptx-none/newlib/libc/libm_a-s_modf.o:modf' I've now looked into the former one ('tmp-libm_a-s_modf.i.xz' is attached), to avoid... > I first looked into a simpler case: newlib 'libc/locale/lnumeric.c'. > ../../../source-gcc/newlib/libc/locale/lnumeric.c:88:10: warning: =E2= =80=98ret=E2=80=99 is used uninitialized [-Wuninitialized] > 88 | return ret; > | ^~~ > ../../../source-gcc/newlib/libc/locale/lnumeric.c:48:7: note: =E2=80= =98ret=E2=80=99 was declared here > 48 | int ret; > | ^~~ > > Uh. Given nothing else is going on in that function, I suppose '%r22' > relates to the uninitialized 'ret' -- and given undefined behavior, GCC > of course is fine to emit an unused 'reg' in that case... ... the undefined behavior here. But in fact, for both cases, the unexpected difference goes away if after 'pass_late_combine' I inject a 'pass_fast_rtl_dce'. That's normally run as part of 'PUSH_INSERT_PASSES_WITHIN (pass_postreload)' -- but that's all not active for nvptx target given '!reload_completed', given nvptx is 'targetm.no_register_allocation'. Maybe we need to enable a few more passes, or is there anything in 'pass_late_combine' to change, so that we don't run into this? Does it inadvertently mark registers live or something like that? The following makes these two cases work, but evidently needs a lot more analysis: a lot of other passes are enabled that may be anything between beneficial and harmful for 'targetm.no_register_allocation'/nvptx. --- gcc/passes.cc +++ gcc/passes.cc @@ -676,17 +676,17 @@ const pass_data pass_data_postreload =3D class pass_postreload : public rtl_opt_pass { public: pass_postreload (gcc::context *ctxt) : rtl_opt_pass (pass_data_postreload, ctxt) {} =20=20=20=20=20 /* opt_pass methods: */ - bool gate (function *) final override { return reload_completed; } + bool gate (function *) final override { return reload_completed || t= argetm.no_register_allocation; } --- gcc/regcprop.cc +++ gcc/regcprop.cc @@ -1305,17 +1305,17 @@ class pass_cprop_hardreg : public rtl_opt_pass public: pass_cprop_hardreg (gcc::context *ctxt) : rtl_opt_pass (pass_data_cprop_hardreg, ctxt) {} =20=20=20=20=20 /* opt_pass methods: */ bool gate (function *) final override { - return (optimize > 0 && (flag_cprop_registers)); + return (optimize > 0 && flag_cprop_registers && !targetm.no_regi= ster_allocation); } Gr=C3=BC=C3=9Fe Thomas > But: should we expect '-fno-late-combine-instructions' vs. > '-flate-combine-instructions' to behave in the same way? (After all, > '%r22' remains unused also with '-flate-combine-instructions', and > doesn't need to be emitted.) This could, of course, also be a nvptx back > end issue? > > I'm happy to supply any dump files etc. Also, 'tmp-libc_a-lnumeric.i.xz' > is attached if you'd like to reproduce this with your own nvptx target > 'cc1': > > $ [...]/configure --target=3Dnvptx-none --enable-languages=3Dc > $ make -j12 all-gcc > $ gcc/cc1 -fpreprocessed tmp-libc_a-lnumeric.i -quiet -dumpbase tmp-l= ibc_a-lnumeric.c -dumpbase-ext .c -misa=3Dsm_30 -g -O2 -fno-builtin -o tmp-= libc_a-lnumeric.s -fdump-rtl-all # -fno-late-combine-instructions > > > Gr=C3=BC=C3=9Fe > Thomas --=-=-= Content-Type: application/x-xz Content-Disposition: attachment; filename=tmp-libm_a-s_modf.i.xz Content-Transfer-Encoding: base64 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 --=-=-=--