https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71423
Richard Biener changed:
What|Removed |Added
Keywords||wrong-code
Status|NEW |ASSIGNED
Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot
gnu.org
Target Milestone|--- |5.5
Summary|[6/7 Regression] wrong code |[5/6/7 Regression] wrong
|at -Os and above on |code at -Os and above on
|x86_64-linux-gnu|x86_64-linux-gnu
--- Comment #3 from Richard Biener ---
Those transforms were carried over from tree-ssa-forwprop.c IIRC. On the
gcc-4_9-branch this was done in simplify_bitwise_binary thus the issue is
latent on the gcc-5-branch as well. In its transform phase it did the
proper comparison swapping:
static bool
simplify_bitwise_binary_boolean (gimple_stmt_iterator *gsi,
enum tree_code code,
tree op0, tree op1)
{
...
if (code == BIT_AND_EXPR)
newcode = TYPE_UNSIGNED (TREE_TYPE (x)) ? LT_EXPR : GT_EXPR;
else
newcode = TYPE_UNSIGNED (TREE_TYPE (x)) ? LE_EXPR : GE_EXPR;
The following fixes it.
Index: gcc/match.pd
===
--- gcc/match.pd(revision 237117)
+++ gcc/match.pd(working copy)
@@ -900,12 +900,16 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(ne (bit_and:c (bit_not @0) @1) integer_zerop)
(if (INTEGRAL_TYPE_P (TREE_TYPE (@1))
&& TYPE_PRECISION (TREE_TYPE (@1)) == 1)
- (lt @0 @1)))
+ (if (TYPE_UNSIGNED (TREE_TYPE (@1)))
+(lt @0 @1)
+(gt @0 @1
(simplify
(ne (bit_ior:c (bit_not @0) @1) integer_zerop)
(if (INTEGRAL_TYPE_P (TREE_TYPE (@1))
&& TYPE_PRECISION (TREE_TYPE (@1)) == 1)
- (le @0 @1)))
+ (if (TYPE_UNSIGNED (TREE_TYPE (@1)))
+(le @0 @1)
+(ge @0 @1
/* ~~x -> x */
(simplify