From patchwork Thu Jan 18 07:31:04 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Biener X-Patchwork-Id: 84320 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 B0F7D3858C53 for ; Thu, 18 Jan 2024 07:36:48 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtp-out2.suse.de (smtp-out2.suse.de [IPv6:2a07:de40:b251:101:10:150:64:2]) by sourceware.org (Postfix) with ESMTPS id F33C13858C29 for ; Thu, 18 Jan 2024 07:36:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org F33C13858C29 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org F33C13858C29 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a07:de40:b251:101:10:150:64:2 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1705563377; cv=none; b=bLfWPBb2I49A19prM2jGDJliaP5VB0RGjTRqx4/tPBVMIRq1grWUlJvgQZ4fhbwL7j7jxhN0rOuethTSZ5tn0L7mICXt6Xa0fPvtcc6xXbh2eCLxkKGO569yMilbc0XCuFP0dJOThPd4ByhjYDT3fjpMqPcey0l/wok6enD59Hk= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1705563377; c=relaxed/simple; bh=rqLtMH50s4ilYaPWFgQ2yf0UECXNy4ussCOOVK8NNlY=; h=DKIM-Signature:DKIM-Signature:DKIM-Signature:DKIM-Signature:Date: From:To:Subject:MIME-Version; b=STwjO4yxSac2/ACDyfW+nBJNuNcmHj0f9qMKUOBazUIhTAxQzGhAGCUYUwMBIeA303rU9anxZmg8w5vWk72S0peu443dBdw7Kf+R7FDrO3qWUYr64c3fL5PXNEU+ANZNRoS9/cxpyGVwiXNWppkVazkfv1yo+m/p+prao0cHing= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from [10.168.4.150] (unknown [10.168.4.150]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id E75051F769 for ; Thu, 18 Jan 2024 07:36:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1705563374; h=from:from:reply-to:date:date:to:to:cc:mime-version:mime-version: content-type:content-type; bh=qpxAtIYvNJRcefu2muxX4UpRMOYnjRFDMQ3XvGheVc4=; b=gEWcBDw0x41lXUgB2IHxPo6SaenO2NWrn6XTZ79f9zHQeVP9247guFqVAQgjnQzN7ctaub 9dZ4gymBN9eaa8Izs25/5EMn2AJiz57dL15qIeFfe8FZtVbbC65C13COx7BKqNPCmwIrFY ABTRJgKKL3wcE0OToSv13MHz0tz5Ymw= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1705563374; h=from:from:reply-to:date:date:to:to:cc:mime-version:mime-version: content-type:content-type; bh=qpxAtIYvNJRcefu2muxX4UpRMOYnjRFDMQ3XvGheVc4=; b=SwIImN5gX2Hzq0cX2FQxVQkHvQZZGZdblcIWcmTm9I31sMBc9TZiwIch8nQCSwn+T0F1UX RrsXEh4GE7SYm7CQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1705563372; h=from:from:reply-to:date:date:to:to:cc:mime-version:mime-version: content-type:content-type; bh=qpxAtIYvNJRcefu2muxX4UpRMOYnjRFDMQ3XvGheVc4=; b=bXwfGhqrwJRHQjrH21ZRDs7Q77a4ueD4vlgcfCNXEKkbKktWC/1sSDN/M9bQW8ifYSNRDo XfQVNrbOGUjB01BQiGXqGPYcAllHmgbo575QvZJEOVAXjTmseEHkWCgYrlMljeWNsU3AZe yGkTE3hjhM9FtmLjHE6kp6ZnrP9+eK8= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1705563372; h=from:from:reply-to:date:date:to:to:cc:mime-version:mime-version: content-type:content-type; bh=qpxAtIYvNJRcefu2muxX4UpRMOYnjRFDMQ3XvGheVc4=; b=xmoHEYewNleNWuJyvlXkaSp1AsuTkklGOYOw6W0zVfXdutJiZfkaY1rwejXqlSDBTR8OJq CW2Bo0ZedFer00DQ== Date: Thu, 18 Jan 2024 08:31:04 +0100 (CET) From: Richard Biener To: gcc-patches@gcc.gnu.org Subject: [PATCH] tree-optimization/113431 - wrong dependence with invariant load MIME-Version: 1.0 Authentication-Results: smtp-out2.suse.de; none X-Spam-Level: X-Spam-Score: -1.42 X-Spamd-Result: default: False [-1.42 / 50.00]; ARC_NA(0.00)[]; FROM_HAS_DN(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; NEURAL_HAM_LONG(-0.63)[-0.635]; MIME_GOOD(-0.10)[text/plain]; TO_DN_NONE(0.00)[]; RCPT_COUNT_ONE(0.00)[1]; MISSING_MID(2.50)[]; DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; NEURAL_HAM_SHORT(-0.19)[-0.946]; DBL_BLOCKED_OPENRESOLVER(0.00)[tree-vect-data-refs.cc:url]; FUZZY_BLOCKED(0.00)[rspamd.com]; RCVD_COUNT_ZERO(0.00)[0]; FROM_EQ_ENVFROM(0.00)[]; MIME_TRACE(0.00)[0:+]; BAYES_HAM(-3.00)[100.00%] X-Spam-Status: No, score=-10.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, MISSING_MID, 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 Message-Id: <20240118073648.B0F7D3858C53@sourceware.org> The vectorizer dependence analysis is confused with invariant loads when figuring whether the circumstances are so that we preserve scalar stmt execution order. The following rectifies this. Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed. PR tree-optimization/113431 * tree-vect-data-refs.cc (vect_preserves_scalar_order_p): When there is an invariant load we might not preserve scalar order. * gcc.dg/vect/pr113431.c: New testcase. --- gcc/testsuite/gcc.dg/vect/pr113431.c | 18 ++++++++++++++++++ gcc/tree-vect-data-refs.cc | 6 ++++++ 2 files changed, 24 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/vect/pr113431.c diff --git a/gcc/testsuite/gcc.dg/vect/pr113431.c b/gcc/testsuite/gcc.dg/vect/pr113431.c new file mode 100644 index 00000000000..04448d9dd81 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr113431.c @@ -0,0 +1,18 @@ +/* { dg-additional-options "-O3 -fdump-tree-slp1-details" } */ + +#include "tree-vect.h" + +int a[2][9]; +int b; +int main() +{ + check_vect (); + for (b = 0; b < 2; b++) + for (long e = 8; e > 0; e--) + a[b][e] = a[0][1] == 0; + if (a[1][1] != 0) + __builtin_abort (); + return 0; +} + +/* { dg-final { scan-tree-dump-times "optimized: basic block part vectorized" 2 "slp1" { target vect_int } } } */ diff --git a/gcc/tree-vect-data-refs.cc b/gcc/tree-vect-data-refs.cc index 0495842b350..f592aeb8028 100644 --- a/gcc/tree-vect-data-refs.cc +++ b/gcc/tree-vect-data-refs.cc @@ -282,6 +282,12 @@ vect_preserves_scalar_order_p (dr_vec_info *dr_info_a, dr_vec_info *dr_info_b) && !STMT_VINFO_GROUPED_ACCESS (stmtinfo_b)) return true; + /* If there is a loop invariant read involved we might vectorize it in + the prologue, breaking scalar oder with respect to the in-loop store. */ + if ((DR_IS_READ (dr_info_a->dr) && integer_zerop (DR_STEP (dr_info_a->dr))) + || (DR_IS_READ (dr_info_b->dr) && integer_zerop (DR_STEP (dr_info_b->dr)))) + return false; + /* STMT_A and STMT_B belong to overlapping groups. All loads are emitted at the position of the first scalar load. Stores in a group are emitted at the position of the last scalar store.