From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id E751D385BF81; Thu, 9 Apr 2020 21:04:59 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E751D385BF81 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1586466299; bh=3TxT/XtpLjniuez2Rtv0JJYd9N/8yhLc0Lgm2jR503s=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Ha9ApTY4uQsRNNpv+InyVHCWmfRgeOV9dHu8JA0UKx0YyO9TSzmxfMIjaMqf67x4P jI0oEgRa19uKwVlZaHMwur3tDu7/sUcxSU3HKfoQiJmoDnsko9VCJwlIKePdA82S1o Mf2SbYoQcSCPtNz+rMekBPiarpJ8yeS38grP3GR8= From: "hjl.tools at gmail dot com" To: gcc-bugs@gcc.gnu.org Subject: [Bug middle-end/94541] [8/9/10 Regression] -mx32 gcc produces wrong code passing structs by value Date: Thu, 09 Apr 2020 21:04:59 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: middle-end X-Bugzilla-Version: 10.0 X-Bugzilla-Keywords: wrong-code X-Bugzilla-Severity: normal X-Bugzilla-Who: hjl.tools at gmail dot com X-Bugzilla-Status: NEW 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: Thu, 09 Apr 2020 21:05:00 -0000 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D94541 --- Comment #9 from H.J. Lu --- I am testing this: diff --git a/gcc/lra-spills.c b/gcc/lra-spills.c index 0caa4acd3b5..bd4ee80245d 100644 --- a/gcc/lra-spills.c +++ b/gcc/lra-spills.c @@ -844,9 +844,14 @@ lra_final_code_change (void) struct lra_static_insn_data *static_id =3D id->insn_static_data; bool insn_change_p =3D false; + set =3D single_set (insn); + /* NB: Never change SUBREG in the source operand of a SET + insn to REG. */ for (i =3D id->insn_static_data->n_operands - 1; i >=3D 0; i--) if ((DEBUG_INSN_P (insn) || ! static_id->operand[i].is_operator) + && (set =3D=3D NULL + || !rtx_equal_p (SET_SRC (set), *id->operand_loc[i])) && alter_subregs (id->operand_loc[i], ! DEBUG_INSN_P (insn)= )) { lra_update_dup (id, i); @@ -855,7 +860,7 @@ lra_final_code_change (void) if (insn_change_p) lra_update_operator_dups (id); - if ((set =3D single_set (insn)) !=3D NULL + if (set !=3D NULL && REG_P (SET_SRC (set)) && REG_P (SET_DEST (set)) && REGNO (SET_SRC (set)) =3D=3D REGNO (SET_DEST (set))) {=