+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.
+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
}
}
+# 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.
#
#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"
#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,
{
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;