From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pj1-x1029.google.com (mail-pj1-x1029.google.com [IPv6:2607:f8b0:4864:20::1029]) by sourceware.org (Postfix) with ESMTPS id 5D7533858D1E for ; Fri, 10 Nov 2023 21:22:42 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 5D7533858D1E Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 5D7533858D1E Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::1029 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1699651365; cv=none; b=kMw6QpuzqD19xuQHvdU8RaFGlioEOS9oozokXNvxwWW/F5Sq6SfXO4/tkUxxozhayRw8BWeStHd2qsR48yj3a+euifrqlgNNToHQ7+KstqkY8i006txS22yEzhhrBSSrIyL2Y7jAFhTngGaoWsDOmTV3uMS1YM1jtDj4FGJbObc= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1699651365; c=relaxed/simple; bh=AJOnIgCrNp5KMbj/oe6nwAJ8RQX8eNfxKv7oM2iL3/0=; h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To; b=OBs65QZUgRKgYIUIrfA0lWnUt1VNxcU2Jnh+6R3FKfHby8z2CHus+twDcfRAH1PhBojcWP1i+ACFFojNfY3RxLw6QlfY2tcUeGEHRd5JKOopzfqBuRIAtcjVSD+oIw4cl0yyzt5YeOGXgCCkjreOg4IvFb21SWsrpFj3xS4yPJM= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-pj1-x1029.google.com with SMTP id 98e67ed59e1d1-28039ee1587so2120090a91.2 for ; Fri, 10 Nov 2023 13:22:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1699651361; x=1700256161; darn=gcc.gnu.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=L6B/MU1v8lOlqqfb7C9khJ+AF03WXlGNPglUztJUBRY=; b=LeKLecWpePUewlTc0cSubeAdi7tNtDXhdzDsztJ2OqX9zgWUEAvepolOTISkElB4VP +gBmjjtt89xDT0KKdpx04F3hLleyjlp/J+pFUerRgtJexjShCdfQskP5CBOTwHMyScsy AnPoMm0RKZGHPt9AX4seAqfh8LLpeuFL8phsZ8ZftdmBpu4nUUGMdcGrq5gqjaT0ttN0 UEMGHKp4iQQYZD9y2d1LEoLHZ7ZiqsQXV90ns2H4Fn81stORIobpkVlZTi3LCz8hZeSJ ZAKC4YALHExulU6muuavVP9m0RVa/2cSAYcLK2cnfwLhffLEgHPPabezKef2tJ0+wCfZ U8zg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1699651361; x=1700256161; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=L6B/MU1v8lOlqqfb7C9khJ+AF03WXlGNPglUztJUBRY=; b=n9dfKXISHnoFPw8Hozmj2fJ84N7MuDKlyhihi9SV4kISSKASYy7bxCTDX2ChEP7vcX yzqb9R+fd9Imbf9hxUBmbRLtH0yGD8HxB0rq4IO77Hh4DRzA8BzlFMr7bk7Nzjr675Yy 9Zrqa17m0cDkJJc3xwMb+NqjAr/q43TvNlE6HX6skQn3kSPhbhOsBhyWz80VRp1pZPpB KrBWtgJlsqErozi/YyKsf7d8k0ZHMr+oAGIG5hMPYurPDDwFmay2nkXqWhqIpq4WMd0n yz1EKQa16EPb+5O7SJfGSwD0pjqY/zsOMFze16xN3ARFUf28YdRYXUBcbVMpMdcaKniz 8dJg== X-Gm-Message-State: AOJu0Yw761fl4KhF93vVaLyM+iS2NFwlKvGI4fef/uNQ9XZxuvngMGzj 1UiSGxzv568xkH0cDz2OYB8OO1+IQwRSDye/e78= X-Google-Smtp-Source: AGHT+IGhEYOVlD1U4krTg22lnrIjG0zcFJhv0iljpNxBegFtzl1dMMm6b6OQHgwghsN3+MDmp6+RaCX2UojOwYdRY1I= X-Received: by 2002:a17:90b:1a91:b0:27d:166b:40f6 with SMTP id ng17-20020a17090b1a9100b0027d166b40f6mr208386pjb.41.1699651360944; Fri, 10 Nov 2023 13:22:40 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Andrew Pinski Date: Fri, 10 Nov 2023 13:22:28 -0800 Message-ID: Subject: Re: [PATCH v3 2/2]middle-end match.pd: optimize fneg (fabs (x)) to copysign (x, -1) [PR109154] To: Richard Biener Cc: Tamar Christina , Prathamesh Kulkarni , "gcc-patches@gcc.gnu.org" , nd , "jlaw@ventanamicro.com" Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-7.9 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,KAM_LOTSOFHASH,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE,WEIRD_PORT 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: On Fri, Nov 10, 2023 at 5:12=E2=80=AFAM Richard Biener = wrote: > > On Fri, 10 Nov 2023, Tamar Christina wrote: > > > > > Hi Prathamesh, > > > > Yes Arm requires SIMD for copysign. The testcases fail because they don= 't turn on Neon. > > > > I'll update them. > > On x86_64 with -m32 I see > > FAIL: gcc.dg/pr55152-2.c scan-tree-dump-times optimized ".COPYSIGN" 1 > FAIL: gcc.dg/pr55152-2.c scan-tree-dump-times optimized "ABS_EXPR" 1 > FAIL: gcc.dg/tree-ssa/abs-4.c scan-tree-dump-times optimized "=3D ABS_EXP= R" > 1 > FAIL: gcc.dg/tree-ssa/abs-4.c scan-tree-dump-times optimized "=3D -" 1 > FAIL: gcc.dg/tree-ssa/abs-4.c scan-tree-dump-times optimized "=3D .COPYSI= GN" > 2 > FAIL: gcc.dg/tree-ssa/backprop-6.c scan-tree-dump-times backprop > "Deleting[^\\\\n]* =3D -" 4 > FAIL: gcc.dg/tree-ssa/backprop-6.c scan-tree-dump-times backprop > "Deleting[^\\\\n]* =3D \\\\.COPYSIGN" 2 > FAIL: gcc.dg/tree-ssa/backprop-6.c scan-tree-dump-times backprop > "Deleting[^\\\\n]* =3D ABS_EXPR <" 1 > FAIL: gcc.dg/tree-ssa/phi-opt-24.c scan-tree-dump-not phiopt2 "if" > > maybe add a copysign effective target? I get the feeling that the internal function for copysign should not be a direct internal function for scalar modes and call expand_copysign instead when expanding. This will fix some if not all of the issues where COPYSIGN is now trying to show up. BY the way this is most likely PR 88786 (and PR 112468 and a few others). and PR 58797 . Thanks, Andrew > > > Regards, > > Tamar > > ________________________________ > > From: Prathamesh Kulkarni > > Sent: Friday, November 10, 2023 12:24 PM > > To: Tamar Christina > > Cc: gcc-patches@gcc.gnu.org ; nd ;= rguenther@suse.de ; jlaw@ventanamicro.com > > Subject: Re: [PATCH v3 2/2]middle-end match.pd: optimize fneg (fabs (x)= ) to copysign (x, -1) [PR109154] > > > > On Mon, 6 Nov 2023 at 15:50, Tamar Christina = wrote: > > > > > > Hi All, > > > > > > This patch transforms fneg (fabs (x)) into copysign (x, -1) which is = more > > > canonical and allows a target to expand this sequence efficiently. S= uch > > > sequences are common in scientific code working with gradients. > > > > > > There is an existing canonicalization of copysign (x, -1) to fneg (fa= bs (x)) > > > which I remove since this is a less efficient form. The testsuite is= also > > > updated in light of this. > > > > > > Bootstrapped Regtested on aarch64-none-linux-gnu and no issues. > > Hi Tamar, > > It seems the patch caused following regressions on arm: > > > > Running gcc:gcc.dg/dg.exp ... > > FAIL: gcc.dg/pr55152-2.c scan-tree-dump-times optimized ".COPYSIGN" 1 > > FAIL: gcc.dg/pr55152-2.c scan-tree-dump-times optimized "ABS_EXPR" 1 > > > > Running gcc:gcc.dg/tree-ssa/tree-ssa.exp ... > > FAIL: gcc.dg/tree-ssa/abs-4.c scan-tree-dump-times optimized "=3D -" 1 > > FAIL: gcc.dg/tree-ssa/abs-4.c scan-tree-dump-times optimized "=3D .COPY= SIGN" 2 > > FAIL: gcc.dg/tree-ssa/abs-4.c scan-tree-dump-times optimized "=3D ABS_E= XPR" 1 > > FAIL: gcc.dg/tree-ssa/backprop-6.c scan-tree-dump-times backprop > > "Deleting[^\\n]* =3D -" 4 > > FAIL: gcc.dg/tree-ssa/backprop-6.c scan-tree-dump-times backprop > > "Deleting[^\\n]* =3D ABS_EXPR <" 1 > > FAIL: gcc.dg/tree-ssa/backprop-6.c scan-tree-dump-times backprop > > "Deleting[^\\n]* =3D \\.COPYSIGN" 2 > > FAIL: gcc.dg/tree-ssa/copy-sign-2.c scan-tree-dump-times optimized ".CO= PYSIGN" 1 > > FAIL: gcc.dg/tree-ssa/copy-sign-2.c scan-tree-dump-times optimized "ABS= " 1 > > FAIL: gcc.dg/tree-ssa/mult-abs-2.c scan-tree-dump-times gimple ".COPYSI= GN" 4 > > FAIL: gcc.dg/tree-ssa/mult-abs-2.c scan-tree-dump-times gimple "ABS" 4 > > FAIL: gcc.dg/tree-ssa/phi-opt-24.c scan-tree-dump-not phiopt2 "if" > > Link to log files: > > https://ci.linaro.org/job/tcwg_gcc_check--master-arm-build/1240/artifac= t/artifacts/00-sumfiles/ > > > > Even for following test-case: > > double g (double a) > > { > > double t1 =3D fabs (a); > > double t2 =3D -t1; > > return t2; > > } > > > > It seems, the pattern gets applied but doesn't get eventually > > simplified to copysign(a, -1). > > forwprop dump shows: > > Applying pattern match.pd:1131, gimple-match-4.cc:4134 > > double g (double a) > > { > > double t2; > > double t1; > > > > : > > t1_2 =3D ABS_EXPR ; > > t2_3 =3D -t1_2; > > return t2_3; > > > > } > > > > while on x86_64: > > Applying pattern match.pd:1131, gimple-match-4.cc:4134 > > gimple_simplified to t2_3 =3D .COPYSIGN (a_1(D), -1.0e+0); > > Removing dead stmt:t1_2 =3D ABS_EXPR ; > > double g (double a) > > { > > double t2; > > double t1; > > > > : > > t2_3 =3D .COPYSIGN (a_1(D), -1.0e+0); > > return t2_3; > > > > } > > > > Thanks, > > Prathamesh > > > > > > > > > > Ok for master? > > > > > > Thanks, > > > Tamar > > > > > > gcc/ChangeLog: > > > > > > PR tree-optimization/109154 > > > * match.pd: Add new neg+abs rule, remove inverse copysign rul= e. > > > > > > gcc/testsuite/ChangeLog: > > > > > > PR tree-optimization/109154 > > > * gcc.dg/fold-copysign-1.c: Updated. > > > * gcc.dg/pr55152-2.c: Updated. > > > * gcc.dg/tree-ssa/abs-4.c: Updated. > > > * gcc.dg/tree-ssa/backprop-6.c: Updated. > > > * gcc.dg/tree-ssa/copy-sign-2.c: Updated. > > > * gcc.dg/tree-ssa/mult-abs-2.c: Updated. > > > * gcc.target/aarch64/fneg-abs_1.c: New test. > > > * gcc.target/aarch64/fneg-abs_2.c: New test. > > > * gcc.target/aarch64/fneg-abs_3.c: New test. > > > * gcc.target/aarch64/fneg-abs_4.c: New test. > > > * gcc.target/aarch64/sve/fneg-abs_1.c: New test. > > > * gcc.target/aarch64/sve/fneg-abs_2.c: New test. > > > * gcc.target/aarch64/sve/fneg-abs_3.c: New test. > > > * gcc.target/aarch64/sve/fneg-abs_4.c: New test. > > > > > > --- inline copy of patch -- > > > diff --git a/gcc/match.pd b/gcc/match.pd > > > index db95931df0672cf4ef08cca36085c3aa6831519e..7a023d510c283c43a87b1= 795a74761b8af979b53 100644 > > > --- a/gcc/match.pd > > > +++ b/gcc/match.pd > > > @@ -1106,13 +1106,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > > > (hypots @0 (copysigns @1 @2)) > > > (hypots @0 @1)))) > > > > > > -/* copysign(x, CST) -> [-]abs (x). */ > > > -(for copysigns (COPYSIGN_ALL) > > > - (simplify > > > - (copysigns @0 REAL_CST@1) > > > - (if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (@1))) > > > - (negate (abs @0)) > > > - (abs @0)))) > > > +/* Transform fneg (fabs (X)) -> copysign (X, -1). */ > > > + > > > +(simplify > > > + (negate (abs @0)) > > > + (IFN_COPYSIGN @0 { build_minus_one_cst (type); })) > > > > > > /* copysign(copysign(x, y), z) -> copysign(x, z). */ > > > (for copysigns (COPYSIGN_ALL) > > > diff --git a/gcc/testsuite/gcc.dg/fold-copysign-1.c b/gcc/testsuite/g= cc.dg/fold-copysign-1.c > > > index f17d65c24ee4dca9867827d040fe0a404c515e7b..f9cafd14ab05f5e8ab2f6= f68e62801d21c2df6a6 100644 > > > --- a/gcc/testsuite/gcc.dg/fold-copysign-1.c > > > +++ b/gcc/testsuite/gcc.dg/fold-copysign-1.c > > > @@ -12,5 +12,5 @@ double bar (double x) > > > return __builtin_copysign (x, minuszero); > > > } > > > > > > -/* { dg-final { scan-tree-dump-times "=3D -" 1 "cddce1" } } */ > > > -/* { dg-final { scan-tree-dump-times "=3D ABS_EXPR" 2 "cddce1" } } *= / > > > +/* { dg-final { scan-tree-dump-times "__builtin_copysign" 1 "cddce1"= } } */ > > > +/* { dg-final { scan-tree-dump-times "=3D ABS_EXPR" 1 "cddce1" } } *= / > > > diff --git a/gcc/testsuite/gcc.dg/pr55152-2.c b/gcc/testsuite/gcc.dg/= pr55152-2.c > > > index 54db0f2062da105a829d6690ac8ed9891fe2b588..605f202ed6bc7aa8fe921= 457b02ff0b88cc63ce6 100644 > > > --- a/gcc/testsuite/gcc.dg/pr55152-2.c > > > +++ b/gcc/testsuite/gcc.dg/pr55152-2.c > > > @@ -10,4 +10,5 @@ int f(int a) > > > return (a<-a)?a:-a; > > > } > > > > > > -/* { dg-final { scan-tree-dump-times "ABS_EXPR" 2 "optimized" } } */ > > > +/* { dg-final { scan-tree-dump-times "\.COPYSIGN" 1 "optimized" } } = */ > > > +/* { dg-final { scan-tree-dump-times "ABS_EXPR" 1 "optimized" } } */ > > > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/abs-4.c b/gcc/testsuite/gc= c.dg/tree-ssa/abs-4.c > > > index 6197519faf7b55aed7bc162cd0a14dd2145210ca..e1b825f37f69ac3c4666b= 3a52d733368805ad31d 100644 > > > --- a/gcc/testsuite/gcc.dg/tree-ssa/abs-4.c > > > +++ b/gcc/testsuite/gcc.dg/tree-ssa/abs-4.c > > > @@ -9,5 +9,6 @@ long double abs_ld(long double x) { return __builtin_= signbit(x) ? x : -x; } > > > > > > /* __builtin_signbit(x) ? x : -x. Should be convert into - ABS_EXP */ > > > /* { dg-final { scan-tree-dump-not "signbit" "optimized"} } */ > > > -/* { dg-final { scan-tree-dump-times "=3D ABS_EXPR" 3 "optimized"} }= */ > > > -/* { dg-final { scan-tree-dump-times "=3D -" 3 "optimized"} } */ > > > +/* { dg-final { scan-tree-dump-times "=3D ABS_EXPR" 1 "optimized"} }= */ > > > +/* { dg-final { scan-tree-dump-times "=3D -" 1 "optimized"} } */ > > > +/* { dg-final { scan-tree-dump-times "=3D \.COPYSIGN" 2 "optimized"}= } */ > > > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/backprop-6.c b/gcc/testsui= te/gcc.dg/tree-ssa/backprop-6.c > > > index 31f05716f1498dc709cac95fa20fb5796642c77e..c3a138642d6ff7be984e9= 1fa1343cb2718db7ae1 100644 > > > --- a/gcc/testsuite/gcc.dg/tree-ssa/backprop-6.c > > > +++ b/gcc/testsuite/gcc.dg/tree-ssa/backprop-6.c > > > @@ -26,5 +26,6 @@ TEST_FUNCTION (float, f) > > > TEST_FUNCTION (double, ) > > > TEST_FUNCTION (long double, l) > > > > > > -/* { dg-final { scan-tree-dump-times {Deleting[^\n]* =3D -} 6 "backp= rop" } } */ > > > -/* { dg-final { scan-tree-dump-times {Deleting[^\n]* =3D ABS_EXPR <}= 3 "backprop" } } */ > > > +/* { dg-final { scan-tree-dump-times {Deleting[^\n]* =3D -} 4 "backp= rop" } } */ > > > +/* { dg-final { scan-tree-dump-times {Deleting[^\n]* =3D \.COPYSIGN}= 2 "backprop" } } */ > > > +/* { dg-final { scan-tree-dump-times {Deleting[^\n]* =3D ABS_EXPR <}= 1 "backprop" } } */ > > > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/copy-sign-2.c b/gcc/testsu= ite/gcc.dg/tree-ssa/copy-sign-2.c > > > index de52c5f7c8062958353d91f5031193defc9f3f91..e5d565c4b9832c0010658= 8ef411fbd8c292a5cad 100644 > > > --- a/gcc/testsuite/gcc.dg/tree-ssa/copy-sign-2.c > > > +++ b/gcc/testsuite/gcc.dg/tree-ssa/copy-sign-2.c > > > @@ -10,4 +10,5 @@ float f1(float x) > > > float t =3D __builtin_copysignf (1.0f, -x); > > > return x * t; > > > } > > > -/* { dg-final { scan-tree-dump-times "ABS" 2 "optimized"} } */ > > > +/* { dg-final { scan-tree-dump-times "ABS" 1 "optimized"} } */ > > > +/* { dg-final { scan-tree-dump-times ".COPYSIGN" 1 "optimized"} } */ > > > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/mult-abs-2.c b/gcc/testsui= te/gcc.dg/tree-ssa/mult-abs-2.c > > > index a41f1baf25669a4fd301a586a49ba5e3c5b966ab..a22896b21c8b5a4d5d8e2= 8bd8ae0db896e63ade0 100644 > > > --- a/gcc/testsuite/gcc.dg/tree-ssa/mult-abs-2.c > > > +++ b/gcc/testsuite/gcc.dg/tree-ssa/mult-abs-2.c > > > @@ -34,4 +34,5 @@ float i1(float x) > > > { > > > return x * (x <=3D 0.f ? 1.f : -1.f); > > > } > > > -/* { dg-final { scan-tree-dump-times "ABS" 8 "gimple"} } */ > > > +/* { dg-final { scan-tree-dump-times "ABS" 4 "gimple"} } */ > > > +/* { dg-final { scan-tree-dump-times "\.COPYSIGN" 4 "gimple"} } */ > > > diff --git a/gcc/testsuite/gcc.target/aarch64/fneg-abs_1.c b/gcc/test= suite/gcc.target/aarch64/fneg-abs_1.c > > > new file mode 100644 > > > index 0000000000000000000000000000000000000000..f823013c3ddf6b3a266c3= abfcbf2642fc2a75fa6 > > > --- /dev/null > > > +++ b/gcc/testsuite/gcc.target/aarch64/fneg-abs_1.c > > > @@ -0,0 +1,39 @@ > > > +/* { dg-do compile } */ > > > +/* { dg-options "-O3" } */ > > > +/* { dg-final { check-function-bodies "**" "" "" { target lp64 } } }= */ > > > + > > > +#pragma GCC target "+nosve" > > > + > > > +#include > > > + > > > +/* > > > +** t1: > > > +** orr v[0-9]+.2s, #128, lsl #24 > > > +** ret > > > +*/ > > > +float32x2_t t1 (float32x2_t a) > > > +{ > > > + return vneg_f32 (vabs_f32 (a)); > > > +} > > > + > > > +/* > > > +** t2: > > > +** orr v[0-9]+.4s, #128, lsl #24 > > > +** ret > > > +*/ > > > +float32x4_t t2 (float32x4_t a) > > > +{ > > > + return vnegq_f32 (vabsq_f32 (a)); > > > +} > > > + > > > +/* > > > +** t3: > > > +** adrp x0, .LC[0-9]+ > > > +** ldr q[0-9]+, \[x0, #:lo12:.LC0\] > > > +** orr v[0-9]+.16b, v[0-9]+.16b, v[0-9]+.16b > > > +** ret > > > +*/ > > > +float64x2_t t3 (float64x2_t a) > > > +{ > > > + return vnegq_f64 (vabsq_f64 (a)); > > > +} > > > diff --git a/gcc/testsuite/gcc.target/aarch64/fneg-abs_2.c b/gcc/test= suite/gcc.target/aarch64/fneg-abs_2.c > > > new file mode 100644 > > > index 0000000000000000000000000000000000000000..141121176b309e4b2aa41= 3dc55271a6e3c93d5e1 > > > --- /dev/null > > > +++ b/gcc/testsuite/gcc.target/aarch64/fneg-abs_2.c > > > @@ -0,0 +1,31 @@ > > > +/* { dg-do compile } */ > > > +/* { dg-options "-O3" } */ > > > +/* { dg-final { check-function-bodies "**" "" "" { target lp64 } } }= */ > > > + > > > +#pragma GCC target "+nosve" > > > + > > > +#include > > > +#include > > > + > > > +/* > > > +** f1: > > > +** movi v[0-9]+.2s, 0x80, lsl 24 > > > +** orr v[0-9]+.8b, v[0-9]+.8b, v[0-9]+.8b > > > +** ret > > > +*/ > > > +float32_t f1 (float32_t a) > > > +{ > > > + return -fabsf (a); > > > +} > > > + > > > +/* > > > +** f2: > > > +** mov x0, -9223372036854775808 > > > +** fmov d[0-9]+, x0 > > > +** orr v[0-9]+.8b, v[0-9]+.8b, v[0-9]+.8b > > > +** ret > > > +*/ > > > +float64_t f2 (float64_t a) > > > +{ > > > + return -fabs (a); > > > +} > > > diff --git a/gcc/testsuite/gcc.target/aarch64/fneg-abs_3.c b/gcc/test= suite/gcc.target/aarch64/fneg-abs_3.c > > > new file mode 100644 > > > index 0000000000000000000000000000000000000000..b4652173a95d104ddfa70= c497f0627a61ea89d3b > > > --- /dev/null > > > +++ b/gcc/testsuite/gcc.target/aarch64/fneg-abs_3.c > > > @@ -0,0 +1,36 @@ > > > +/* { dg-do compile } */ > > > +/* { dg-options "-O3" } */ > > > +/* { dg-final { check-function-bodies "**" "" "" { target lp64 } } }= */ > > > + > > > +#pragma GCC target "+nosve" > > > + > > > +#include > > > +#include > > > + > > > +/* > > > +** f1: > > > +** ... > > > +** ldr q[0-9]+, \[x0\] > > > +** orr v[0-9]+.4s, #128, lsl #24 > > > +** str q[0-9]+, \[x0\], 16 > > > +** ... > > > +*/ > > > +void f1 (float32_t *a, int n) > > > +{ > > > + for (int i =3D 0; i < (n & -8); i++) > > > + a[i] =3D -fabsf (a[i]); > > > +} > > > + > > > +/* > > > +** f2: > > > +** ... > > > +** ldr q[0-9]+, \[x0\] > > > +** orr v[0-9]+.16b, v[0-9]+.16b, v[0-9]+.16b > > > +** str q[0-9]+, \[x0\], 16 > > > +** ... > > > +*/ > > > +void f2 (float64_t *a, int n) > > > +{ > > > + for (int i =3D 0; i < (n & -8); i++) > > > + a[i] =3D -fabs (a[i]); > > > +} > > > diff --git a/gcc/testsuite/gcc.target/aarch64/fneg-abs_4.c b/gcc/test= suite/gcc.target/aarch64/fneg-abs_4.c > > > new file mode 100644 > > > index 0000000000000000000000000000000000000000..10879dea74462d34b2616= 0eeb0bd54ead063166b > > > --- /dev/null > > > +++ b/gcc/testsuite/gcc.target/aarch64/fneg-abs_4.c > > > @@ -0,0 +1,39 @@ > > > +/* { dg-do compile } */ > > > +/* { dg-options "-O3" } */ > > > +/* { dg-final { check-function-bodies "**" "" "" { target lp64 } } }= */ > > > + > > > +#pragma GCC target "+nosve" > > > + > > > +#include > > > + > > > +/* > > > +** negabs: > > > +** mov x0, -9223372036854775808 > > > +** fmov d[0-9]+, x0 > > > +** orr v[0-9]+.8b, v[0-9]+.8b, v[0-9]+.8b > > > +** ret > > > +*/ > > > +double negabs (double x) > > > +{ > > > + unsigned long long y; > > > + memcpy (&y, &x, sizeof(double)); > > > + y =3D y | (1UL << 63); > > > + memcpy (&x, &y, sizeof(double)); > > > + return x; > > > +} > > > + > > > +/* > > > +** negabsf: > > > +** movi v[0-9]+.2s, 0x80, lsl 24 > > > +** orr v[0-9]+.8b, v[0-9]+.8b, v[0-9]+.8b > > > +** ret > > > +*/ > > > +float negabsf (float x) > > > +{ > > > + unsigned int y; > > > + memcpy (&y, &x, sizeof(float)); > > > + y =3D y | (1U << 31); > > > + memcpy (&x, &y, sizeof(float)); > > > + return x; > > > +} > > > + > > > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/fneg-abs_1.c b/gcc/= testsuite/gcc.target/aarch64/sve/fneg-abs_1.c > > > new file mode 100644 > > > index 0000000000000000000000000000000000000000..0c7664e6de77a49768295= 2653ffd417453854d52 > > > --- /dev/null > > > +++ b/gcc/testsuite/gcc.target/aarch64/sve/fneg-abs_1.c > > > @@ -0,0 +1,37 @@ > > > +/* { dg-do compile } */ > > > +/* { dg-options "-O3" } */ > > > +/* { dg-final { check-function-bodies "**" "" "" { target lp64 } } }= */ > > > + > > > +#include > > > + > > > +/* > > > +** t1: > > > +** orr v[0-9]+.2s, #128, lsl #24 > > > +** ret > > > +*/ > > > +float32x2_t t1 (float32x2_t a) > > > +{ > > > + return vneg_f32 (vabs_f32 (a)); > > > +} > > > + > > > +/* > > > +** t2: > > > +** orr v[0-9]+.4s, #128, lsl #24 > > > +** ret > > > +*/ > > > +float32x4_t t2 (float32x4_t a) > > > +{ > > > + return vnegq_f32 (vabsq_f32 (a)); > > > +} > > > + > > > +/* > > > +** t3: > > > +** adrp x0, .LC[0-9]+ > > > +** ldr q[0-9]+, \[x0, #:lo12:.LC0\] > > > +** orr v[0-9]+.16b, v[0-9]+.16b, v[0-9]+.16b > > > +** ret > > > +*/ > > > +float64x2_t t3 (float64x2_t a) > > > +{ > > > + return vnegq_f64 (vabsq_f64 (a)); > > > +} > > > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/fneg-abs_2.c b/gcc/= testsuite/gcc.target/aarch64/sve/fneg-abs_2.c > > > new file mode 100644 > > > index 0000000000000000000000000000000000000000..a60cd31b9294af2dac69e= ed1c93f899bd5c78fca > > > --- /dev/null > > > +++ b/gcc/testsuite/gcc.target/aarch64/sve/fneg-abs_2.c > > > @@ -0,0 +1,29 @@ > > > +/* { dg-do compile } */ > > > +/* { dg-options "-O3" } */ > > > +/* { dg-final { check-function-bodies "**" "" "" { target lp64 } } }= */ > > > + > > > +#include > > > +#include > > > + > > > +/* > > > +** f1: > > > +** movi v[0-9]+.2s, 0x80, lsl 24 > > > +** orr v[0-9]+.8b, v[0-9]+.8b, v[0-9]+.8b > > > +** ret > > > +*/ > > > +float32_t f1 (float32_t a) > > > +{ > > > + return -fabsf (a); > > > +} > > > + > > > +/* > > > +** f2: > > > +** mov x0, -9223372036854775808 > > > +** fmov d[0-9]+, x0 > > > +** orr v[0-9]+.8b, v[0-9]+.8b, v[0-9]+.8b > > > +** ret > > > +*/ > > > +float64_t f2 (float64_t a) > > > +{ > > > + return -fabs (a); > > > +} > > > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/fneg-abs_3.c b/gcc/= testsuite/gcc.target/aarch64/sve/fneg-abs_3.c > > > new file mode 100644 > > > index 0000000000000000000000000000000000000000..1bf34328d8841de8e6b0a= 5458562a9f00e31c275 > > > --- /dev/null > > > +++ b/gcc/testsuite/gcc.target/aarch64/sve/fneg-abs_3.c > > > @@ -0,0 +1,34 @@ > > > +/* { dg-do compile } */ > > > +/* { dg-options "-O3" } */ > > > +/* { dg-final { check-function-bodies "**" "" "" { target lp64 } } }= */ > > > + > > > +#include > > > +#include > > > + > > > +/* > > > +** f1: > > > +** ... > > > +** ld1w z[0-9]+.s, p[0-9]+/z, \[x0, x2, lsl 2\] > > > +** orr z[0-9]+.s, z[0-9]+.s, #0x80000000 > > > +** st1w z[0-9]+.s, p[0-9]+, \[x0, x2, lsl 2\] > > > +** ... > > > +*/ > > > +void f1 (float32_t *a, int n) > > > +{ > > > + for (int i =3D 0; i < (n & -8); i++) > > > + a[i] =3D -fabsf (a[i]); > > > +} > > > + > > > +/* > > > +** f2: > > > +** ... > > > +** ld1d z[0-9]+.d, p[0-9]+/z, \[x0, x2, lsl 3\] > > > +** orr z[0-9]+.d, z[0-9]+.d, #0x8000000000000000 > > > +** st1d z[0-9]+.d, p[0-9]+, \[x0, x2, lsl 3\] > > > +** ... > > > +*/ > > > +void f2 (float64_t *a, int n) > > > +{ > > > + for (int i =3D 0; i < (n & -8); i++) > > > + a[i] =3D -fabs (a[i]); > > > +} > > > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/fneg-abs_4.c b/gcc/= testsuite/gcc.target/aarch64/sve/fneg-abs_4.c > > > new file mode 100644 > > > index 0000000000000000000000000000000000000000..21f2a8da2a5d44e3d01f6= 604ca7be87e3744d494 > > > --- /dev/null > > > +++ b/gcc/testsuite/gcc.target/aarch64/sve/fneg-abs_4.c > > > @@ -0,0 +1,37 @@ > > > +/* { dg-do compile } */ > > > +/* { dg-options "-O3" } */ > > > +/* { dg-final { check-function-bodies "**" "" "" { target lp64 } } }= */ > > > + > > > +#include > > > + > > > +/* > > > +** negabs: > > > +** mov x0, -9223372036854775808 > > > +** fmov d[0-9]+, x0 > > > +** orr v[0-9]+.8b, v[0-9]+.8b, v[0-9]+.8b > > > +** ret > > > +*/ > > > +double negabs (double x) > > > +{ > > > + unsigned long long y; > > > + memcpy (&y, &x, sizeof(double)); > > > + y =3D y | (1UL << 63); > > > + memcpy (&x, &y, sizeof(double)); > > > + return x; > > > +} > > > + > > > +/* > > > +** negabsf: > > > +** movi v[0-9]+.2s, 0x80, lsl 24 > > > +** orr v[0-9]+.8b, v[0-9]+.8b, v[0-9]+.8b > > > +** ret > > > +*/ > > > +float negabsf (float x) > > > +{ > > > + unsigned int y; > > > + memcpy (&y, &x, sizeof(float)); > > > + y =3D y | (1U << 31); > > > + memcpy (&x, &y, sizeof(float)); > > > + return x; > > > +} > > > + > > > > > > > > > > > > > > > -- > > > > -- > Richard Biener > SUSE Software Solutions Germany GmbH, > Frankenstrasse 146, 90461 Nuernberg, Germany; > GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg= )