From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lf1-x12d.google.com (mail-lf1-x12d.google.com [IPv6:2a00:1450:4864:20::12d]) by sourceware.org (Postfix) with ESMTPS id 37D0E384AB5A for ; Thu, 16 May 2024 08:15:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 37D0E384AB5A 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 37D0E384AB5A Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::12d ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715847332; cv=none; b=ngVc0558hOzyb/RCYQ3NSPbte+0mWN71E+7RnFGigc1G1NSgTkCXbCvT0LDH/iqHxWgZX9idW7OHCpZWUkqFmjzXrZRLbEEzRtUmOx02sl4cuPgaQlT6IJrdnUguvIOsPJo+T1NupQFO2KwiReFIS6/Xh9fWDjsymHXQGJK/VDs= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715847332; c=relaxed/simple; bh=srGmuLUaYaD9avVhLnrDGwVb78Y5NmvkYDa/Wz2w64I=; h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To; b=IYeenToR0MKJsQoiBcH7xuvDQZ0/FLJtCUwWQ+568Er2Kfa6R7G4GDYM2l7xY3jTBeB1t7GRYGo7clUSBfZF01Q84vBWzJXHVKOtlOr+jNmI9EF5GqbBOXcNpCKm1Zs4I1ZSxvDsODKi/g25RWqWdwd1DY8jCcVplqrnUgsO+cM= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-lf1-x12d.google.com with SMTP id 2adb3069b0e04-52327368e59so494212e87.1 for ; Thu, 16 May 2024 01:15:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1715847326; x=1716452126; 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=oX6DSSan1mFHJJhDTMPGwVN0zmzogneJVHJBwxaAoIQ=; b=kgb6vrLEwP231o9aiNlNMH7g9Necuowp5dfiLD2Mi1z/tnAFQfpTB1ef9YT+CeuvS+ G1rJpw3tBfRaYhBWmJK2eGe4HvkEoCDw8fCFU8Z08iPVMVSfRWFSGJd5b0SfC4ltW+lA WXOm+ls7SsdmR5f7EUxXNtjAl0a2XsNp7FYNV6Ch1S9KIcopzS+ODtJnxKYRHvhLJ/Er YSodjM4YF2q7kUL7YrO6CJ+EBZf97NKvl6xJVD0/XA9Qo2UHNrtDSySf9Lz63fMtisO7 4TzsBP37vyoPDfiMC39lvwa0bkm00zHv7RvAFZPPQxXqVQbeA5zUYHoFuoVJCJUShnWP ABHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715847326; x=1716452126; 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=oX6DSSan1mFHJJhDTMPGwVN0zmzogneJVHJBwxaAoIQ=; b=QgyVL0l1bl13cTreQZSO54q7qi078TwLxyvgakVXoPfPLnoJVaeX07KxyiL4KVgYbR epirAdoKdXZLuz2NQcISx1B//fBC1Kv+/CUtkZ4jxGa0hECWjyhRTNSui3fEsrnrEl92 4KPeHwuxX89Lz8cINJAVRt27P1FiRdZk4kY7RAmZCWzl3CP7kuZ0EORxbDm5mONAreK8 IWk6qTjIM9zMb+INk+yw1Wh6BeKbGOCKf4ZGmZ4u8wB0QK758JzVZ+wnEs6qlgFeI7h8 sI96ry9osEaVdx6c2MKpdjgOD9CgyEGx9DlVKp1kHsy+u0JzyaLDBlWYLVvaZcy9CCrd CryQ== X-Gm-Message-State: AOJu0YyGKrMG09LYbxVaML92lABjywHMDt5df6OBhR0LEIl7beXw/IuA GBijvHnxPYO6V4Oyn0DlVgEFa4GZh7JxbSAjalafIb+e7EB2OduMl8qt4uhjFDCrlDRcMktMGzW D/L/T2f8PCwbWMpf8rZ/22RyD84A= X-Google-Smtp-Source: AGHT+IGRAtzxvJmdrDl/vE6+g5z7U40T/WThbDiUBcvGx2qEcMkJ8FH4EtDxr+YQ4c4Yq0xKqlH27SLtHWQIxNWLUfs= X-Received: by 2002:a19:f50b:0:b0:51c:6c59:627e with SMTP id 2adb3069b0e04-52210074a34mr10712355e87.42.1715847326207; Thu, 16 May 2024 01:15:26 -0700 (PDT) MIME-Version: 1.0 References: <20240423103336.4024491-1-manolis.tsamis@vrull.eu> In-Reply-To: From: Richard Biener Date: Thu, 16 May 2024 10:15:15 +0200 Message-ID: Subject: Re: [PATCH] MATCH: Maybe expand (T)(A + C1) * C2 and (T)(A + C1) * C2 + C3 [PR109393] To: Manolis Tsamis Cc: gcc-patches@gcc.gnu.org, Richard Biener , Jiangning Liu , Philipp Tomsich , Andrew Pinski 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,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,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: On Tue, May 14, 2024 at 10:58=E2=80=AFAM Manolis Tsamis wrote: > > New patch with the requested changes can be found below. > > I don't know how much this affects SCEV, but I do believe that we > should incorporate this change somehow. I've seen various cases of > suboptimal address calculation codegen that boil down to this. This misses the ChangeLog (I assume it's unchanged) and indent of the match.pd part is now off. Please fix that, the patch is OK with that change. Thanks, Richard. > gcc/match.pd | 31 +++++++++++++++++++++++++++++++ > gcc/testsuite/gcc.dg/pr109393.c | 16 ++++++++++++++++ > 2 files changed, 47 insertions(+) > create mode 100644 gcc/testsuite/gcc.dg/pr109393.c > > diff --git a/gcc/match.pd b/gcc/match.pd > index 07e743ae464..1d642c205f0 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -3650,6 +3650,37 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (plus (convert @0) (op @2 (convert @1)))))) > #endif > +/* ((T)(A + CST1)) * CST2 + CST3 > + -> ((T)(A) * CST2) + ((T)CST1 * CST2 + CST3) > + Where (A + CST1) doesn't need to have a single use. */ > +#if GIMPLE > + (for op (plus minus) > + (simplify > + (plus (mult:s (convert:s (op @0 INTEGER_CST@1)) INTEGER_CST@2) > + INTEGER_CST@3) > + (if (INTEGRAL_TYPE_P (TREE_TYPE (@0)) > + && INTEGRAL_TYPE_P (type) > + && TYPE_PRECISION (type) > TYPE_PRECISION (TREE_TYPE (@0)) > + && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0)) > + && !TYPE_OVERFLOW_SANITIZED (TREE_TYPE (@0)) > + && TYPE_OVERFLOW_WRAPS (type)) > + (op (mult (convert @0) @2) (plus (mult (convert @1) @2) @3))))) > +#endif > + > +/* ((T)(A + CST1)) * CST2 -> ((T)(A) * CST2) + ((T)CST1 * CST2) */ > +#if GIMPLE > + (for op (plus minus) > + (simplify > + (mult (convert:s (op:s @0 INTEGER_CST@1)) INTEGER_CST@2) > + (if (INTEGRAL_TYPE_P (TREE_TYPE (@0)) > + && INTEGRAL_TYPE_P (type) > + && TYPE_PRECISION (type) > TYPE_PRECISION (TREE_TYPE (@0)) > + && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0)) > + && !TYPE_OVERFLOW_SANITIZED (TREE_TYPE (@0)) > + && TYPE_OVERFLOW_WRAPS (type)) > + (op (mult (convert @0) @2) (mult (convert @1) @2))))) > +#endif > + > /* (T)(A) +- (T)(B) -> (T)(A +- B) only when (A +- B) could be simplified > to a simple value. */ > (for op (plus minus) > diff --git a/gcc/testsuite/gcc.dg/pr109393.c b/gcc/testsuite/gcc.dg/pr109= 393.c > new file mode 100644 > index 00000000000..e9051273672 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/pr109393.c > @@ -0,0 +1,16 @@ > +/* PR tree-optimization/109393 */ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > +/* { dg-final { scan-tree-dump-times "return 1;" 2 "optimized" } } */ > + > +int foo(int *a, int j) > +{ > + int k =3D j - 1; > + return a[j - 1] =3D=3D a[k]; > +} > + > +int bar(int *a, int j) > +{ > + int k =3D j - 1; > + return (&a[j + 1] - 2) =3D=3D &a[k]; > +} > -- > 2.44.0 > > > On Tue, Apr 23, 2024 at 1:33=E2=80=AFPM Manolis Tsamis wrote: > > > > The original motivation for this pattern was that the following functio= n does > > not fold to 'return 1': > > > > int foo(int *a, int j) > > { > > int k =3D j - 1; > > return a[j - 1] =3D=3D a[k]; > > } > > > > The expression ((unsigned long) (X +- C1) * C2) appears frequently as p= art of > > address calculations (e.g. arrays). These patterns help fold and simpli= fy more > > expressions. > > > > PR tree-optimization/109393 > > > > gcc/ChangeLog: > > > > * match.pd: Add new patterns for ((T)(A +- CST1)) * CST2 and > > ((T)(A +- CST1)) * CST2 + CST3. > > > > gcc/testsuite/ChangeLog: > > > > * gcc.dg/pr109393.c: New test. > > > > Signed-off-by: Manolis Tsamis > > --- > > > > gcc/match.pd | 30 ++++++++++++++++++++++++++++++ > > gcc/testsuite/gcc.dg/pr109393.c | 16 ++++++++++++++++ > > 2 files changed, 46 insertions(+) > > create mode 100644 gcc/testsuite/gcc.dg/pr109393.c > > > > diff --git a/gcc/match.pd b/gcc/match.pd > > index d401e7503e6..13c828ba70d 100644 > > --- a/gcc/match.pd > > +++ b/gcc/match.pd > > @@ -3650,6 +3650,36 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > > (plus (convert @0) (op @2 (convert @1)))))) > > #endif > > > > +/* ((T)(A + CST1)) * CST2 + CST3 > > + -> ((T)(A) * CST2) + ((T)CST1 * CST2 + CST3) > > + Where (A + CST1) doesn't need to have a single use. */ > > +#if GIMPLE > > + (for op (plus minus) > > + (simplify > > + (plus (mult (convert:s (op @0 INTEGER_CST@1)) INTEGER_CST@2) INTEG= ER_CST@3) > > + (if (TREE_CODE (TREE_TYPE (@0)) =3D=3D INTEGER_TYPE > > + && TREE_CODE (type) =3D=3D INTEGER_TYPE > > + && TYPE_PRECISION (type) > TYPE_PRECISION (TREE_TYPE (@0)) > > + && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0)) > > + && !TYPE_OVERFLOW_SANITIZED (TREE_TYPE (@0)) > > + && TYPE_OVERFLOW_WRAPS (type)) > > + (op (mult @2 (convert @0)) (plus (mult @2 (convert @1)) @3))))) > > +#endif > > + > > +/* ((T)(A + CST1)) * CST2 -> ((T)(A) * CST2) + ((T)CST1 * CST2) */ > > +#if GIMPLE > > + (for op (plus minus) > > + (simplify > > + (mult (convert:s (op:s @0 INTEGER_CST@1)) INTEGER_CST@2) > > + (if (TREE_CODE (TREE_TYPE (@0)) =3D=3D INTEGER_TYPE > > + && TREE_CODE (type) =3D=3D INTEGER_TYPE > > + && TYPE_PRECISION (type) > TYPE_PRECISION (TREE_TYPE (@0)) > > + && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0)) > > + && !TYPE_OVERFLOW_SANITIZED (TREE_TYPE (@0)) > > + && TYPE_OVERFLOW_WRAPS (type)) > > + (op (mult @2 (convert @0)) (mult @2 (convert @1)))))) > > +#endif > > + > > /* (T)(A) +- (T)(B) -> (T)(A +- B) only when (A +- B) could be simplif= ied > > to a simple value. */ > > (for op (plus minus) > > diff --git a/gcc/testsuite/gcc.dg/pr109393.c b/gcc/testsuite/gcc.dg/pr1= 09393.c > > new file mode 100644 > > index 00000000000..e9051273672 > > --- /dev/null > > +++ b/gcc/testsuite/gcc.dg/pr109393.c > > @@ -0,0 +1,16 @@ > > +/* PR tree-optimization/109393 */ > > +/* { dg-do compile } */ > > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > > +/* { dg-final { scan-tree-dump-times "return 1;" 2 "optimized" } } */ > > + > > +int foo(int *a, int j) > > +{ > > + int k =3D j - 1; > > + return a[j - 1] =3D=3D a[k]; > > +} > > + > > +int bar(int *a, int j) > > +{ > > + int k =3D j - 1; > > + return (&a[j + 1] - 2) =3D=3D &a[k]; > > +} > > -- > > 2.34.1 > >