Commit 06a6b46a by Kugan Vivekanandarajah Committed by Kugan Vivekanandarajah

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
parent 240ae287
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> 2018-11-12 Fredrik Noring <noring@nocrew.org>
* config.gcc: Update with-llsc defaults for MIPS r5900. * config.gcc: Update with-llsc defaults for MIPS r5900.
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> 2018-11-12 Martin Liska <mliska@suse.cz>
PR gcov-profile/87442 PR gcov-profile/87442
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target popcountl } */
/* { dg-options "-O2 -fdump-tree-phiopt4 -fdump-tree-optimized" } */ /* { dg-options "-O2 -fdump-tree-phiopt4 -fdump-tree-optimized" } */
int PopCount (long b) { int PopCount (long b) {
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target popcountl } */
/* { dg-options "-O3 -fdump-tree-optimized -fno-tree-ch" } */ /* { dg-options "-O3 -fdump-tree-optimized -fno-tree-ch" } */
extern int foo (int); extern int foo (int);
......
/* { dg-do run } */ /* { dg-do run } */
/* { dg-require-effective-target popcountl } */
/* { dg-options "-O2 -fno-tree-ch -fdump-tree-optimized" } */ /* { dg-options "-O2 -fno-tree-ch -fdump-tree-optimized" } */
int int
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-require-effective-target popcountl } */
/* { dg-options "-O2 -fdump-tree-phiopt4 -fdump-tree-optimized" } */ /* { dg-options "-O2 -fdump-tree-phiopt4 -fdump-tree-optimized" } */
int PopCount (long b) { int PopCount (long b) {
......
/* { 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 { } { ...@@ -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" # Return 1 if the target supports atomic operations on "long long"
# and can execute them. # and can execute them.
# #
......
...@@ -257,7 +257,9 @@ along with GCC; see the file COPYING3. If not see ...@@ -257,7 +257,9 @@ along with GCC; see the file COPYING3. If not see
#include "system.h" #include "system.h"
#include "coretypes.h" #include "coretypes.h"
#include "backend.h" #include "backend.h"
#include "target.h"
#include "rtl.h" #include "rtl.h"
#include "optabs-query.h"
#include "tree.h" #include "tree.h"
#include "gimple.h" #include "gimple.h"
#include "ssa.h" #include "ssa.h"
...@@ -282,6 +284,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -282,6 +284,7 @@ along with GCC; see the file COPYING3. If not see
#include "gimple-fold.h" #include "gimple-fold.h"
#include "tree-into-ssa.h" #include "tree-into-ssa.h"
#include "builtins.h" #include "builtins.h"
#include "case-cfn-macros.h"
static tree analyze_scalar_evolution_1 (struct loop *, tree); static tree analyze_scalar_evolution_1 (struct loop *, tree);
static tree analyze_scalar_evolution_for_address_of (struct loop *loop, static tree analyze_scalar_evolution_for_address_of (struct loop *loop,
...@@ -3500,6 +3503,36 @@ expression_expensive_p (tree expr) ...@@ -3500,6 +3503,36 @@ expression_expensive_p (tree expr)
{ {
tree arg; tree arg;
call_expr_arg_iterator iter; 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))) if (!is_inexpensive_builtin (get_callee_fndecl (expr)))
return true; return true;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment