From patchwork Mon Jun 27 18:09:07 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dimitar Dimitrov X-Patchwork-Id: 55453 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 8074138312B8 for ; Mon, 27 Jun 2022 18:09:39 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from server28.superhosting.bg (server28.superhosting.bg [217.174.156.11]) by sourceware.org (Postfix) with ESMTPS id 73F8C3856DD1 for ; Mon, 27 Jun 2022 18:09:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 73F8C3856DD1 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=dinux.eu Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=dinux.eu DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dinux.eu; s=default; h=Content-Transfer-Encoding:MIME-Version:Message-Id:Date:Subject: Cc:To:From:Sender:Reply-To:Content-Type:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=mToGsBFI7jXoWbU9/VPC0o7pQommgO7ReEEr5Og7EQE=; b=ZVhADXmJASHWXHOUnPU6SThmQ6 IhbgaSErefSPxdlNOX83dXoFyB9qa6OEwPCC2tF5pC9IvsEpbgnhAi9J59JzMzXnpw2amPz7y5Pz8 zOMf6Z+kOrnDCyz2BIYhXEKdlFmN7BUZ14M4IWfq7OiaP7ONbIQTKbfTwspILqHstNNC2JZq02QU4 fQxvaz7Pl/3JLaPSSSA41b57bJ2So9kKNY79ZxKqcmJnugAmtxcXPFTouZV78VibX1++OaSFJTlVm WpGAsXM7UzAP0WwYsAhs0n//NEuwIVL3JJdIrs0+VNq0iZnKyqMxwXClCK7x6JuY9HEyY4ljNCFdn EgbvlNcg==; Received: from [95.87.234.74] (port=46956 helo=kendros.lan) by server28.superhosting.bg with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1o5tAh-00095U-Mn; Mon, 27 Jun 2022 21:09:18 +0300 From: Dimitar Dimitrov To: gcc-patches@gcc.gnu.org Subject: [PATCH v2] testsuite: Add new target check for no_alignment_constraints Date: Mon, 27 Jun 2022 21:09:07 +0300 Message-Id: <20220627180907.321403-1-dimitar@dinux.eu> X-Mailer: git-send-email 2.36.1 MIME-Version: 1.0 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server28.superhosting.bg X-AntiAbuse: Original Domain - gcc.gnu.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - dinux.eu X-Get-Message-Sender-Via: server28.superhosting.bg: authenticated_id: dimitar@dinux.eu X-Authenticated-Sender: server28.superhosting.bg: dimitar@dinux.eu X-Source: X-Source-Args: X-Source-Dir: X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_PASS, 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.29 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 Sender: "Gcc-patches" A few testcases were marked for avr target, which has no alignment requirements. But those tests in fact should filter for any target having __BIGGEST_ALIGNMENT__=1. A new effective target check is introduced: no_alignment_constraints. It checks whether __BIGGEST_ALIGNMENT__ is declared as 1. This change fixes the testsuite cases for PRU target. I don't have environment to test mm32c and cris targets, which also declare __BIGGEST_ALIGNMENT__=1. It was regression-tested on x86_64-pc-linux-gnu. The following two existing macros were considered, but they check for subtly different target behaviour: 1. non_strict_align If true, non-aligned access is permitted. But it also allows variables to be naturally aligned, which is not true for no_alignment_constraints. 2. default_packed Whether structures are packed by default is not necessarily the same as lacking constraints for non-aggregate types. For example, BIGGEST_FIELD_ALIGNMENT or ADJUST_FIELD_ALIGN could be defined for a target as something other than BIGGEST_ALIGNMENT. gcc/ChangeLog: * doc/sourcebuild.texi: Document new no_alignment_constraints effective target check. gcc/testsuite/ChangeLog: * c-c++-common/Wcast-align.c: Silence warnings for targets with no_alignment_constraints. * gcc.dg/c11-align-4.c: Skip for no_alignment_constraints. * gcc.dg/strlenopt-10.c: Replace checks for avr with checks for any target with no_alignment_constraints. * gcc.dg/strlenopt-11.c: Ditto. * gcc.dg/strlenopt-13.c: Ditto. * lib/target-supports.exp (check_effective_target_no_alignment_constraints): New. Signed-off-by: Dimitar Dimitrov --- Changes since patch V1: - Documented the new check in gcc/doc/sourcebuild.texi. gcc/doc/sourcebuild.texi | 9 +++++++++ gcc/testsuite/c-c++-common/Wcast-align.c | 4 ++-- gcc/testsuite/gcc.dg/c11-align-4.c | 2 +- gcc/testsuite/gcc.dg/strlenopt-10.c | 6 +++--- gcc/testsuite/gcc.dg/strlenopt-11.c | 14 +++++++------- gcc/testsuite/gcc.dg/strlenopt-13.c | 16 ++++++++-------- gcc/testsuite/lib/target-supports.exp | 13 +++++++++++++ 7 files changed, 43 insertions(+), 21 deletions(-) diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi index 3696a58fbf2..760ff9559a6 100644 --- a/gcc/doc/sourcebuild.texi +++ b/gcc/doc/sourcebuild.texi @@ -2716,6 +2716,7 @@ Target supports @option{-branch-cost=N}. Target uses @code{__cxa_atexit}. @item default_packed +@anchor{default_packed} Target has packed layout of structure members by default. @item exceptions @@ -2786,6 +2787,14 @@ Target uses natural alignment (aligned to type size) for types of Target uses natural alignment (aligned to type size) for types of 64 bits or less. +@item no_alignment_constraints +Target defines __BIGGEST_ALIGNMENT__=1. Hence target imposes +no alignment constraints. This is similar, but not necessarily +the same as @ref{default_packed}. Although @code{BIGGEST_FIELD_ALIGNMENT} +defaults to @code{BIGGEST_ALIGNMENT} for most targets, it is possible +for a target to set those two with different values and have different +alignment constraints for aggregate and non-aggregate types. + @item noinit Target supports the @code{noinit} variable attribute. diff --git a/gcc/testsuite/c-c++-common/Wcast-align.c b/gcc/testsuite/c-c++-common/Wcast-align.c index c296c7fd249..1087b10fd99 100644 --- a/gcc/testsuite/c-c++-common/Wcast-align.c +++ b/gcc/testsuite/c-c++-common/Wcast-align.c @@ -16,8 +16,8 @@ struct t { double x; } *q; void foo (void) { - y = (c *) x; /* { dg-warning "7:cast \[^\n\r]* required alignment of target type" } */ - z = (d *) x; /* { dg-warning "7:cast \[^\n\r]* required alignment of target type" } */ + y = (c *) x; /* { dg-warning "7:cast \[^\n\r]* required alignment of target type" "" { target { ! no_alignment_constraints } } } */ + z = (d *) x; /* { dg-warning "7:cast \[^\n\r]* required alignment of target type" "" { target { ! no_alignment_constraints } } } */ (long long *) p; /* { dg-bogus "alignment" } */ (double *) q; /* { dg-bogus "alignment" } */ } diff --git a/gcc/testsuite/gcc.dg/c11-align-4.c b/gcc/testsuite/gcc.dg/c11-align-4.c index 57f93ff05fc..eb9071b9149 100644 --- a/gcc/testsuite/gcc.dg/c11-align-4.c +++ b/gcc/testsuite/gcc.dg/c11-align-4.c @@ -2,7 +2,7 @@ are at least some alignment constraints). */ /* { dg-do compile } */ /* { dg-options "-std=c11 -pedantic-errors" } */ -/* { dg-skip-if "no alignment constraints" { "avr-*-*" } } */ +/* { dg-skip-if "no alignment constraints" { no_alignment_constraints } } */ #include diff --git a/gcc/testsuite/gcc.dg/strlenopt-10.c b/gcc/testsuite/gcc.dg/strlenopt-10.c index ce959c34a80..6e2c2597b27 100644 --- a/gcc/testsuite/gcc.dg/strlenopt-10.c +++ b/gcc/testsuite/gcc.dg/strlenopt-10.c @@ -70,10 +70,10 @@ main () } /* { dg-final { scan-tree-dump-times "strlen \\(" 2 "strlen1" } } */ -/* avr has BIGGEST_ALIGNMENT 8, allowing fold_builtin_memory_op +/* Some targets have BIGGEST_ALIGNMENT 8-bits, allowing fold_builtin_memory_op to expand the memcpy call at the end of fn2. */ -/* { dg-final { scan-tree-dump-times "memcpy \\(" 8 "strlen1" { target { ! avr-*-* } } } } */ -/* { dg-final { scan-tree-dump-times "memcpy \\(" 7 "strlen1" { target { avr-*-* } } } } */ +/* { dg-final { scan-tree-dump-times "memcpy \\(" 8 "strlen1" { target { ! no_alignment_constraints } } } } */ +/* { dg-final { scan-tree-dump-times "memcpy \\(" 7 "strlen1" { target { no_alignment_constraints} } } } */ /* { dg-final { scan-tree-dump-times "strcpy \\(" 0 "strlen1" } } */ /* { dg-final { scan-tree-dump-times "strcat \\(" 0 "strlen1" } } */ /* { dg-final { scan-tree-dump-times "strchr \\(" 0 "strlen1" } } */ diff --git a/gcc/testsuite/gcc.dg/strlenopt-11.c b/gcc/testsuite/gcc.dg/strlenopt-11.c index abd9faebed6..952de0730f1 100644 --- a/gcc/testsuite/gcc.dg/strlenopt-11.c +++ b/gcc/testsuite/gcc.dg/strlenopt-11.c @@ -59,17 +59,17 @@ main () } /* { dg-final { scan-tree-dump-times "strlen \\(" 3 "strlen1" } } */ -/* avr has BIGGEST_ALIGNMENT 8, allowing fold_builtin_memory_op +/* Some targets have BIGGEST_ALIGNMENT 8-bits, allowing fold_builtin_memory_op to expand the memcpy call at the end of fn1. */ -/* { dg-final { scan-tree-dump-times "memcpy \\(" 7 "strlen1" { target { ! avr-*-* } } } } */ -/* { dg-final { scan-tree-dump-times "memcpy \\(" 6 "strlen1" { target { avr-*-* } } } } */ +/* { dg-final { scan-tree-dump-times "memcpy \\(" 7 "strlen1" { target { ! no_alignment_constraints } } } } */ +/* { dg-final { scan-tree-dump-times "memcpy \\(" 6 "strlen1" { target { no_alignment_constraints } } } } */ /* { dg-final { scan-tree-dump-times "strcpy \\(" 0 "strlen1" } } */ /* { dg-final { scan-tree-dump-times "strcat \\(" 0 "strlen1" } } */ /* { dg-final { scan-tree-dump-times "strchr \\(" 0 "strlen1" } } */ /* { dg-final { scan-tree-dump-times "stpcpy \\(" 0 "strlen1" } } */ /* Where the memcpy is expanded, the assignemts to elements of l are propagated. */ -/* { dg-final { scan-tree-dump-times " _\[0-9\]* = strlen \\(\[^\n\r\]*;\[\n\r\]* l.0. = " 1 "strlen1" { target { ! avr-*-* } } } } */ -/* { dg-final { scan-tree-dump-times " _\[0-9\]* = strlen \\(\[^\n\r\]*;\[\n\r\]* l.6. = " 1 "strlen1" { target { ! avr-*-* } } } } */ -/* { dg-final { scan-tree-dump-times " _\[0-9\]* = strlen \\(\[^\n\r\]*;\[\n\r\]* l.9. = " 1 "strlen1" { target { ! avr-*-* } } } } */ -/* { dg-final { scan-tree-dump-times " _\[0-9\]* = strlen \\(\[^\n\r\]*;" 3 "strlen1" { target { avr-*-* } } } } */ +/* { dg-final { scan-tree-dump-times " _\[0-9\]* = strlen \\(\[^\n\r\]*;\[\n\r\]* l.0. = " 1 "strlen1" { target { ! no_alignment_constraints } } } } */ +/* { dg-final { scan-tree-dump-times " _\[0-9\]* = strlen \\(\[^\n\r\]*;\[\n\r\]* l.6. = " 1 "strlen1" { target { ! no_alignment_constraints } } } } */ +/* { dg-final { scan-tree-dump-times " _\[0-9\]* = strlen \\(\[^\n\r\]*;\[\n\r\]* l.9. = " 1 "strlen1" { target { ! no_alignment_constraints } } } } */ +/* { dg-final { scan-tree-dump-times " _\[0-9\]* = strlen \\(\[^\n\r\]*;" 3 "strlen1" { target { no_alignment_constraints } } } } */ diff --git a/gcc/testsuite/gcc.dg/strlenopt-13.c b/gcc/testsuite/gcc.dg/strlenopt-13.c index 27ecc79c2d9..4c6d5266780 100644 --- a/gcc/testsuite/gcc.dg/strlenopt-13.c +++ b/gcc/testsuite/gcc.dg/strlenopt-13.c @@ -56,18 +56,18 @@ main () } /* { dg-final { scan-tree-dump-times "strlen \\(" 4 "strlen1" } } */ -/* avr has BIGGEST_ALIGNMENT 8, allowing fold_builtin_memory_op +/* Some targets have BIGGEST_ALIGNMENT 8-bits, allowing fold_builtin_memory_op to expand the memcpy call at the end of fn1. */ -/* { dg-final { scan-tree-dump-times "memcpy \\(" 7 "strlen1" { target { ! avr-*-* } } } } */ -/* { dg-final { scan-tree-dump-times "memcpy \\(" 6 "strlen1" { target { avr-*-* } } } } */ +/* { dg-final { scan-tree-dump-times "memcpy \\(" 7 "strlen1" { target { ! no_alignment_constraints } } } } */ +/* { dg-final { scan-tree-dump-times "memcpy \\(" 6 "strlen1" { target { no_alignment_constraints } } } } */ /* { dg-final { scan-tree-dump-times "strcpy \\(" 0 "strlen1" } } */ /* { dg-final { scan-tree-dump-times "strcat \\(" 0 "strlen1" } } */ /* { dg-final { scan-tree-dump-times "strchr \\(" 0 "strlen1" } } */ /* { dg-final { scan-tree-dump-times "stpcpy \\(" 0 "strlen1" } } */ /* Where the memcpy is expanded, the assignemts to elements of l are propagated. */ -/* { dg-final { scan-tree-dump-times " _\[0-9\]* = strlen \\(\[^\n\r\]*;\[\n\r\]* l.0. = " 1 "strlen1" { target { ! avr-*-* } } } } */ -/* { dg-final { scan-tree-dump-times " _\[0-9\]* = strlen \\(\[^\n\r\]*;\[\n\r\]* l.1. = " 1 "strlen1" { target { ! avr-*-* } } } } */ -/* { dg-final { scan-tree-dump-times " _\[0-9\]* = strlen \\(\[^\n\r\]*;\[\n\r\]* l.5. = " 1 "strlen1" { target { ! avr-*-* } } } } */ -/* { dg-final { scan-tree-dump-times " _\[0-9\]* = strlen \\(\[^\n\r\]*;\[\n\r\]* l.6. = " 1 "strlen1" { target { ! avr-*-* } } } } */ -/* { dg-final { scan-tree-dump-times " _\[0-9\]* = strlen \\(\[^\n\r\]*;" 4 "strlen1" { target { avr-*-* } } } } */ +/* { dg-final { scan-tree-dump-times " _\[0-9\]* = strlen \\(\[^\n\r\]*;\[\n\r\]* l.0. = " 1 "strlen1" { target { ! no_alignment_constraints } } } } */ +/* { dg-final { scan-tree-dump-times " _\[0-9\]* = strlen \\(\[^\n\r\]*;\[\n\r\]* l.1. = " 1 "strlen1" { target { ! no_alignment_constraints } } } } */ +/* { dg-final { scan-tree-dump-times " _\[0-9\]* = strlen \\(\[^\n\r\]*;\[\n\r\]* l.5. = " 1 "strlen1" { target { ! no_alignment_constraints } } } } */ +/* { dg-final { scan-tree-dump-times " _\[0-9\]* = strlen \\(\[^\n\r\]*;\[\n\r\]* l.6. = " 1 "strlen1" { target { ! no_alignment_constraints } } } } */ +/* { dg-final { scan-tree-dump-times " _\[0-9\]* = strlen \\(\[^\n\r\]*;" 4 "strlen1" { target { no_alignment_constraints } } } } */ diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index e481a2a71ff..48c5dda6a12 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -7549,6 +7549,19 @@ proc check_effective_target_vect_aligned_arrays { } { return $et_vect_aligned_arrays } +# Return 1 if the biggest alignment required by target is 1 * BITS_PER_UNIT. +# In such case the target does not impose any alignment constraints. + +proc check_effective_target_no_alignment_constraints { } { + return [check_runtime_nocache no_alignment_constraints { + int + main (void) + { + return __BIGGEST_ALIGNMENT__ == 1 ? 0 : 1; + } + }] +} + # Return 1 if types of size 32 bit or less are naturally aligned # (aligned to their type-size), 0 otherwise. #