From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id AB8E3385B501 for ; Mon, 20 Feb 2023 21:09:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org AB8E3385B501 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1676927356; h=from:from:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type; bh=XKYgZ92XC8O8rVnzR04waFxnOIwZGb2f6zVs3+I52W0=; b=bygF/gf6n0+kNONc5RXdJQGBmLrb4jxeJFCe/dfoQtLakbIO24tuJRHXY5wjWl0t0PASCf DAVYlqCE6rs2sa3v5iA009Rsu8/jrunjstJz4WBKH3jC0LlGppp+kqQnvZ5QEiJWi1V/V+ hfvJpOD9CJycwgb7ilGSaKcGD2RGvUo= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-391-igxaTGkxNCKwDaLVyoJKMg-1; Mon, 20 Feb 2023 16:09:14 -0500 X-MC-Unique: igxaTGkxNCKwDaLVyoJKMg-1 Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id EECCE29AA2CE; Mon, 20 Feb 2023 21:09:13 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.39.192.62]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B4354492B04; Mon, 20 Feb 2023 21:09:13 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.17.1/8.17.1) with ESMTPS id 31KL960O1817331 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 20 Feb 2023 22:09:11 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.17.1/8.17.1/Submit) id 31KL903o1817330; Mon, 20 Feb 2023 22:09:00 +0100 Date: Mon, 20 Feb 2023 22:09:00 +0100 From: Jakub Jelinek To: Segher Boessenkool Cc: gcc-patches@gcc.gnu.org Subject: [committed] powerpc: Another umaddditi4 fix [PR108862] Message-ID: Reply-To: Jakub Jelinek MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.9 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-3.7 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP 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: Hi! The following testcase is miscompiled on powerpc64le-linux with -O2 -mcpu=power9. The problem is that gen_umaddditi4 is called with the same TImode register for both op0 and op3, and maddlddi4 overwrites the low half of op0 before the low half of op3 is read, so when they are the same register it reads the result of maddlddi4. The following patch fixes that by swapping maddlddi4 and umadddi4_highpart{,_le} during expansion, as the latter writes into a temporary pseudo and so can't change anything maddlddi4 depends on. Bootstrapped/regtested on powerpc64-linux (power7, tested -m32/-m64), powerpc64le-linux (power8 and another on power9 with --with-cpu-64=power9 --with-tune-64=power9), preapproved by Segher on IRC, committed to trunk. 2023-02-20 Jakub Jelinek PR target/108862 * config/rs6000/rs6000.md (umaddditi4): Swap gen_maddlddi4 with gen_umadddi4_highpart{,_le}. * gcc.dg/pr108862.c: New test. * gcc.target/powerpc/pr108862.c: New test. --- gcc/config/rs6000/rs6000.md.jj 2023-02-15 10:51:12.745802021 +0100 +++ gcc/config/rs6000/rs6000.md 2023-02-20 16:01:02.929027764 +0100 @@ -3249,8 +3249,6 @@ rtx op3_hi = gen_rtx_SUBREG (DImode, operands[3], BYTES_BIG_ENDIAN ? 0 : 8); rtx hi_temp = gen_reg_rtx (DImode); - emit_insn (gen_maddlddi4 (op0_lo, operands[1], operands[2], op3_lo)); - if (BYTES_BIG_ENDIAN) emit_insn (gen_umadddi4_highpart (hi_temp, operands[1], operands[2], op3_lo)); @@ -3258,6 +3256,8 @@ emit_insn (gen_umadddi4_highpart_le (hi_temp, operands[1], operands[2], op3_lo)); + emit_insn (gen_maddlddi4 (op0_lo, operands[1], operands[2], op3_lo)); + emit_insn (gen_adddi3 (op0_hi, hi_temp, op3_hi)); DONE; --- gcc/testsuite/gcc.dg/pr108862.c.jj 2023-02-20 15:52:20.570619215 +0100 +++ gcc/testsuite/gcc.dg/pr108862.c 2023-02-20 15:51:52.363029125 +0100 @@ -0,0 +1,27 @@ +/* PR target/108862 */ +/* { dg-do run { target int128 } } */ +/* { dg-options "-O2" } */ + +unsigned long long a[2] = { 0x04a13945d898c296ULL, 0x0000100000000fffULL }; +unsigned long long b[4] = { 0x04a13945d898c296ULL, 0, 0, 0x0000100000000fffULL }; + +__attribute__((noipa)) unsigned __int128 +foo (int x, unsigned long long *y, unsigned long long *z) +{ + unsigned __int128 w = 0; + for (int i = 0; i < x; i++) + w += (unsigned __int128)*y++ * (unsigned __int128)*z--; + return w; +} + +int +main () +{ + unsigned __int128 x = foo (1, &a[0], &a[1]); + unsigned __int128 y = foo (2, &b[0], &b[3]); + if ((unsigned long long) (x >> 64) != 0x0000004a13945dd3ULL + || (unsigned long long) x != 0x9b1c8443b3909d6aULL + || x != y) + __builtin_abort (); + return 0; +} --- gcc/testsuite/gcc.target/powerpc/pr108862.c.jj 2023-02-20 15:52:51.374171586 +0100 +++ gcc/testsuite/gcc.target/powerpc/pr108862.c 2023-02-20 15:53:04.497980869 +0100 @@ -0,0 +1,6 @@ +/* PR target/108862 */ +/* { dg-do run { target int128 } } */ +/* { dg-require-effective-target p9vector_hw } */ +/* { dg-options "-O2 -mdejagnu-cpu=power9" } */ + +#include "../../gcc.dg/pr108862.c" Jakub