aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/gimple-match-exports.cc25
-rw-r--r--gcc/match.pd9
-rw-r--r--gcc/testsuite/gcc.dg/bitint-43.c19
3 files changed, 51 insertions, 2 deletions
diff --git a/gcc/gimple-match-exports.cc b/gcc/gimple-match-exports.cc
index d6dac08..3a054b6 100644
--- a/gcc/gimple-match-exports.cc
+++ b/gcc/gimple-match-exports.cc
@@ -236,7 +236,30 @@ build_call_internal (internal_fn fn, gimple_match_op *res_op)
tree_pair types = direct_internal_fn_types (fn, res_op->type,
res_op->ops);
if (!direct_internal_fn_supported_p (fn, types, OPTIMIZE_FOR_BOTH))
- return NULL;
+ {
+ switch (fn)
+ {
+ case IFN_CLZ:
+ case IFN_CTZ:
+ case IFN_CLRSB:
+ case IFN_FFS:
+ case IFN_POPCOUNT:
+ case IFN_PARITY:
+ /* For these 6 builtins large/huge _BitInt operand is ok
+ before bitint lowering pass. */
+ if (res_op->num_ops >= 1
+ && TREE_CODE (TREE_TYPE (res_op->ops[0])) == BITINT_TYPE
+ && (TYPE_PRECISION (TREE_TYPE (res_op->ops[0]))
+ > MAX_FIXED_MODE_SIZE)
+ && cfun
+ && (cfun->curr_properties & PROP_gimple_lbitint) == 0)
+ break;
+ return NULL;
+
+ default:
+ return NULL;
+ }
+ }
}
return gimple_build_call_internal (fn, res_op->num_ops,
res_op->op_or_null (0),
diff --git a/gcc/match.pd b/gcc/match.pd
index 0382fd5..0170591 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -8882,7 +8882,14 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
/* parity(X)^parity(Y) is parity(X^Y). */
(simplify
(bit_xor (PARITY:s @0) (PARITY:s @1))
- (PARITY (bit_xor @0 @1)))
+ (if (types_match (TREE_TYPE (@0), TREE_TYPE (@1)))
+ (PARITY (bit_xor @0 @1))
+ (if (INTEGRAL_TYPE_P (TREE_TYPE (@0))
+ && INTEGRAL_TYPE_P (TREE_TYPE (@1)))
+ (with { tree utype = TREE_TYPE (@0);
+ if (TYPE_PRECISION (utype) < TYPE_PRECISION (TREE_TYPE (@1)))
+ utype = TREE_TYPE (@1); }
+ (PARITY (bit_xor (convert:utype @0) (convert:utype @1)))))))
#if GIMPLE
/* parity(zext(X)) == parity(X). */
diff --git a/gcc/testsuite/gcc.dg/bitint-43.c b/gcc/testsuite/gcc.dg/bitint-43.c
new file mode 100644
index 0000000..3a506b3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/bitint-43.c
@@ -0,0 +1,19 @@
+/* PR tree-optimization/112719 */
+/* { dg-do compile { target bitint } } */
+/* { dg-options "-O2" } */
+
+#if __BITINT_MAXWIDTH__ >= 252
+int
+foo (unsigned _BitInt(239) x, unsigned _BitInt(252) y)
+{
+ x &= 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauwb;
+ y &= 0x555555555555555555555555555555555555555555555555555555555555555uwb;
+ return __builtin_popcountg (x) + __builtin_popcountg (y);
+}
+
+int
+bar (unsigned _BitInt(239) x, unsigned _BitInt(252) y)
+{
+ return __builtin_parityg (x) ^ __builtin_parityg (y);
+}
+#endif