From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2152) id 2511D3858D28; Sat, 29 Apr 2023 22:19:57 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2511D3858D28 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1682806797; bh=q0mp1icdVdRhbY6xVrPBXhiWAsUh+r45Mvrw4UCVsY0=; h=From:To:Subject:Date:From; b=AkzpfPmEVfFdha6PDf6/ZkAmYlLRMnsaxNU8n/mHP1EVzL7l0nKHKMEVjGhId7uYZ Be3mOeZNz79za54nEosUyyUvYwGaLCpK1UjcBeerYG/Q83H9CF3el813c+O9gjQgPc lwIrVRamK3qdXD6nZs/hdYxPsIP297nc/LHprDLo= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Hans-Peter Nilsson To: gcc-cvs@gcc.gnu.org Subject: [gcc r14-351] reload: Handle generating reloads that also clobbers flags X-Act-Checkin: gcc X-Git-Author: Hans-Peter Nilsson X-Git-Refname: refs/heads/master X-Git-Oldrev: e2b204c31ba2b77dfe4a062b194129b7c97c81ad X-Git-Newrev: 7eefdc9c77892b679d183c1154ebb567251f0964 Message-Id: <20230429221957.2511D3858D28@sourceware.org> Date: Sat, 29 Apr 2023 22:19:57 +0000 (GMT) List-Id: https://gcc.gnu.org/g:7eefdc9c77892b679d183c1154ebb567251f0964 commit r14-351-g7eefdc9c77892b679d183c1154ebb567251f0964 Author: Hans-Peter Nilsson Date: Mon Feb 13 23:10:24 2023 +0100 reload: Handle generating reloads that also clobbers flags * reload1.cc (emit_insn_if_valid_for_reload_1): Rename from emit_insn_if_valid_for_reload. (emit_insn_if_valid_for_reload): Call new helper, and if a SET fails to be recognized, also try emitting a parallel that clobbers TARGET_FLAGS_REGNUM, as applicable. Diff: --- gcc/reload1.cc | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/gcc/reload1.cc b/gcc/reload1.cc index 7dcef50437b..9ec2cb9baf4 100644 --- a/gcc/reload1.cc +++ b/gcc/reload1.cc @@ -8377,11 +8377,11 @@ emit_reload_insns (class insn_chain *chain) reg_reloaded_dead |= reg_reloaded_died; } -/* Go through the motions to emit INSN and test if it is strictly valid. - Return the emitted insn if valid, else return NULL. */ + +/* Helper for emit_insn_if_valid_for_reload. */ static rtx_insn * -emit_insn_if_valid_for_reload (rtx pat) +emit_insn_if_valid_for_reload_1 (rtx pat) { rtx_insn *last = get_last_insn (); int code; @@ -8403,6 +8403,29 @@ emit_insn_if_valid_for_reload (rtx pat) return NULL; } +/* Go through the motions to emit INSN and test if it is strictly valid. + Return the emitted insn if valid, else return NULL. */ + +static rtx_insn * +emit_insn_if_valid_for_reload (rtx pat) +{ + rtx_insn *insn = emit_insn_if_valid_for_reload_1 (pat); + + if (insn) + return insn; + + /* If the pattern is a SET, and this target has a single + flags-register, try again with a PARALLEL that clobbers that + register. */ + if (targetm.flags_regnum == INVALID_REGNUM || GET_CODE (pat) != SET) + return NULL; + + rtx flags_clobber = gen_hard_reg_clobber (CCmode, targetm.flags_regnum); + rtx parpat = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, pat, flags_clobber)); + + return emit_insn_if_valid_for_reload (parpat); +} + /* Emit code to perform a reload from IN (which may be a reload register) to OUT (which may also be a reload register). IN or OUT is from operand OPNUM with reload type TYPE.