From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-x436.google.com (mail-wr1-x436.google.com [IPv6:2a00:1450:4864:20::436]) by sourceware.org (Postfix) with ESMTPS id 4A6B03832E78 for ; Thu, 27 Jun 2024 20:27:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4A6B03832E78 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 4A6B03832E78 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::436 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1719520050; cv=none; b=Vd6V+MOETyG98XJgFig2qZNZAzbz6OM9xz6b3y4CbUDMml7BC++4o3WGf8p2NdP9GbKI1S7l+dUDLPZvCVB2NDi0vVeoVESB4gs2NkRx2bD/IU+O1ODHRRS8d1PspJyzJjatMKxfegbBNdZia9gmFfaDXTcRE9z3Z54TeRTt3hU= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1719520050; c=relaxed/simple; bh=XLeisAJ/n1A3mrAE7pYPf99W/QkzHG48msYeFKNAYsI=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=J3IhXMMnevLgZ6SSwfleallquh8WbgFtXzgmU4f7c9pGEJk6F55wrPABdp3oYO7HtJUM33hUZtm+9DqgAI4KvMgDLTlt35mFHxDKwZ+PmVxFbfWQm2tGi8vE7RqFcfzuUVeRcWefrcCe8AHJX8v0eFVeNSDtT8JTToaJ+26QIB4= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-wr1-x436.google.com with SMTP id ffacd0b85a97d-366edce6493so3482656f8f.3 for ; Thu, 27 Jun 2024 13:27:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1719520046; x=1720124846; 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=KweEf4n3qPx/BSVnDXlrh4LiUda/F0FEKfBbJ1Hqey8=; b=hnrxaRFBGWecidkIi3m2EAZ00DEXspvGptp22NTtslx/InMU8zJ/Bzp84VxyS5gm0W quEn7av3eYvCu5doJIMCHLCo2wWFJD+VLJRS7ZuGNsVMde/xZn2ngs0/5P2FLBteNjlu 0tqbOOHbJHDo9Ze9ytDck0oPFGrxb32Uddt7/FlabhrJMGEkeA2WQDigfCKBw8hA/vwP L69/gyi7yJOjCYsKZz3NQTD2HMG/2opXj7aGnlTzUzGO7m1xLbQE92B2a1RYgJwuFLZ2 235r18aopUj6ohGq5RaKl/5EtAZDfQWWfwdEIF+tzT+/LehbDSNR2VD9Ro3Q6OYX0L9X jLww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719520046; x=1720124846; 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=KweEf4n3qPx/BSVnDXlrh4LiUda/F0FEKfBbJ1Hqey8=; b=SxE8oa7ZMU5hcSaoEVx5V+jVLnj04v30j7VL0qV1Rb2vLSQ7mB2HiJiR4ri3fgHWAK 67OigJN3F/KtV8UCuI92a9YdSE1ZnrxSc5e/LwAeLbBg5Q2dKCSKXa0HBBsw7fKV6bn1 VOS84XBlzmmnnnZng70zYpmMzTTNgEBFFnTpLVp8dgGBj9FYZ7+l06LfkQvNBlCbskzQ nBZ4G+LNlOw9cC2rc5kFI9TY2hOJ2bbNH5q/KMp6y2JB60VnxzLH6yc++4/CrQvVvdpy Ph9epXGbb9tKPtPI14uZehiLZpM6RP7AHuMq9vl2fZhIeG/4fhrkL6pQrWT0rBiOTNOG /dhA== X-Forwarded-Encrypted: i=1; AJvYcCVtTDa6I4xhrLWCEnAyQAHGzEm75d2xo6tPSneJV/GYxGTgintGkue4pRLpdV7WROANYRPCtD+vTW1rMdDgtWWi6hURIlFTvA== X-Gm-Message-State: AOJu0Yw5LmJhGL4zl/wSZ2QiL6cHymPxpD5z9qKlxR3xgy0COU+zkkea Dl0+/HQYW50d1J4ZLchDvfyLSAUaTZUFAnxuBmNq2V/41rxgvp7+4NIuN9S6tzw= X-Google-Smtp-Source: AGHT+IFxHyzm066A2sRFtOV/Gp4b3b1Q/9glVOJi52x7VHcO02gbQIPhVGgL4qXykWV1RRzev2PR5w== X-Received: by 2002:a5d:4a0f:0:b0:360:8e71:627f with SMTP id ffacd0b85a97d-366e962fb68mr9045354f8f.59.1719520045662; Thu, 27 Jun 2024 13:27: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 ffacd0b85a97d-3675a0d9376sm242202f8f.37.2024.06.27.13.27.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Jun 2024 13:27:25 -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: <87r0citjoy.fsf@euler.schwinge.ddns.net> References: <87r0citjoy.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 22:27:21 +0200 Message-ID: <87r0ci2kt2.fsf@euler.schwinge.ddns.net> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Status: No, score=-5.5 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-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. > 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 first looked into a simpler case: newlib 'libc/locale/lnumeric.c'. Here we get the following 'diff' for '*.s' for '-fno-late-combine-instructions' vs. (default) '-flate-combine-instructions': .visible .func (.param.u32 %value_out) __numeric_load_locale (.param.u= 64 %in_ar0, .param.u64 %in_ar1, .param.u64 %in_ar2, .param.u64 %in_ar3) { .reg.u32 %value; .reg.u64 %ar0; ld.param.u64 %ar0, [%in_ar0]; .reg.u64 %ar1; ld.param.u64 %ar1, [%in_ar1]; .reg.u64 %ar2; ld.param.u64 %ar2, [%in_ar2]; .reg.u64 %ar3; ld.param.u64 %ar3, [%in_ar3]; + .reg.u32 %r22; .file 2 "../../../source-gcc/newlib/libc/locale/lnumeric.c" .loc 2 89 1 mov.u32 %value, 0; st.param.u32 [%value_out], %value; ret; } Clearly, '%r22' is unused. However, looking at the source code (manually trimmed): int __numeric_load_locale (struct __locale_t *locale, const char *name , void *f_wctomb, const char *charset) { int ret; struct lc_numeric_T nm; char *bufp =3D NULL; =20=20=20=20 #ifdef __CYGWIN__ [...] #else /* TODO */ #endif return ret; } ..., and adding '-Wall' (why isn't top-level/newlib build system doing that...): [...] ../../../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=98= ret=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... 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-lib= c_a-lnumeric.c -dumpbase-ext .c -misa=3Dsm_30 -g -O2 -fno-builtin -o tmp-li= bc_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-libc_a-lnumeric.i.xz Content-Transfer-Encoding: base64 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 --=-=-=--