From patchwork Fri Dec 6 20:42:22 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Law X-Patchwork-Id: 2019525 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=ventanamicro.com header.i=@ventanamicro.com header.a=rsa-sha256 header.s=google header.b=Qs7hMHdj; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4Y4jrT6slzz1yQw for ; Sat, 7 Dec 2024 07:43:05 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 4589E3858417 for ; Fri, 6 Dec 2024 20:43:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4589E3858417 Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=ventanamicro.com header.i=@ventanamicro.com header.a=rsa-sha256 header.s=google header.b=Qs7hMHdj X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-pl1-x636.google.com (mail-pl1-x636.google.com [IPv6:2607:f8b0:4864:20::636]) by sourceware.org (Postfix) with ESMTPS id 435CD3858CDB for ; Fri, 6 Dec 2024 20:42:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 435CD3858CDB Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=ventanamicro.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=ventanamicro.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 435CD3858CDB Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::636 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1733517749; cv=none; b=ZayWQ7UGjF3rE+fzxNWrOPSd5Tc3NT2ngtioFJt/5+P4TQR35fBQ1mJxOi1YBiuUltshB1gGoAkF9KRkODNxaYzV8fsCy3IglRJzv/TyrZbu9HjNTFAJdz29/NtqL4q2GkzuUEOFbnsNkFyrBT5zXy1d0tvrHrjzdu/8CGgs3Kk= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1733517749; c=relaxed/simple; bh=4e6l1c1t2OH3ld0s1C5QMXXAT8kyDOLKJ8mkJ39Oso4=; h=DKIM-Signature:Message-ID:Date:MIME-Version:From:Subject:To; b=IaZPDckPJ6cK056k3nTF2aYHebrwroapSm08WF0FgmaWQOYVPojml1C0yWwB58cbInrnQkufZjfOWMCdswDIwkprnOkogZ/Byf6DdE1+a+165qScrDyQR0FQ2Ht5EipBcxKD4jId5UIa+LrG5mdh8ApGBO1uA5dxuETZ9C/cv5Q= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 435CD3858CDB Received: by mail-pl1-x636.google.com with SMTP id d9443c01a7336-21619108a6bso8092565ad.3 for ; Fri, 06 Dec 2024 12:42:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1733517748; x=1734122548; darn=gcc.gnu.org; h=to:subject:from:content-language:user-agent:mime-version:date :message-id:from:to:cc:subject:date:message-id:reply-to; bh=tKrU4AEL/y3xYWnHdZqW5yjG8DTYqVKAdZej4RWtZDg=; b=Qs7hMHdjvVzj+ev7kNo94IWAz6NJtjOGsPC5bmCWvtS0CY6u0kmY2AUXv6FxcG9oev hs4RzgSghJYPnd5MQUcU1FFaQsMYAo+ciHx+m8W8dG2k1x2v5bNYDJ/ZRKzxsdn4cVKN vzOQcaS0PddmMV7DZwDcAM+ZsQJ0aak5svQxyrcXKdVvymqn5nA/dYRwCOraWcmid9Tn z6N1NWvNH0kVqtycRN9V8HZ6v1xXim2ER8vYwJ0w0P0+xro4NgXE2IgNusS7k4NOfIbs nEcrL98M8/VfPUj8unJ6Yazh6yLv8DjWUFCflztHImSVqHksTS9Or3DO/x5Wj7l6WKfz /fkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733517748; x=1734122548; h=to:subject:from:content-language:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=tKrU4AEL/y3xYWnHdZqW5yjG8DTYqVKAdZej4RWtZDg=; b=lihxE6Q9tyHCC+uNTyqsYw1Cw20VA0z2a6YPbnsTICSHfMzcfizhxgBI2ORMajTEag Q20g21ooMBkEqqYpnolmJ1o9s75Ruly6Pnzu+XFbSkzrkSOW1qv2NYJZULW0KR5+qXEk 60f58R396DKmp9rDbcM4DNFKPZkoq1jYd2tdakd6sUUr5OF3mVlg7DxaFPFbJhyntdga dywpaFKNorEltZdYjKFp5CoHbZ/y7lOwp0BzPFUsNItfWYTcK+xynkcH0PGw8GRsnOZV +BeTjfk9W6yaAzXUTqCdTFZTNDup/swCH6Y59UpVkMRXO7++ISJy1wq1EfzL3oIuPpaa GAFw== X-Gm-Message-State: AOJu0YzAmjmQNw5GN1aeN600+gKVStpZrfTdLF/0Jyug9TMi9pQ6Ip1t OF1fHZHqN/RyC9btCbpGXgEZnexN9V6b6mh6/y+RrjnUPJdR31GUQlxdmWn4ojxzg+zHCfeNLBE h/90= X-Gm-Gg: ASbGncsflP0HJu+BwgueD0hJsKueuVHz872o+xwf9OJhd2zqrKm2xDoAOiA5Sn0+X8K Q96hisA9YHuVT621R0iWdaD66WVdRq34djmFlfB8072igza54Hisy/O9CGIl2DTbpuhdpRhs9k9 U1c6JttmY0cVAEFek3aNTWVT0SdxsdfjOKx9QKrEA8SGi3QefDfqkbTJIquJxFxZ0wOfCVhqukI QF3PZl9jZ7c3T2N/rdALlKFx9JOO7igdH0xqVnf3XostfdGM5hjJA== X-Google-Smtp-Source: AGHT+IG3VdwrgZJkNQ2oxv2sx7xS1KRjgpLS2dYGdblbewO48ihScRKWY6XZ5OlFLzFdEUCKae/hQA== X-Received: by 2002:a17:903:11c3:b0:215:9d29:b440 with SMTP id d9443c01a7336-21614d33ae4mr59461165ad.17.1733517747728; Fri, 06 Dec 2024 12:42:27 -0800 (PST) Received: from [172.31.0.17] ([136.36.72.243]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-215f8e5f519sm32744395ad.61.2024.12.06.12.42.25 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 06 Dec 2024 12:42:26 -0800 (PST) Message-ID: <842a2551-6bcc-4cee-a232-7f606af82201@ventanamicro.com> Date: Fri, 6 Dec 2024 13:42:22 -0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US From: Jeff Law Subject: [committed][PR tree-optimization/117895] Fix sparc libgo build failure with CRC opts enabled To: "gcc-patches@gcc.gnu.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~incoming=patchwork.ozlabs.org@gcc.gnu.org So as noted in the BZ, sparc builds of the golang libraries were failing due to the CRC code. Ultimately this was another mode problem in the table expansion. Essentially when the mode of the resultant crc was different than the mode of the input data we could create mixed mode operations which is a no-no. Not entirely sure how we were getting away with it before, but it was clearly wrong. The mode of the crc will always be at least as large at the mode of the data for the cases we support. So the code has been adjusted to convert the data's mode to the crc's mode and do all the ops in the crc mode. That fixes the libgo build problem on sparc and I've verfied that there aren't any regressions on x86_64 as well as all the embedded targets in my tester. Pushing to the trunk. Jeff commit 669afc8c47363f1b4643d487e1daa06364926434 Author: Jeff Law Date: Fri Dec 6 13:40:25 2024 -0700 [PR tree-optimization/117895] Fix sparc libgo build failure with CRC opts enabled So as noted in the BZ, sparc builds of the golang libraries were failing due to the CRC code. Ultimately this was another mode problem in the table expansion. Essentially when the mode of the resultant crc was different than the mode of the input data we could create mixed mode operations which is a no-no. Not entirely sure how we were getting away with it before, but it was clearly wrong. The mode of the crc will always be at least as large at the mode of the data for the cases we support. So the code has been adjusted to convert the data's mode to the crc's mode and do all the ops in the crc mode. That fixes the libgo build problem on sparc and I've verfied that there aren't any regressions on x86_64 as well as all the embedded targets in my tester. PR tree-optimization/117895 gcc/ * expr.cc (calculate_table_based_CRC): Drop CRC_MODE argument. Convert DATA to CRC's mode, then do calculations in CRC's mode. (expand_crc_table_based): Corresponding changes. (expand_reversed_crc_table_based): Corresponding changes. diff --git a/gcc/expr.cc b/gcc/expr.cc index 5578e3d9e99..980ac415cfc 100644 --- a/gcc/expr.cc +++ b/gcc/expr.cc @@ -14336,29 +14336,32 @@ generate_crc_table (unsigned HOST_WIDE_INT polynom, unsigned short crc_bits) void calculate_table_based_CRC (rtx *crc, const rtx &input_data, const rtx &polynomial, - machine_mode crc_mode, machine_mode data_mode) + machine_mode data_mode) { - unsigned short crc_bit_size = GET_MODE_BITSIZE (crc_mode).to_constant (); - unsigned short data_size = GET_MODE_SIZE (data_mode).to_constant (); machine_mode mode = GET_MODE (*crc); + unsigned short crc_bit_size = GET_MODE_BITSIZE (mode).to_constant (); + unsigned short data_size = GET_MODE_SIZE (data_mode).to_constant (); rtx tab = generate_crc_table (UINTVAL (polynomial), crc_bit_size); for (unsigned short i = 0; i < data_size; i++) { /* crc >> (crc_bit_size - 8). */ - *crc = force_reg (crc_mode, *crc); + *crc = force_reg (mode, *crc); rtx op1 = expand_shift (RSHIFT_EXPR, mode, *crc, crc_bit_size - 8, NULL_RTX, 1); /* data >> (8 * (GET_MODE_SIZE (data_mode).to_constant () - i - 1)). */ unsigned range_8 = 8 * (data_size - i - 1); - rtx data = force_reg (data_mode, input_data); + /* CRC's mode is always at least as wide as INPUT_DATA. Convert + INPUT_DATA into CRC's mode. */ + rtx data = gen_reg_rtx (mode); + convert_move (data, input_data, 1); data = expand_shift (RSHIFT_EXPR, mode, data, range_8, NULL_RTX, 1); - /* data >> (8 * (GET_MODE_SIZE (data_mode) + /* data >> (8 * (GET_MODE_SIZE (mode) .to_constant () - i - 1)) & 0xFF. */ rtx data_final = expand_and (mode, data, - gen_int_mode (255, data_mode), NULL_RTX); + gen_int_mode (255, mode), NULL_RTX); /* (crc >> (crc_bit_size - 8)) ^ data_8bit. */ rtx in = expand_binop (mode, xor_optab, op1, data_final, @@ -14367,7 +14370,7 @@ calculate_table_based_CRC (rtx *crc, const rtx &input_data, /* ((crc >> (crc_bit_size - 8)) ^ data_8bit) & 0xFF. */ rtx index = expand_and (mode, in, gen_int_mode (255, mode), NULL_RTX); - int log_crc_size = exact_log2 (GET_MODE_SIZE (crc_mode).to_constant ()); + int log_crc_size = exact_log2 (GET_MODE_SIZE (mode).to_constant ()); index = expand_shift (LSHIFT_EXPR, mode, index, log_crc_size, NULL_RTX, 0); @@ -14377,7 +14380,7 @@ calculate_table_based_CRC (rtx *crc, const rtx &input_data, 0, OPTAB_DIRECT); /* crc_table[(crc >> (crc_bit_size - 8)) ^ data_8bit] */ - rtx tab_el = validize_mem (gen_rtx_MEM (crc_mode, addr)); + rtx tab_el = validize_mem (gen_rtx_MEM (mode, addr)); /* (crc << 8) if CRC is larger than 8, otherwise crc = 0. */ rtx high = NULL_RTX; @@ -14420,7 +14423,7 @@ expand_crc_table_based (rtx op0, rtx op1, rtx op2, rtx op3, machine_mode crc_mode = GET_MODE (op0); rtx crc = gen_reg_rtx (crc_mode); convert_move (crc, op1, 0); - calculate_table_based_CRC (&crc, op2, op3, crc_mode, data_mode); + calculate_table_based_CRC (&crc, op2, op3, data_mode); convert_move (op0, crc, 0); } @@ -14563,7 +14566,7 @@ expand_reversed_crc_table_based (rtx op0, rtx op1, rtx op2, rtx op3, convert_move (data, op2, 0); gen_reflecting_code (&data); - calculate_table_based_CRC (&crc, data, op3, crc_mode, data_mode); + calculate_table_based_CRC (&crc, data, op3, data_mode); gen_reflecting_code (&crc); convert_move (op0, crc, 0); diff --git a/gcc/expr.cc b/gcc/expr.cc index 5578e3d9e99..980ac415cfc 100644 --- a/gcc/expr.cc +++ b/gcc/expr.cc @@ -14336,29 +14336,32 @@ generate_crc_table (unsigned HOST_WIDE_INT polynom, unsigned short crc_bits) void calculate_table_based_CRC (rtx *crc, const rtx &input_data, const rtx &polynomial, - machine_mode crc_mode, machine_mode data_mode) + machine_mode data_mode) { - unsigned short crc_bit_size = GET_MODE_BITSIZE (crc_mode).to_constant (); - unsigned short data_size = GET_MODE_SIZE (data_mode).to_constant (); machine_mode mode = GET_MODE (*crc); + unsigned short crc_bit_size = GET_MODE_BITSIZE (mode).to_constant (); + unsigned short data_size = GET_MODE_SIZE (data_mode).to_constant (); rtx tab = generate_crc_table (UINTVAL (polynomial), crc_bit_size); for (unsigned short i = 0; i < data_size; i++) { /* crc >> (crc_bit_size - 8). */ - *crc = force_reg (crc_mode, *crc); + *crc = force_reg (mode, *crc); rtx op1 = expand_shift (RSHIFT_EXPR, mode, *crc, crc_bit_size - 8, NULL_RTX, 1); /* data >> (8 * (GET_MODE_SIZE (data_mode).to_constant () - i - 1)). */ unsigned range_8 = 8 * (data_size - i - 1); - rtx data = force_reg (data_mode, input_data); + /* CRC's mode is always at least as wide as INPUT_DATA. Convert + INPUT_DATA into CRC's mode. */ + rtx data = gen_reg_rtx (mode); + convert_move (data, input_data, 1); data = expand_shift (RSHIFT_EXPR, mode, data, range_8, NULL_RTX, 1); - /* data >> (8 * (GET_MODE_SIZE (data_mode) + /* data >> (8 * (GET_MODE_SIZE (mode) .to_constant () - i - 1)) & 0xFF. */ rtx data_final = expand_and (mode, data, - gen_int_mode (255, data_mode), NULL_RTX); + gen_int_mode (255, mode), NULL_RTX); /* (crc >> (crc_bit_size - 8)) ^ data_8bit. */ rtx in = expand_binop (mode, xor_optab, op1, data_final, @@ -14367,7 +14370,7 @@ calculate_table_based_CRC (rtx *crc, const rtx &input_data, /* ((crc >> (crc_bit_size - 8)) ^ data_8bit) & 0xFF. */ rtx index = expand_and (mode, in, gen_int_mode (255, mode), NULL_RTX); - int log_crc_size = exact_log2 (GET_MODE_SIZE (crc_mode).to_constant ()); + int log_crc_size = exact_log2 (GET_MODE_SIZE (mode).to_constant ()); index = expand_shift (LSHIFT_EXPR, mode, index, log_crc_size, NULL_RTX, 0); @@ -14377,7 +14380,7 @@ calculate_table_based_CRC (rtx *crc, const rtx &input_data, 0, OPTAB_DIRECT); /* crc_table[(crc >> (crc_bit_size - 8)) ^ data_8bit] */ - rtx tab_el = validize_mem (gen_rtx_MEM (crc_mode, addr)); + rtx tab_el = validize_mem (gen_rtx_MEM (mode, addr)); /* (crc << 8) if CRC is larger than 8, otherwise crc = 0. */ rtx high = NULL_RTX; @@ -14420,7 +14423,7 @@ expand_crc_table_based (rtx op0, rtx op1, rtx op2, rtx op3, machine_mode crc_mode = GET_MODE (op0); rtx crc = gen_reg_rtx (crc_mode); convert_move (crc, op1, 0); - calculate_table_based_CRC (&crc, op2, op3, crc_mode, data_mode); + calculate_table_based_CRC (&crc, op2, op3, data_mode); convert_move (op0, crc, 0); } @@ -14563,7 +14566,7 @@ expand_reversed_crc_table_based (rtx op0, rtx op1, rtx op2, rtx op3, convert_move (data, op2, 0); gen_reflecting_code (&data); - calculate_table_based_CRC (&crc, data, op3, crc_mode, data_mode); + calculate_table_based_CRC (&crc, data, op3, data_mode); gen_reflecting_code (&crc); convert_move (op0, crc, 0);