mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-24 12:41:09 +08:00
re PR target/86677 (popcount builtin detection is breaking some kernel build)
gcc/ChangeLog: 2018-11-13 Kugan Vivekanandarajah <kuganv@linaro.org> PR middle-end/86677 PR middle-end/87528 * tree-scalar-evolution.c (expression_expensive_p): Make BUILTIN POPCOUNT as expensive when backend does not define it. gcc/testsuite/ChangeLog: 2018-11-13 Kugan Vivekanandarajah <kuganv@linaro.org> PR middle-end/86677 PR middle-end/87528 * g++.dg/tree-ssa/pr86544.C: Run only for target supporting popcount pattern. * gcc.dg/tree-ssa/popcount.c: Likewise. * gcc.dg/tree-ssa/popcount2.c: Likewise. * gcc.dg/tree-ssa/popcount3.c: Likewise. * gcc.target/aarch64/popcount4.c: New test. * lib/target-supports.exp (check_effective_target_popcountl): New. From-SVN: r266039
This commit is contained in:
parent
240ae287a1
commit
06a6b46a16
gcc
ChangeLog
testsuite
tree-scalar-evolution.c@ -1,3 +1,10 @@
|
||||
2018-11-13 Kugan Vivekanandarajah <kuganv@linaro.org>
|
||||
|
||||
PR middle-end/86677
|
||||
PR middle-end/87528
|
||||
* tree-scalar-evolution.c (expression_expensive_p): Make BUILTIN POPCOUNT
|
||||
as expensive when backend does not define it.
|
||||
|
||||
2018-11-12 Fredrik Noring <noring@nocrew.org>
|
||||
|
||||
* config.gcc: Update with-llsc defaults for MIPS r5900.
|
||||
|
@ -1,3 +1,15 @@
|
||||
2018-11-13 Kugan Vivekanandarajah <kuganv@linaro.org>
|
||||
|
||||
PR middle-end/86677
|
||||
PR middle-end/87528
|
||||
* g++.dg/tree-ssa/pr86544.C: Run only for target supporting popcount
|
||||
pattern.
|
||||
* gcc.dg/tree-ssa/popcount.c: Likewise.
|
||||
* gcc.dg/tree-ssa/popcount2.c: Likewise.
|
||||
* gcc.dg/tree-ssa/popcount3.c: Likewise.
|
||||
* gcc.target/aarch64/popcount4.c: New test.
|
||||
* lib/target-supports.exp (check_effective_target_popcountl): New.
|
||||
|
||||
2018-11-12 Martin Liska <mliska@suse.cz>
|
||||
|
||||
PR gcov-profile/87442
|
||||
|
@ -1,4 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-require-effective-target popcountl } */
|
||||
/* { dg-options "-O2 -fdump-tree-phiopt4 -fdump-tree-optimized" } */
|
||||
|
||||
int PopCount (long b) {
|
||||
|
@ -1,4 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-require-effective-target popcountl } */
|
||||
/* { dg-options "-O3 -fdump-tree-optimized -fno-tree-ch" } */
|
||||
|
||||
extern int foo (int);
|
||||
|
@ -1,4 +1,5 @@
|
||||
/* { dg-do run } */
|
||||
/* { dg-require-effective-target popcountl } */
|
||||
/* { dg-options "-O2 -fno-tree-ch -fdump-tree-optimized" } */
|
||||
|
||||
int
|
||||
|
@ -1,4 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-require-effective-target popcountl } */
|
||||
/* { dg-options "-O2 -fdump-tree-phiopt4 -fdump-tree-optimized" } */
|
||||
|
||||
int PopCount (long b) {
|
||||
|
14
gcc/testsuite/gcc.target/aarch64/popcount4.c
Normal file
14
gcc/testsuite/gcc.target/aarch64/popcount4.c
Normal file
@ -0,0 +1,14 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fdump-tree-optimized -mgeneral-regs-only" } */
|
||||
|
||||
int PopCount (long b) {
|
||||
int c = 0;
|
||||
|
||||
while (b) {
|
||||
b &= b - 1;
|
||||
c++;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "__builtin_popcount" 0 "optimized" } } */
|
@ -6522,6 +6522,17 @@ proc check_effective_target_sync_long_long { } {
|
||||
}
|
||||
}
|
||||
|
||||
# Return 1 if the target supports popcount on long.
|
||||
|
||||
proc check_effective_target_popcountl { } {
|
||||
return [check_no_messages_and_pattern popcountl "!\\(call" rtl-expand {
|
||||
int foo (long b)
|
||||
{
|
||||
return __builtin_popcountl (b);
|
||||
}
|
||||
} "" ]
|
||||
}
|
||||
|
||||
# Return 1 if the target supports atomic operations on "long long"
|
||||
# and can execute them.
|
||||
#
|
||||
|
@ -257,7 +257,9 @@ along with GCC; see the file COPYING3. If not see
|
||||
#include "system.h"
|
||||
#include "coretypes.h"
|
||||
#include "backend.h"
|
||||
#include "target.h"
|
||||
#include "rtl.h"
|
||||
#include "optabs-query.h"
|
||||
#include "tree.h"
|
||||
#include "gimple.h"
|
||||
#include "ssa.h"
|
||||
@ -282,6 +284,7 @@ along with GCC; see the file COPYING3. If not see
|
||||
#include "gimple-fold.h"
|
||||
#include "tree-into-ssa.h"
|
||||
#include "builtins.h"
|
||||
#include "case-cfn-macros.h"
|
||||
|
||||
static tree analyze_scalar_evolution_1 (struct loop *, tree);
|
||||
static tree analyze_scalar_evolution_for_address_of (struct loop *loop,
|
||||
@ -3500,6 +3503,36 @@ expression_expensive_p (tree expr)
|
||||
{
|
||||
tree arg;
|
||||
call_expr_arg_iterator iter;
|
||||
/* Even though is_inexpensive_builtin might say true, we will get a
|
||||
library call for popcount when backend does not have an instruction
|
||||
to do so. We consider this to be expenseive and generate
|
||||
__builtin_popcount only when backend defines it. */
|
||||
combined_fn cfn = get_call_combined_fn (expr);
|
||||
switch (cfn)
|
||||
{
|
||||
CASE_CFN_POPCOUNT:
|
||||
/* Check if opcode for popcount is available in the mode required. */
|
||||
if (optab_handler (popcount_optab,
|
||||
TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (expr, 0))))
|
||||
== CODE_FOR_nothing)
|
||||
{
|
||||
machine_mode mode;
|
||||
mode = TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (expr, 0)));
|
||||
scalar_int_mode int_mode;
|
||||
|
||||
/* If the mode is of 2 * UNITS_PER_WORD size, we can handle
|
||||
double-word popcount by emitting two single-word popcount
|
||||
instructions. */
|
||||
if (is_a <scalar_int_mode> (mode, &int_mode)
|
||||
&& GET_MODE_SIZE (int_mode) == 2 * UNITS_PER_WORD
|
||||
&& (optab_handler (popcount_optab, word_mode)
|
||||
!= CODE_FOR_nothing))
|
||||
break;
|
||||
return true;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (!is_inexpensive_builtin (get_callee_fndecl (expr)))
|
||||
return true;
|
||||
|
Loading…
x
Reference in New Issue
Block a user