aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKugan Vivekanandarajah <kuganv@linaro.org>2018-11-12 23:43:56 +0000
committerKugan Vivekanandarajah <kugan@gcc.gnu.org>2018-11-12 23:43:56 +0000
commit06a6b46a16f9287a98aa6a20366db5542405b9c5 (patch)
tree8a3db6b424f625a58894ced2c6cd0e7152ca17eb
parent240ae287a189d21ea15c93bba1f774ee69e673a7 (diff)
downloadgcc-06a6b46a16f9287a98aa6a20366db5542405b9c5.zip
gcc-06a6b46a16f9287a98aa6a20366db5542405b9c5.tar.gz
gcc-06a6b46a16f9287a98aa6a20366db5542405b9c5.tar.bz2
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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog12
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr86544.C1
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/popcount.c1
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/popcount2.c1
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/popcount3.c1
-rw-r--r--gcc/testsuite/gcc.target/aarch64/popcount4.c14
-rw-r--r--gcc/testsuite/lib/target-supports.exp11
-rw-r--r--gcc/tree-scalar-evolution.c33
9 files changed, 81 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fd35272..16ecf33 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3bc031e..cff23eee 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr86544.C b/gcc/testsuite/g++.dg/tree-ssa/pr86544.C
index fd844b4..ef43891 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 a5ec3b3..b469410 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 9096c6b..ef73e34 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 fd844b4..ef43891 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 0000000..ee55b2e
--- /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 e0c5801..8e16efc 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 02174b1..964712c 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 <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;