In this bug, we hit the (A & sign-bit) != 0 -> A < 0 transformation.
Because of delayed folding, the operands aren't fully folded yet, so we
have NOP_EXPRs around INTEGER_CSTs, and so calling wi::only_sign_bit_p
ICEs. We've been seeing several similar bugs, where code calls
integer_zerop and therefore assumes that they have an INTEGER_CST, but
in fact integer_zerop does STRIP_NOPS.
This patch changes the pattern to only match if the operand is actually
an INTEGER_CST. Alternatively we could call tree_strip_nop_conversions
on the operand, but I would expect that to have issues when the
conversion changes the signedness of the type.
OK if testing passes?
commit e7b45ed6775c88c6d48c5863738ba0db2e38fc5e
Author: Jason Merrill <ja...@redhat.com>
Date: Fri Nov 20 14:40:35 2015 -0500
PR c++/68385
* match.pd: Don't assume that integer_pow2p implies INTEGER_CST.
diff --git a/gcc/match.pd b/gcc/match.pd
index e86cc8b..1981ae7 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -2232,6 +2232,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
&& (TYPE_PRECISION (TREE_TYPE (@0))
== GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (@0))))
&& element_precision (@2) >= element_precision (@0)
+ && TREE_CODE (@1) == INTEGER_CST
&& wi::only_sign_bit_p (@1, element_precision (@0)))
(with { tree stype = signed_type_for (TREE_TYPE (@0)); }
(ncmp (convert:stype @0) { build_zero_cst (stype); })))))