From patchwork Thu Nov 14 18:10:10 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Sandiford X-Patchwork-Id: 1195013 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-513448-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="eQYK4JsO"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47DTzh28xHz9sNT for ; Fri, 15 Nov 2019 05:10:22 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:subject:date:message-id:mime-version:content-type; q=dns; s= default; b=RKTelD8w3d8w3TgijmLojNEMfeY3hd8Nd2TysdneZ9v/GdMnhD5vx iJonaJR83hPPggU4TeApMOs3dRUoybMhD4RfG1fgXQkmbrrYbM7LyasLk1I4gAAd hD9RDoYw60DRkJu9xkzMXnaeVJdcVSyBkSY+4FkkH6HX/kMbrCsM2U= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:subject:date:message-id:mime-version:content-type; s= default; bh=zdUR0iQHDScDnbAZIBKIykXruCo=; b=eQYK4JsOV8h/F5uyK2Ir bh1i1WhicJQHk1AL2ODeP+AWthmcXB++cEY/mR64pELUnamPvGOaBbPHZVE6KTCQ 6GBn3GFKYZB+2Y/hPmlX6TDXWrJueB/4IzYbmVXU2Fj58cjsPlRbEq9e9yjOXJWJ Dwefmyof1AhwMYpqQG+qgAI= Received: (qmail 68757 invoked by alias); 14 Nov 2019 18:10:15 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 68746 invoked by uid 89); 14 Nov 2019 18:10:15 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-9.3 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, SPF_PASS autolearn=ham version=3.3.1 spammy=ld1r, vectorisation, sk:fno-vec, sk:fnovec X-HELO: foss.arm.com Received: from foss.arm.com (HELO foss.arm.com) (217.140.110.172) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 14 Nov 2019 18:10:13 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 0DCA1328 for ; Thu, 14 Nov 2019 10:10:12 -0800 (PST) Received: from localhost (e121540-lin.manchester.arm.com [10.32.98.126]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id A9E103F6C4 for ; Thu, 14 Nov 2019 10:10:11 -0800 (PST) From: Richard Sandiford To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, richard.sandiford@arm.com Subject: Tweak gcc.dg/vect/bb-slp-4[01].c (PR92366) Date: Thu, 14 Nov 2019 18:10:10 +0000 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) MIME-Version: 1.0 X-IsSubscribed: yes gcc.dg/vect/bb-slp-40.c was failing on some targets because the explicit dg-options overrode things like -maltivec. This patch uses dg-additional-options instead. Also, it seems safer not to require exactly 1 instance of each message, since that depends on the target vector length. gcc.dg/vect/bb-slp-41.c contained invariant constructors that are vectorised on AArch64 (foo) and constructors that aren't (bar). This meant that the number of times we print "Found vectorizable constructor" depended on how many vector sizes we try, since we'd print it for each failed attempt. In foo, we create invariant { b[0], ... } and { b[1], ... }, and the test is making sure that the two separate invariant vectors can be fed from the same vector load at b. This is a different case from bb-slp-40.c, where the constructors are naturally separate. (The expected count is 4 rather than 2 because we can vectorise the epilogue too.) However, due to limitations in the loop vectoriser, we still do the addition of { b[0], ... } and { b[1], ... } in the loop. Hopefully that'll be fixed at some point, so this patch adds an alternative test that directly needs 4 separate invariant constructors. E.g. with Joel's SLP optimisation, the new test generates: ldr q4, [x1] dup v7.4s, v4.s[0] dup v6.4s, v4.s[1] dup v5.4s, v4.s[2] dup v4.4s, v4.s[3] instead of the somewhat bizarre: ldp s6, s5, [x1, 4] ldr s4, [x1, 12] ld1r {v7.4s}, [x1] dup v6.4s, v6.s[0] dup v5.4s, v5.s[0] dup v4.4s, v4.s[0] The patch then disables vectorisation of the original foo in bb-vect-slp-41.c, so that we get the same correctness testing for bar but don't need to test for specific counts. Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64-linux-gnu. OK to install? Richard 2019-11-14 Richard Sandiford gcc/testsuite/ PR testsuite/92366 * gcc.dg/vect/bb-slp-40.c: Use dg-additional-options instead of dg-options. Remove expected counts. * gcc.dg/vect/bb-slp-41.c: Remove dg-options and explicit dg-do run. Suppress vectorization of foo. * gcc.dg/vect/bb-slp-42.c: New test. Index: gcc/testsuite/gcc.dg/vect/bb-slp-40.c =================================================================== --- gcc/testsuite/gcc.dg/vect/bb-slp-40.c 2019-11-04 21:13:57.363758109 +0000 +++ gcc/testsuite/gcc.dg/vect/bb-slp-40.c 2019-11-14 18:08:36.323546916 +0000 @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O3 -fdump-tree-slp-all" } */ +/* { dg-additional-options "-fvect-cost-model=dynamic" } */ /* { dg-require-effective-target vect_int } */ char g_d[1024], g_s1[1024], g_s2[1024]; @@ -30,5 +30,5 @@ void foo(void) } /* See that we vectorize an SLP instance. */ -/* { dg-final { scan-tree-dump-times "Found vectorizable constructor" 1 "slp1" } } */ -/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 1 "slp1" } } */ +/* { dg-final { scan-tree-dump "Found vectorizable constructor" "slp1" } } */ +/* { dg-final { scan-tree-dump "vectorizing stmts using SLP" "slp1" } } */ Index: gcc/testsuite/gcc.dg/vect/bb-slp-41.c =================================================================== --- gcc/testsuite/gcc.dg/vect/bb-slp-41.c 2019-11-04 21:13:57.363758109 +0000 +++ gcc/testsuite/gcc.dg/vect/bb-slp-41.c 2019-11-14 18:08:36.323546916 +0000 @@ -1,10 +1,9 @@ -/* { dg-do run } */ -/* { dg-options "-O3 -fdump-tree-slp-all -fno-vect-cost-model" } */ /* { dg-require-effective-target vect_int } */ #define ARR_SIZE 1000 -void foo (int *a, int *b) +void __attribute__((optimize (0))) +foo (int *a, int *b) { int i; for (i = 0; i < (ARR_SIZE - 2); ++i) @@ -56,6 +55,4 @@ int main () return 0; } -/* See that we vectorize an SLP instance. */ -/* { dg-final { scan-tree-dump-times "Found vectorizable constructor" 12 "slp1" } } */ -/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 4 "slp1" } } */ +/* { dg-final { scan-tree-dump-not "vectorizing stmts using SLP" "slp1" } } */ Index: gcc/testsuite/gcc.dg/vect/bb-slp-42.c =================================================================== --- /dev/null 2019-09-17 11:41:18.176664108 +0100 +++ gcc/testsuite/gcc.dg/vect/bb-slp-42.c 2019-11-14 18:08:36.323546916 +0000 @@ -0,0 +1,49 @@ +/* { dg-require-effective-target vect_int } */ +/* { dg-require-effective-target vect_perm } */ + +#include "tree-vect.h" + +#define ARR_SIZE 1024 + +void __attribute__((noipa)) +foo (int a[][ARR_SIZE], int *b) +{ + int i; + for (i = 0; i < ARR_SIZE; ++i) + { + a[0][i] += b[0]; + a[1][i] += b[1]; + a[2][i] += b[2]; + a[3][i] += b[3]; + } +} + +int +main () +{ + int a[4][ARR_SIZE]; + int b[4]; + + check_vect (); + + for (int i = 0; i < 4; ++i) + { + b[i] = 20 * i; + for (int j = 0; j < ARR_SIZE; ++j) + a[i][j] = (i + 1) * ARR_SIZE - j; + } + + foo (a, b); + + for (int i = 0; i < 4; ++i) + for (int j = 0; j < ARR_SIZE; ++j) + if (a[i][j] != (i + 1) * ARR_SIZE - j + 20 * i) + __builtin_abort (); + + return 0; + +} + +/* See that we vectorize an SLP instance. */ +/* { dg-final { scan-tree-dump "Found vectorizable constructor" "slp1" { target { ! vect_fully_masked } } } } */ +/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 4 "slp1" { target { ! vect_fully_masked } } } } */