From 06a6b46a16f9287a98aa6a20366db5542405b9c5 Mon Sep 17 00:00:00 2001 From: Kugan Vivekanandarajah Date: Mon, 12 Nov 2018 23:43:56 +0000 Subject: [PATCH] re PR target/86677 (popcount builtin detection is breaking some kernel build) gcc/ChangeLog: 2018-11-13 Kugan Vivekanandarajah 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 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 --- gcc/ChangeLog | 7 +++++ gcc/testsuite/ChangeLog | 12 +++++++ gcc/testsuite/g++.dg/tree-ssa/pr86544.C | 1 + gcc/testsuite/gcc.dg/tree-ssa/popcount.c | 1 + gcc/testsuite/gcc.dg/tree-ssa/popcount2.c | 1 + gcc/testsuite/gcc.dg/tree-ssa/popcount3.c | 1 + gcc/testsuite/gcc.target/aarch64/popcount4.c | 14 +++++++++ gcc/testsuite/lib/target-supports.exp | 11 +++++++ gcc/tree-scalar-evolution.c | 33 ++++++++++++++++++++ 9 files changed, 81 insertions(+) create mode 100644 gcc/testsuite/gcc.target/aarch64/popcount4.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fd352724cef..16ecf33dc34 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-11-13 Kugan Vivekanandarajah + + 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 * config.gcc: Update with-llsc defaults for MIPS r5900. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3bc031e70a7..cff23eee5a1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,15 @@ +2018-11-13 Kugan Vivekanandarajah + + 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 PR gcov-profile/87442 diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr86544.C b/gcc/testsuite/g++.dg/tree-ssa/pr86544.C index fd844b48deb..ef438916a80 100644 --- a/gcc/testsuite/g++.dg/tree-ssa/pr86544.C +++ b/gcc/testsuite/g++.dg/tree-ssa/pr86544.C @@ -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) { diff --git a/gcc/testsuite/gcc.dg/tree-ssa/popcount.c b/gcc/testsuite/gcc.dg/tree-ssa/popcount.c index a5ec3b34f96..b4694109411 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/popcount.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/popcount.c @@ -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); diff --git a/gcc/testsuite/gcc.dg/tree-ssa/popcount2.c b/gcc/testsuite/gcc.dg/tree-ssa/popcount2.c index 9096c6bee04..ef73e345573 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/popcount2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/popcount2.c @@ -1,4 +1,5 @@ /* { dg-do run } */ +/* { dg-require-effective-target popcountl } */ /* { dg-options "-O2 -fno-tree-ch -fdump-tree-optimized" } */ int diff --git a/gcc/testsuite/gcc.dg/tree-ssa/popcount3.c b/gcc/testsuite/gcc.dg/tree-ssa/popcount3.c index fd844b48deb..ef438916a80 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/popcount3.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/popcount3.c @@ -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) { diff --git a/gcc/testsuite/gcc.target/aarch64/popcount4.c b/gcc/testsuite/gcc.target/aarch64/popcount4.c new file mode 100644 index 00000000000..ee55b2e3352 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/popcount4.c @@ -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" } } */ diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index e0c58010dd2..8e16efcd640 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -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. # diff --git a/gcc/tree-scalar-evolution.c b/gcc/tree-scalar-evolution.c index 02174b1864c..964712ca767 100644 --- a/gcc/tree-scalar-evolution.c +++ b/gcc/tree-scalar-evolution.c @@ -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 (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; -- 2.30.2