From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id 174663857C44; Tue, 5 Dec 2023 18:41:31 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 174663857C44 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1701801691; bh=XLm0SBaQpwVzZh+fvHQ0bHhCm7SSoFsHP8jPjYCirHQ=; h=From:To:Subject:Date:From; b=Wrmrz1PbSSCjfPX94ZyliqwkkvqRInEVk+dqOexgTpbf1Nbg5UGBpt6UlIcOV5ds6 pHkBL3DQWNbs0JD4EDS5av/hS9C+xJpWp1nWCLG3pYIkdHpkakMPEhAsfvK1tq/+i5 r8hg5/m84oakI1rPsWwdUEZU4kHJHJq+AtMWHdvs= From: "grantrwittmann at gmail dot com" To: gcc-bugs@gcc.gnu.org Subject: [Bug c/112870] New: incorrect jmp when using goto on a function, causing infinite loop Date: Tue, 05 Dec 2023 18:41:30 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: c X-Bugzilla-Version: 13.2.0 X-Bugzilla-Keywords: X-Bugzilla-Severity: normal X-Bugzilla-Who: grantrwittmann at gmail 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: bug_id short_desc product version bug_status bug_severity priority component assigned_to reporter target_milestone Message-ID: 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 List-Id: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D112870 Bug ID: 112870 Summary: incorrect jmp when using goto on a function, causing infinite loop Product: gcc Version: 13.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: grantrwittmann at gmail dot com Target Milestone: --- When first setting a variable to a label, then jumping after that label to a function (not calling the function), GCC generates incorrect assembly causi= ng the goto statement to jump to the previous label and not the function. The code: void function() { return; } int main() { void* label_var =3D &&label; label: goto *&function; } compiles to this assembly: function: push rbp mov rbp, rsp nop pop rbp ret main: push rbp mov rbp, rsp mov QWORD PTR [rbp-8], OFFSET FLAT:.L4 .L4: nop jmp .L4 The last jmp goes back to .L4 (label) even though it should be going to function. The assembly is compiled correctly when the `label_var` declarati= on is removed. This same code compiles correctly on other compilers like clang (17.0.1): function: # @function push rbp mov rbp, rsp pop rbp ret main: # @main push rbp mov rbp, rsp mov dword ptr [rbp - 4], 0 lea rax, [rip + .Ltmp2] mov qword ptr [rbp - 16], rax .Ltmp2: # Block address taken .LBB1_1: # =3D>This Inner Loop Header: Depth= =3D1 lea rax, [rip + function] mov qword ptr [rbp - 24], rax # 8-byte Spill jmp .LBB1_2 .LBB1_2: # in Loop: Header=3DBB1_1 Depth= =3D1 mov rax, qword ptr [rbp - 24] # 8-byte Reload jmp rax All examples from this issue were compiled and ran through the godbolt.org online compiler explorer.=