From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lf1-x12e.google.com (mail-lf1-x12e.google.com [IPv6:2a00:1450:4864:20::12e]) by sourceware.org (Postfix) with ESMTPS id 646223858D35 for ; Wed, 28 Jun 2023 14:07:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 646223858D35 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=vrull.eu Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=vrull.eu Received: by mail-lf1-x12e.google.com with SMTP id 2adb3069b0e04-4fb77f21c63so4943570e87.2 for ; Wed, 28 Jun 2023 07:07:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vrull.eu; s=google; t=1687961265; x=1690553265; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=tGHo3D9++rwXdZWc7chVw1ndIKH5EQFc3LhdCYoICG0=; b=goaPzRai2PoEz7271XhSWgZ0JyBIfKlj2VmuSIwMuwff/xYkffQC4Z2rRkuZq3TtUM foO5kDDRkD392JeUrV8T2EUFP1OLULHK4Vp1PvvC2oYg7YdG60yOvYrhQTD839PM6SDx 5e/H9QmchSoQtPMJr1IZtfVGgJDhelsJKWCkAmw8GziklkpGXT/QmsW5yumq31JNVYIN c5LbdTrvC4y1Q712MRExu/9HRr0F1AuXqquecYeTjZZhdQN+x0DeVgjhsIkCGvTxLR42 Ney47oG3Eg5MaSV2zpuDgeGoDBdeAxg4Wsa3XpOfUc8m3pVhVoRjuskh+mITwfqIS03H GbrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687961265; x=1690553265; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=tGHo3D9++rwXdZWc7chVw1ndIKH5EQFc3LhdCYoICG0=; b=gcMb6+RYA8V+AwJBb1GB0t8drpO/rkk+PQUf1sZ8QOwdJ3H9GgBFwcI963iUR6j03b PYCmQX0QFwObrw+B2iHSJx0eyOAS6qVIZ8WhyoXdSuiF4S+jxiTzZzfKJTjEtvY88Zas kQd0Yw1dzfXbZOqaJ9iFcYALdGsrCd+mQwoQ0OlcqzRhUKxhmtCDH9IlqylzrGbMv1/f CzLLxkr9Fe+IWTmLV2xpZq9IxhB1RokoAmuWW49AK0znXrLPBeptkhqJHtVLEtBj8GeY bIVHqshBFn7N098iCOxvxgZ1uS4+EMwdqsRZBcgzyWzssnMxWpmRGaTymkrML7DEo7rG g85g== X-Gm-Message-State: AC+VfDwDdrYqp3trmWqtIDWd4Scwj/wzIjOpoP3sgClpv6XxZjtDMPA4 VGVOtb6/bgCwC9guKKV1IAX4VIa9R+D8vU2YL5YZoNhz X-Google-Smtp-Source: ACHHUZ43u1THrCAtX6S0fUT0FLEZlIH217mXxbeQPgEDmQTp0CcGWCVHJQLtIFBA5yLHJwIEDEti9A== X-Received: by 2002:a2e:9109:0:b0:2b6:9ba0:9648 with SMTP id m9-20020a2e9109000000b002b69ba09648mr7242566ljg.41.1687961264689; Wed, 28 Jun 2023 07:07:44 -0700 (PDT) Received: from ubuntu-focal.. ([2a01:4f9:3a:1e26::2]) by smtp.gmail.com with ESMTPSA id j23-20020a2eb3d7000000b002b4762882e4sm2241463lje.39.2023.06.28.07.07.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Jun 2023 07:07:44 -0700 (PDT) From: Philipp Tomsich To: gcc-patches@gcc.gnu.org Cc: Manolis Tsamis , Philipp Tomsich Subject: [COMMITTED, PR 110308] cprop_hardreg: fix ORIGINAL_REGNO/REG_ATTRS/REG_POINTER handling Date: Wed, 28 Jun 2023 16:07:41 +0200 Message-Id: <20230628140741.3045618-1-philipp.tomsich@vrull.eu> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-12.0 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,JMQ_SPF_NEUTRAL,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE 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: From: Manolis Tsamis Fixes: 6a2e8dcbbd4bab3 Propagation for the stack pointer in regcprop was enabled in 6a2e8dcbbd4bab3, but set ORIGINAL_REGNO/REG_ATTRS/REG_POINTER for stack_pointer_rtx which caused regression (e.g., PR 110313, PR 110308). This fix adds special handling for stack_pointer_rtx in the places where maybe_mode_change is called. This also adds an check in maybe_mode_change to return the stack pointer only when the requested mode matches the mode of stack_pointer_rtx. PR debug/110308 gcc/ChangeLog: * regcprop.cc (maybe_mode_change): Check stack_pointer_rtx mode. (maybe_copy_reg_attrs): New function. (find_oldest_value_reg): Use maybe_copy_reg_attrs. (copyprop_hardreg_forward_1): Ditto. gcc/testsuite/ChangeLog: * g++.dg/torture/pr110308.C: New test. Signed-off-by: Manolis Tsamis Signed-off-by: Philipp Tomsich --- gcc/regcprop.cc | 52 +++++++++++++++++-------- gcc/testsuite/g++.dg/torture/pr110308.C | 29 ++++++++++++++ 2 files changed, 65 insertions(+), 16 deletions(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr110308.C diff --git a/gcc/regcprop.cc b/gcc/regcprop.cc index 6cbfadb181f..d28a4d5aca8 100644 --- a/gcc/regcprop.cc +++ b/gcc/regcprop.cc @@ -423,7 +423,7 @@ maybe_mode_change (machine_mode orig_mode, machine_mode copy_mode, It's unclear if we need to do the same for other special registers. */ if (regno == STACK_POINTER_REGNUM) { - if (orig_mode == new_mode) + if (orig_mode == new_mode && new_mode == GET_MODE (stack_pointer_rtx)) return stack_pointer_rtx; else return NULL_RTX; @@ -451,6 +451,31 @@ maybe_mode_change (machine_mode orig_mode, machine_mode copy_mode, return NULL_RTX; } +/* Helper function to copy attributes when replacing OLD_REG with NEW_REG. + If the changes required for NEW_REG are invalid return NULL_RTX, otherwise + return NEW_REG. This is intended to be used with maybe_mode_change. */ + +static rtx +maybe_copy_reg_attrs (rtx new_reg, rtx old_reg) +{ + if (new_reg != stack_pointer_rtx) + { + /* NEW_REG is assumed to be a register copy resulting from + maybe_mode_change. */ + ORIGINAL_REGNO (new_reg) = ORIGINAL_REGNO (old_reg); + REG_ATTRS (new_reg) = REG_ATTRS (old_reg); + REG_POINTER (new_reg) = REG_POINTER (old_reg); + } + else if (REG_POINTER (new_reg) != REG_POINTER (old_reg)) + { + /* Only a single instance of STACK_POINTER_RTX must exist and we cannot + modify it. Allow propagation if REG_POINTER for OLD_REG matches and + don't touch ORIGINAL_REGNO and REG_ATTRS. */ + return NULL_RTX; + } + return new_reg; +} + /* Find the oldest copy of the value contained in REGNO that is in register class CL and has mode MODE. If found, return an rtx of that oldest register, otherwise return NULL. */ @@ -486,12 +511,7 @@ find_oldest_value_reg (enum reg_class cl, rtx reg, struct value_data *vd) new_rtx = maybe_mode_change (oldmode, vd->e[regno].mode, mode, i, regno); if (new_rtx) - { - ORIGINAL_REGNO (new_rtx) = ORIGINAL_REGNO (reg); - REG_ATTRS (new_rtx) = REG_ATTRS (reg); - REG_POINTER (new_rtx) = REG_POINTER (reg); - return new_rtx; - } + return maybe_copy_reg_attrs (new_rtx, reg); } return NULL_RTX; @@ -965,15 +985,15 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd) if (validate_change (insn, &SET_SRC (set), new_rtx, 0)) { - ORIGINAL_REGNO (new_rtx) = ORIGINAL_REGNO (src); - REG_ATTRS (new_rtx) = REG_ATTRS (src); - REG_POINTER (new_rtx) = REG_POINTER (src); - if (dump_file) - fprintf (dump_file, - "insn %u: replaced reg %u with %u\n", - INSN_UID (insn), regno, REGNO (new_rtx)); - changed = true; - goto did_replacement; + if (maybe_copy_reg_attrs (new_rtx, src)) + { + if (dump_file) + fprintf (dump_file, + "insn %u: replaced reg %u with %u\n", + INSN_UID (insn), regno, REGNO (new_rtx)); + changed = true; + goto did_replacement; + } } /* We need to re-extract as validate_change clobbers recog_data. */ diff --git a/gcc/testsuite/g++.dg/torture/pr110308.C b/gcc/testsuite/g++.dg/torture/pr110308.C new file mode 100644 index 00000000000..36c6d382121 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr110308.C @@ -0,0 +1,29 @@ +/* { dg-do compile } */ + +int channelCount, decodeBlock_outputLength; +struct BlockCodec { + virtual int decodeBlock(const unsigned char *, short *); +}; +struct ms_adpcm_state { + char predictorIndex; + int sample1; + ms_adpcm_state(); +}; +bool decodeBlock_ok; +void encodeBlock() { ms_adpcm_state(); } +struct MSADPCM : BlockCodec { + int decodeBlock(const unsigned char *, short *); +}; +void decodeSample(ms_adpcm_state, bool *); +int MSADPCM::decodeBlock(const unsigned char *, short *) { + ms_adpcm_state decoderState[2]; + ms_adpcm_state *state[2]; + state[0] = &decoderState[0]; + if (channelCount == 2) + state[1] = &decoderState[0]; + short m_coefficients[state[1]->predictorIndex]; + for (int i = 0; i < channelCount; i++) + ++state[i]->sample1; + decodeSample(*state[1], &decodeBlock_ok); + return decodeBlock_outputLength; +} \ No newline at end of file -- 2.34.1