From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lj1-x22c.google.com (mail-lj1-x22c.google.com [IPv6:2a00:1450:4864:20::22c]) by sourceware.org (Postfix) with ESMTPS id 238513858C66 for ; Thu, 22 Jun 2023 11:12:00 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 238513858C66 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-lj1-x22c.google.com with SMTP id 38308e7fff4ca-2b47a15ca10so66378541fa.1 for ; Thu, 22 Jun 2023 04:12:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vrull.eu; s=google; t=1687432318; x=1690024318; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=jDsrDzJBSK9Gxl0prtqkq+FjoGRtdsQKxmnueoGcYnQ=; b=OM0lqI40BOSnZbSPmvmfItl3f7TV5kR+eym3r5ZQ5rKY0O2OpBK9BoMEF5yNISUk8G zgFSpu9sZLAcrDw78Tk+9X6+KHX4r+DGSspeNYUNWUh1Cmvm7MG/9jdix9tDy86yaGu0 W1+3jPDPemd815pGAKfhZWBsn80tHn7Uzw8A+y1iE26trUDgzsA18MVipFAVTu6a9Osw XQGtPXFywvDBZ7w8QgRPSZwWqSb31kRx9fDkf+f4z/sr51zXa6YNte++WLGLOuJRU0fA H6MVWQ/27yg00XNlfhMSvQT30Ywd/DwlhjUDK3HQtGM2s8QBNAVtfp+FZ2fm1ko0CaRI i+QA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687432318; x=1690024318; 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=jDsrDzJBSK9Gxl0prtqkq+FjoGRtdsQKxmnueoGcYnQ=; b=ZdZ6eQbM/DW+WpTJUum2nhYYTcPujNVJj/9hygsq5PsaqyIrEbNgFtgvRTgPa9oXup ufAGZ/8RmkRdtD6kNy607MCVl+ac+eYHlbSBafCdXBQP2Up5ne66lxVupkjTKWrdGD7y syQnTHraAY3OZx6DGapu7zW5LtM+Po4ZcC2q5HxIMlglRej36Vn+Sm82ZQX1InaGvT3/ 44OnGeh+oCv0ICCubpWyDwahpGzDgGbsr5tOgLlLcqrlvm0qyfoEt4xI5FPPKMrhznTp ePf9d88Yz0MLMr4lE7Sm+p0pvLMxP8kFC9Z74DB5sU+xxj9/9tiUyqVHHqO0BuNdeXfs NfDg== X-Gm-Message-State: AC+VfDygwRpz2DJ1a7Fu3vIgS9YQ13PRiR8B4i08162gJDN3GYjYfRAk N0/1OumeAZWyLv/v+Q3HPKZWgHSDzF6kNJvbdwXrrw== X-Google-Smtp-Source: ACHHUZ4Kd7ldueHYDIcQ4EpJ6kNdf5babeF8PzDDnRUglFOiWscspclzOIJii8fh1FJ45uyI1VUsbA== X-Received: by 2002:a2e:948b:0:b0:2a7:adf7:1781 with SMTP id c11-20020a2e948b000000b002a7adf71781mr12181090ljh.2.1687432317930; Thu, 22 Jun 2023 04:11:57 -0700 (PDT) Received: from ubuntu-focal.. ([2a01:4f9:3a:1e26::2]) by smtp.gmail.com with ESMTPSA id d6-20020a2e3606000000b002b48241805asm1272443lja.24.2023.06.22.04.11.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 Jun 2023 04:11:57 -0700 (PDT) From: Philipp Tomsich To: gcc-patches@gcc.gnu.org Cc: Thiago Jung Bauermann , Tamar Christina , Jakub Jelinek , Richard Biener , Sergei Trofimovich , Andrew Pinski , Tobian Burnus , Jeff Law , Kito Cheng , Manolis Tsamis , Philipp Tomsich Subject: [PATCH] cprop_hardreg: fix ORIGINAL_REGNO/REG_ATTRS/REG_POINTER handling Date: Thu, 22 Jun 2023 13:11:54 +0200 Message-Id: <20230622111154.2837175-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=unavailable 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 110308 gcc/ChangeLog: * regcprop.cc (maybe_mode_change): Check stack_pointer_rtx mode. (find_oldest_value_reg): Special handling of stack_pointer_rtx. (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 --- This addresses both the PRs (110308 and 110313) and was confirmed to resolve the AArch64 bootstrap issue reported by Thiago. OK for trunk? gcc/regcprop.cc | 43 +++++++++++++++++-------- gcc/testsuite/g++.dg/torture/pr110308.C | 30 +++++++++++++++++ 2 files changed, 60 insertions(+), 13 deletions(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr110308.C diff --git a/gcc/regcprop.cc b/gcc/regcprop.cc index 6cbfadb181f..fe75b7f1fa0 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; @@ -487,9 +487,14 @@ 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); + if (new_rtx != stack_pointer_rtx) + { + ORIGINAL_REGNO (new_rtx) = ORIGINAL_REGNO (reg); + REG_ATTRS (new_rtx) = REG_ATTRS (reg); + REG_POINTER (new_rtx) = REG_POINTER (reg); + } + else if (REG_POINTER (new_rtx) != REG_POINTER (reg)) + return NULL_RTX; return new_rtx; } } @@ -965,15 +970,27 @@ 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; + bool can_change; + if (new_rtx != stack_pointer_rtx) + { + ORIGINAL_REGNO (new_rtx) = ORIGINAL_REGNO (src); + REG_ATTRS (new_rtx) = REG_ATTRS (src); + REG_POINTER (new_rtx) = REG_POINTER (src); + can_change = true; + } + else + can_change + = (REG_POINTER (new_rtx) == REG_POINTER (src)); + + if (can_change) + { + 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..ddd30d4fc3f --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr110308.C @@ -0,0 +1,30 @@ +/* { dg-do compile } */ +/* { dg-options "-g2 -O2" } */ + +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