From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ua1-x930.google.com (mail-ua1-x930.google.com [IPv6:2607:f8b0:4864:20::930]) by sourceware.org (Postfix) with ESMTPS id 99E633858C54 for ; Tue, 20 Jun 2023 13:21:06 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 99E633858C54 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=cs.washington.edu Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=cs.washington.edu Received: by mail-ua1-x930.google.com with SMTP id a1e0cc1a2514c-78701841ccbso1709371241.2 for ; Tue, 20 Jun 2023 06:21:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cs.washington.edu; s=goo201206; t=1687267266; x=1689859266; 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=nvyt+/XbUguoidm2Ixl/cfYUVtczzBqQ5H7pIjOtKxk=; b=iS6JzW09RN28aVvM7sGbMSitoh0X1gME0vpSj7xFS58AePNdFIPtKvwnN27S3EA9ar YHaN973xH/UZtUzWzqA2YcKRo12kAvD6UVm2eKzFbchliEbS2S/SWORRyhbVRVr4hS11 tzwv5GIDCzJpO+JM0kANMx94l8F1kVRGYQOO4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687267266; x=1689859266; 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=nvyt+/XbUguoidm2Ixl/cfYUVtczzBqQ5H7pIjOtKxk=; b=OMkzXflrvmahEthHw/RYpqMYSYfbllB+BCuA4NT1pcJgaSX74G4mzWLlp0HR2W6wPo rW4V1BV6Fj1G9vpDoH3MF1SiguXgQsM9vTOXlePNEho3Y1NF/9X4yOAjBLu6o6ScHh2j aYKlGmc4pRbZ8pqUCRnWCFmQB1qZfiSDDXdA9tgCCEC/FoVixc6ftjZLZxvyOfYIII3C OORIs6lH/SxWxGDAa0f91U99JXQqdZ3YUbrmKYlZS6Ek32v0QzBdCtVZehOgULKEt7en Kgir54ZEH/gitdAaqbBzLmPjAGsR98sKqABTFPFr8/1/KPs+zAWiB25wNEGnpOLDn4+A Dggw== X-Gm-Message-State: AC+VfDxIY88FreJKyxFqN5NdMXrT2NvH4axYq+VjwMeLatcmJsKka9K3 AJjfXh5Lf9YD9JpIua5QkhoWXYuTkk6dq256gtdZ48jMvFMfy38xN30vig== X-Google-Smtp-Source: ACHHUZ7omZGoJQ6aqIx5KCTDWsf3qhw8wutReOlsBcVZzuez+7EpS//k9C5ZDFMzyFyt9+gOxRJXYAmcqwPAcFhh4yo= X-Received: by 2002:a05:6102:98:b0:440:ad55:a589 with SMTP id t24-20020a056102009800b00440ad55a589mr3183985vsp.12.1687267265762; Tue, 20 Jun 2023 06:21:05 -0700 (PDT) MIME-Version: 1.0 References: <20230615122129.20213-1-kmatsui@cs.washington.edu> In-Reply-To: From: Ken Matsui Date: Tue, 20 Jun 2023 06:20:50 -0700 Message-ID: Subject: Re: [PATCH 1/2] c++: implement __remove_pointer built-in trait To: gcc-patches@gcc.gnu.org Cc: "libstdc++" Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-12.5 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Just a quick update, the benchmark code link has been updated and can now be accessed at https://github.com/ken-matsui/gcc-benches/blob/main/remove_pointer.cc. I have also created a report file which can be found at https://github.com/ken-matsui/gcc-benches/blob/main/remove_pointer.md. On Sat, Jun 17, 2023 at 5:35=E2=80=AFAM Ken Matsui wrote: > > Hi, > > I conducted a benchmark for remove_pointer as well as is_object. Just > like the is_object benchmark, here is the benchmark code: > > https://github.com/ken-matsui/gcc-benches/blob/main/remove_pointer_benchm= ark.cc > > On my computer, using the gcc HEAD of this patch for a release build, > the patch with -DUSE_BUILTIN took 8.7% less time and used 4.3-4.9% > less memory on average compared to not using it. Although the > performance improvement was not as significant as with is_object, the > benchmark demonstrated that the compilation was consistently more > efficient. > > Sincerely, > Ken Matsui > > On Thu, Jun 15, 2023 at 5:22=E2=80=AFAM Ken Matsui wrote: > > > > This patch implements built-in trait for std::remove_pointer. > > > > gcc/cp/ChangeLog: > > > > * cp-trait.def: Define __remove_pointer. > > * semantics.cc (finish_trait_type): Handle CPTK_REMOVE_POINTER. > > > > gcc/testsuite/ChangeLog: > > > > * g++.dg/ext/has-builtin-1.C: Test existence of __remove_pointe= r. > > * g++.dg/ext/remove_pointer.C: New test. > > > > Signed-off-by: Ken Matsui > > --- > > gcc/cp/cp-trait.def | 1 + > > gcc/cp/semantics.cc | 4 ++ > > gcc/testsuite/g++.dg/ext/has-builtin-1.C | 3 ++ > > gcc/testsuite/g++.dg/ext/remove_pointer.C | 51 +++++++++++++++++++++++ > > 4 files changed, 59 insertions(+) > > create mode 100644 gcc/testsuite/g++.dg/ext/remove_pointer.C > > > > diff --git a/gcc/cp/cp-trait.def b/gcc/cp/cp-trait.def > > index 8b7fece0cc8..07823e55579 100644 > > --- a/gcc/cp/cp-trait.def > > +++ b/gcc/cp/cp-trait.def > > @@ -90,6 +90,7 @@ DEFTRAIT_EXPR (IS_DEDUCIBLE, "__is_deducible ", 2) > > DEFTRAIT_TYPE (REMOVE_CV, "__remove_cv", 1) > > DEFTRAIT_TYPE (REMOVE_REFERENCE, "__remove_reference", 1) > > DEFTRAIT_TYPE (REMOVE_CVREF, "__remove_cvref", 1) > > +DEFTRAIT_TYPE (REMOVE_POINTER, "__remove_pointer", 1) > > DEFTRAIT_TYPE (UNDERLYING_TYPE, "__underlying_type", 1) > > DEFTRAIT_TYPE (TYPE_PACK_ELEMENT, "__type_pack_element", -1) > > > > diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc > > index 8fb47fd179e..885c7a6fb64 100644 > > --- a/gcc/cp/semantics.cc > > +++ b/gcc/cp/semantics.cc > > @@ -12373,6 +12373,10 @@ finish_trait_type (cp_trait_kind kind, tree ty= pe1, tree type2, > > if (TYPE_REF_P (type1)) > > type1 =3D TREE_TYPE (type1); > > return cv_unqualified (type1); > > + case CPTK_REMOVE_POINTER: > > + if (TYPE_PTR_P (type1)) > > + type1 =3D TREE_TYPE (type1); > > + return type1; > > > > case CPTK_TYPE_PACK_ELEMENT: > > return finish_type_pack_element (type1, type2, complain); > > diff --git a/gcc/testsuite/g++.dg/ext/has-builtin-1.C b/gcc/testsuite/g= ++.dg/ext/has-builtin-1.C > > index f343e153e56..e21e0a95509 100644 > > --- a/gcc/testsuite/g++.dg/ext/has-builtin-1.C > > +++ b/gcc/testsuite/g++.dg/ext/has-builtin-1.C > > @@ -146,3 +146,6 @@ > > #if !__has_builtin (__remove_cvref) > > # error "__has_builtin (__remove_cvref) failed" > > #endif > > +#if !__has_builtin (__remove_pointer) > > +# error "__has_builtin (__remove_pointer) failed" > > +#endif > > diff --git a/gcc/testsuite/g++.dg/ext/remove_pointer.C b/gcc/testsuite/= g++.dg/ext/remove_pointer.C > > new file mode 100644 > > index 00000000000..7b13db93950 > > --- /dev/null > > +++ b/gcc/testsuite/g++.dg/ext/remove_pointer.C > > @@ -0,0 +1,51 @@ > > +// { dg-do compile { target c++11 } } > > + > > +#define SA(X) static_assert((X),#X) > > + > > +SA(__is_same(__remove_pointer(int), int)); > > +SA(__is_same(__remove_pointer(int*), int)); > > +SA(__is_same(__remove_pointer(int**), int*)); > > + > > +SA(__is_same(__remove_pointer(const int*), const int)); > > +SA(__is_same(__remove_pointer(const int**), const int*)); > > +SA(__is_same(__remove_pointer(int* const), int)); > > +SA(__is_same(__remove_pointer(int** const), int*)); > > +SA(__is_same(__remove_pointer(int* const* const), int* const)); > > + > > +SA(__is_same(__remove_pointer(volatile int*), volatile int)); > > +SA(__is_same(__remove_pointer(volatile int**), volatile int*)); > > +SA(__is_same(__remove_pointer(int* volatile), int)); > > +SA(__is_same(__remove_pointer(int** volatile), int*)); > > +SA(__is_same(__remove_pointer(int* volatile* volatile), int* volatile)= ); > > + > > +SA(__is_same(__remove_pointer(const volatile int*), const volatile int= )); > > +SA(__is_same(__remove_pointer(const volatile int**), const volatile in= t*)); > > +SA(__is_same(__remove_pointer(const int* volatile), const int)); > > +SA(__is_same(__remove_pointer(volatile int* const), volatile int)); > > +SA(__is_same(__remove_pointer(int* const volatile), int)); > > +SA(__is_same(__remove_pointer(const int** volatile), const int*)); > > +SA(__is_same(__remove_pointer(volatile int** const), volatile int*)); > > +SA(__is_same(__remove_pointer(int** const volatile), int*)); > > +SA(__is_same(__remove_pointer(int* const* const volatile), int* const)= ); > > +SA(__is_same(__remove_pointer(int* volatile* const volatile), int* vol= atile)); > > +SA(__is_same(__remove_pointer(int* const volatile* const volatile), in= t* const volatile)); > > + > > +SA(__is_same(__remove_pointer(int&), int&)); > > +SA(__is_same(__remove_pointer(const int&), const int&)); > > +SA(__is_same(__remove_pointer(volatile int&), volatile int&)); > > +SA(__is_same(__remove_pointer(const volatile int&), const volatile int= &)); > > + > > +SA(__is_same(__remove_pointer(int&&), int&&)); > > +SA(__is_same(__remove_pointer(const int&&), const int&&)); > > +SA(__is_same(__remove_pointer(volatile int&&), volatile int&&)); > > +SA(__is_same(__remove_pointer(const volatile int&&), const volatile in= t&&)); > > + > > +SA(__is_same(__remove_pointer(int[3]), int[3])); > > +SA(__is_same(__remove_pointer(const int[3]), const int[3])); > > +SA(__is_same(__remove_pointer(volatile int[3]), volatile int[3])); > > +SA(__is_same(__remove_pointer(const volatile int[3]), const volatile i= nt[3])); > > + > > +SA(__is_same(__remove_pointer(int(int)), int(int))); > > +SA(__is_same(__remove_pointer(int(*const)(int)), int(int))); > > +SA(__is_same(__remove_pointer(int(*volatile)(int)), int(int))); > > +SA(__is_same(__remove_pointer(int(*const volatile)(int)), int(int))); > > -- > > 2.41.0 > >