From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id 93095388A438; Mon, 1 Feb 2021 15:18:20 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 93095388A438 From: "david at westcontrol dot com" To: gcc-bugs@gcc.gnu.org Subject: [Bug target/98884] Implement empty struct optimisations on ARM Date: Mon, 01 Feb 2021 15:18:20 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: target X-Bugzilla-Version: 11.0 X-Bugzilla-Keywords: missed-optimization X-Bugzilla-Severity: enhancement X-Bugzilla-Who: david at westcontrol dot com X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Resolution: X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: gcc-bugs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-bugs mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 01 Feb 2021 15:18:20 -0000 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D98884 --- Comment #5 from David Brown --- (In reply to Jakub Jelinek from comment #4) > Note, for ABI compatibility or incompatibility it might be better to check > what happens when some argument is passed after the empty structs. Becau= se > at least in some ABIs one could get away with just pretending the stack > slots (or registers) are there even when they aren't actually allocated on > the stack, but one would need to have guarantees the callee e.g. will nev= er > modify those stack slots (in most ABIs the call argument stack slot are > owned by the callee). Good point. I tried with: void needs_tags(int x, Tag1 t1, Tag2 t2, Tag3 t3, Tag4 t4, Tag5 t5, int y); and needs_tags(12345, t1, t2, t3, t4, t5, 200); gcc (trunk - gcc 11) on x86 puts 12345 in edi and 200 in esi, just as if the empty tags didn't exist. So does clang for the ARM (putting them in r0 and r1 respectively). gcc 9 for the ARM generates code as though t1 .. t5 were type "int" and val= ue 0.=