From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lf1-x12e.google.com (mail-lf1-x12e.google.com [IPv6:2a00:1450:4864:20::12e]) by sourceware.org (Postfix) with ESMTPS id F2FF93858039 for ; Mon, 1 Feb 2021 23:00:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org F2FF93858039 Received: by mail-lf1-x12e.google.com with SMTP id p21so25177164lfu.11 for ; Mon, 01 Feb 2021 15:00:34 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=+Iwwr3JcnnLtR3map+IK7K+5CkVRI0Ce4trxScn48eU=; b=LFU4nsq9MhMNDFAxwJPQJoyTaZl6qc9u72h8YIcSSS2u3KQgCEZdUsah/jk+o4Q8wW j4K916vlwd21K5Gly6vMRaJbZb9YLEJnIS5rUCneuPxgC9I4CW6VrjSRQ76bhEj1VtF9 rCg9nwTRsV/Hu3FNXR4JM/cnF83sQeK8od0MIp4ppo3HTW45+IhVRoS2EPb1ZUOJ6CUI zU0Blw/Vr+QpbfUg+YN04P5i8O+ZAyFALUpmo4RFY2UNweoC31UjrNlLWTQq+tR90hVT AZ2hGkcN5II9tU5EL94AEkdyP+jzovHon1QdGDL+ranPR2lLGJSf/lLZ//AhDxEdg8M8 KXHg== X-Gm-Message-State: AOAM532hwaqx/iHJregMFU8AW6V48BD4ginOUumqR2ru0WsssiQcgW9/ FhxhFZYsN4rgi7mVP/FBr9LaqLHlHhRoRg== X-Google-Smtp-Source: ABdhPJxWho991PSxhGlWwO99P85GqnMz6lACNHFHRRRyjNhC77S6VgK81xsLKh1hJ4+p+B8utG2iHw== X-Received: by 2002:ac2:5cd3:: with SMTP id f19mr9588149lfq.52.1612220432897; Mon, 01 Feb 2021 15:00:32 -0800 (PST) Received: from UNIT-1323.Labs.IntelliJ.Net ([178.252.116.27]) by smtp.gmail.com with ESMTPSA id u4sm3129351lfc.277.2021.02.01.15.00.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Feb 2021 15:00:32 -0800 (PST) From: Ivan Sorokin To: gcc-patches@gcc.gnu.org Subject: [PATCH] [PR91400] build only one __cpu_model variable Date: Tue, 2 Feb 2021 02:00:27 +0300 Message-Id: <20210201230027.130-1-vanyacpp@gmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-13.0 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.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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: , X-List-Received-Date: Mon, 01 Feb 2021 23:00:36 -0000 Prior to this commit GCC -O2 generated quite bad code for this function: bool f() { return __builtin_cpu_supports("popcnt") && __builtin_cpu_supports("ssse3"); } f: movl __cpu_model+12(%rip), %eax xorl %r8d, %r8d testb $4, %al je .L1 shrl $6, %eax movl %eax, %r8d andl $1, %r8d .L1: movl %r8d, %eax ret The problem was caused by the fact that internally every invocation of __builtin_cpu_supports built a new variable __cpu_model and a new type __processor_model. Because of this GIMPLE level optimizers weren't able to CSE the loads of __cpu_model and optimize bit-operations properly. This commit fixes the problem by caching created __cpu_model variable and __processor_model type. Now the GCC -O2 generates: f: movl __cpu_model+12(%rip), %eax andl $68, %eax cmpl $68, %eax sete %al ret gcc/ChangeLog: PR target/91400 * config/i386/i386-builtins.c (fold_builtin_cpu): Extract building of __cpu_model and __processor_model into new function. * config/i386/i386-builtins.c (init_cpu_model_var): New. Cache creation of __cpu_model and __processor_model. gcc/testsuite/Changelog: PR target/91400 * gcc.target/i386/pr91400.c: New. --- gcc/config/i386/i386-builtins.c | 27 ++++++++++++++++++------- gcc/testsuite/gcc.target/i386/pr91400.c | 11 ++++++++++ 2 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr91400.c diff --git a/gcc/config/i386/i386-builtins.c b/gcc/config/i386/i386-builtins.c index 4fcdf4b89ee..96534318756 100644 --- a/gcc/config/i386/i386-builtins.c +++ b/gcc/config/i386/i386-builtins.c @@ -2085,6 +2085,25 @@ make_var_decl (tree type, const char *name) return new_decl; } +static GTY(()) tree __cpu_model_var; +static GTY(()) tree __processor_model_type; + +static void +init_cpu_model_var() +{ + if (__cpu_model_var != NULL_TREE) + { + gcc_assert(__processor_model_type != NULL_TREE); + return; + } + + __processor_model_type = build_processor_model_struct (); + __cpu_model_var = make_var_decl (__processor_model_type, + "__cpu_model"); + + varpool_node::add (__cpu_model_var); +} + /* FNDECL is a __builtin_cpu_is or a __builtin_cpu_supports call that is folded into an integer defined in libgcc/config/i386/cpuinfo.c */ @@ -2096,13 +2115,7 @@ fold_builtin_cpu (tree fndecl, tree *args) = (enum ix86_builtins) DECL_MD_FUNCTION_CODE (fndecl); tree param_string_cst = NULL; - tree __processor_model_type = build_processor_model_struct (); - tree __cpu_model_var = make_var_decl (__processor_model_type, - "__cpu_model"); - - - varpool_node::add (__cpu_model_var); - + init_cpu_model_var (); gcc_assert ((args != NULL) && (*args != NULL)); param_string_cst = *args; diff --git a/gcc/testsuite/gcc.target/i386/pr91400.c b/gcc/testsuite/gcc.target/i386/pr91400.c new file mode 100644 index 00000000000..e8b7d9285f9 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr91400.c @@ -0,0 +1,11 @@ +/* PR target/91400 */ +/* { dg-do compile { target { ! ia32 } } } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler-times "andl" 1 } } */ +/* { dg-final { scan-assembler-times "68" 2 } } */ +/* { dg-final { scan-assembler-not "je" } } */ + +_Bool f() +{ + return __builtin_cpu_supports("popcnt") && __builtin_cpu_supports("ssse3"); +} -- 2.25.1