2
0
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:
Kugan Vivekanandarajah 2018-11-12 23:43:56 +00:00 committed by Kugan Vivekanandarajah
parent 240ae287a1
commit 06a6b46a16
9 changed files with 81 additions and 0 deletions

@ -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) {

@ -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;