From patchwork Wed Jan 17 17:03:11 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikael Pettersson X-Patchwork-Id: 84284 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id BEA453858C31 for ; Wed, 17 Jan 2024 17:26:42 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-lf1-x132.google.com (mail-lf1-x132.google.com [IPv6:2a00:1450:4864:20::132]) by sourceware.org (Postfix) with ESMTPS id DC08C3858415 for ; Wed, 17 Jan 2024 17:25:48 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org DC08C3858415 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org DC08C3858415 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::132 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1705512351; cv=none; b=cBX9D6T/WsDb04ZmdOLjYWtyKGRnsuBJTVrPrA0Aiax83/bvhNcjzQAYaU7yuU62+XaMm6hQJB27PHQkNL5cD+qAAk67ihP7/LilzrbQeh0g5gwuS22FZRIitwlGI1gRdDNNyh21FzEqU3rObJ3SYgH/ohNRq9rOq48+Whoz8AA= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1705512351; c=relaxed/simple; bh=q8ZjnhMECMEBzDuCQTDxKBmR2IPbY9dU5rPLLGJkT2s=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=trb+MzaOVOyKLOxFQ++xm8VP79gdc9zvvX9qVn4qfesN55kZydvkbGfLNizCuk2sLwVlMQCNdnCdCkPRoGFb9Jh1gMr+gnXS+gPw4fFZKng69jvsmjXzECf2GgwnKdvc/rtc/13TN/c0EcVjXwg9lUDInvChU4SSou2KMphBcek= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-lf1-x132.google.com with SMTP id 2adb3069b0e04-50ea98440a7so12115142e87.1 for ; Wed, 17 Jan 2024 09:25:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1705512347; x=1706117147; darn=gcc.gnu.org; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:from:to:cc:subject:date:message-id:reply-to; bh=BqhUiKS4bWHlcr4/uq8h0XWPp7y6W+LrsjYxpu2+jWk=; b=WtxSUVxSOY/H8T9FjXKzGJk2oZ/fqwNae+wb5R+y5BulYHmYrohdmBqB+gRhTr6R9H j+Q4rRWy3D1xIWIRjqWdXSAnJxXQ2DXo3erSLILA5QTk9ktlUFuRx054aIKy9BeqUerP tY0Ip1cu0LlnNqpNg9NazE3Ddlzywt0X1Bh9+jjHUFI+pO8U/xd4TAXp9dZCo2+99eLO VFoWleWkthYKZuR1c26UrRYcp9nrwN2Aegzt7X127By4QMZiR7d6Lb1FTD9qWpLBza14 qvguxOCZg9XxvQHwV2CxRLD/prnWk8b0XmLVrG2BkkRriRiNzUVybNxMK03+N25y1HVj jCjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705512347; x=1706117147; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=BqhUiKS4bWHlcr4/uq8h0XWPp7y6W+LrsjYxpu2+jWk=; b=kQmlBI95ARCTU2P2jDMfcXPpkMht7VeHQt9f46y0S7003vJoSpFVvlIgSYoIOZ1ETj 7YwxrNpFh738iH4UrYUL4+XG0/5Fr9Q3J6qIqxNwmOXpJ4420R5gjeciRpUfrXeiX5B6 UulN8QQztGCiZHgtfN5SlsqcUTDOiUoDxAI+pQIYdwbJXgrq/56PwLmrc90aq4xSJUQx tgxwT3PUuiBHtN0eTxWE73DQRj8z4LWU1/zidBJb6fz7wetu0/1zn9j2h/L3WsTaKI+x YOgsYk1kRfGSCfcU2Vai32CHavMJwn1tXmLTrffv7u8M2OIe1jcK4oasakA2fO2bC0L2 Amdw== X-Gm-Message-State: AOJu0Yxxak0Oero+TFPNUV5UfyLwdSjzpZo8qIYCPRtpu0cXeiFM2y5x xV77Oz4BNsmeniQBUVwzUZiWAK10hj/veA== X-Google-Smtp-Source: AGHT+IFGgoINwxfPbJYpB3sxV0o1VE70sBNXJfh5lpLmurBvECV2ZPCU9BU/QtTj8kj94HJFCVSKIA== X-Received: by 2002:a05:6512:3a8c:b0:50e:75ec:26ed with SMTP id q12-20020a0565123a8c00b0050e75ec26edmr3431155lfu.47.1705512346569; Wed, 17 Jan 2024 09:25:46 -0800 (PST) Received: from hallertau.. (ip006.net-192-176-117.koping.net. [192.176.117.6]) by smtp.gmail.com with ESMTPSA id g22-20020a056512119600b0050e7a97ae32sm308559lfr.78.2024.01.17.09.25.45 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Jan 2024 09:25:45 -0800 (PST) From: Mikael Pettersson To: gcc-patches@gcc.gnu.org Subject: [PATCH] Avoid ICE on m68k -fzero-call-used-regs -fpic [PR110934] Date: Wed, 17 Jan 2024 18:03:11 +0100 Message-ID: <20240117172527.27233-1-mikpelinux@gmail.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 X-Spam-Status: No, score=-11.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, 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 X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org PR110934 is a problem on m68k where -fzero-call-used-regs -fpic ICEs when clearing an FP register. The generic code generates an XFmode move of zero to that register, which becomes an XFmode load from initialized data, which due to -fpic uses a non-constant address, which the backend rejects. The zero-call-used-regs pass runs very late, after register allocation and frame layout, and at that point we can't allow new uses of the PIC register or new pseudos. To clear an FP register on m68k it's enough to do the move in SFmode, but the generic code can't be told to do that, so this patch updates m68k to use its own TARGET_ZERO_CALL_USED_REGS. Bootstrapped and regression tested on m68k-linux-gnu. Ok for master? (I don't have commit rights.) gcc/ PR target/110934 * config/m68k/m68k.cc (m68k_zero_call_used_regs): New function. (TARGET_ZERO_CALL_USED_REGS): Define. gcc/testsuite/ PR target/110934 * gcc.target/m68k/pr110934.c: New test. --- gcc/config/m68k/m68k.cc | 46 ++++++++++++++++++++++++ gcc/testsuite/gcc.target/m68k/pr110934.c | 9 +++++ 2 files changed, 55 insertions(+) create mode 100644 gcc/testsuite/gcc.target/m68k/pr110934.c diff --git a/gcc/config/m68k/m68k.cc b/gcc/config/m68k/m68k.cc index e9325686b92..72a29d772ea 100644 --- a/gcc/config/m68k/m68k.cc +++ b/gcc/config/m68k/m68k.cc @@ -197,6 +197,7 @@ static bool m68k_modes_tieable_p (machine_mode, machine_mode); static machine_mode m68k_promote_function_mode (const_tree, machine_mode, int *, const_tree, int); static void m68k_asm_final_postscan_insn (FILE *, rtx_insn *insn, rtx [], int); +static HARD_REG_SET m68k_zero_call_used_regs (HARD_REG_SET need_zeroed_hardregs); /* Initialize the GCC target structure. */ @@ -361,6 +362,9 @@ static void m68k_asm_final_postscan_insn (FILE *, rtx_insn *insn, rtx [], int); #undef TARGET_ASM_FINAL_POSTSCAN_INSN #define TARGET_ASM_FINAL_POSTSCAN_INSN m68k_asm_final_postscan_insn +#undef TARGET_ZERO_CALL_USED_REGS +#define TARGET_ZERO_CALL_USED_REGS m68k_zero_call_used_regs + TARGET_GNU_ATTRIBUTES (m68k_attribute_table, { /* { name, min_len, max_len, decl_req, type_req, fn_type_req, @@ -7166,4 +7170,46 @@ m68k_promote_function_mode (const_tree type, machine_mode mode, return mode; } +/* Implement TARGET_ZERO_CALL_USED_REGS. */ + +static HARD_REG_SET +m68k_zero_call_used_regs (HARD_REG_SET need_zeroed_hardregs) +{ + rtx zero_fpreg = NULL_RTX; + + for (unsigned int regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) + if (TEST_HARD_REG_BIT (need_zeroed_hardregs, regno)) + { + rtx reg, zero; + + if (INT_REGNO_P (regno)) + { + reg = regno_reg_rtx[regno]; + zero = CONST0_RTX (SImode); + } + else if (FP_REGNO_P (regno)) + { + reg = gen_raw_REG (SFmode, regno); + if (zero_fpreg == NULL_RTX) + { + /* On the 040/060 clearing an FP reg loads a large + immediate. To reduce code size use the first + cleared FP reg to clear remaing ones. Don't do + this on cores which use fmovecr. */ + zero = CONST0_RTX (SFmode); + if (TUNE_68040_60) + zero_fpreg = reg; + } + else + zero = zero_fpreg; + } + else + gcc_unreachable (); + + emit_move_insn (reg, zero); + } + + return need_zeroed_hardregs; +} + #include "gt-m68k.h" diff --git a/gcc/testsuite/gcc.target/m68k/pr110934.c b/gcc/testsuite/gcc.target/m68k/pr110934.c new file mode 100644 index 00000000000..8c21d46f660 --- /dev/null +++ b/gcc/testsuite/gcc.target/m68k/pr110934.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { do-options "-fzero-call-used-regs=used -fpic -O2" } */ + +extern double clobber_fp0 (void); + +void foo (void) +{ + clobber_fp0 (); +}