https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91351
--- Comment #7 from Martin Liška <marxin at gcc dot gnu.org> ---
(In reply to Marc Glisse from comment #3)
> Switch lowering produces things like
>
> _6 = e_2(D) + 4294967285;
> if (_6 > 2)
>
> for range checking, where _6 has type enum E, and VRP2 later takes advantage
> of strict enum to assume that _6 cannot be large. It seems like the range
> check should use a type that is not an enum.
>
> (the bisection result makes little sense to me)
The bisection point is correct, if I apply following patch:
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 716d7397b49..321d3d7db66 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -7174,7 +7174,7 @@ fold_plusminus_mult_expr (location_t loc, enum tree_code
code, tree type,
if (!same)
return NULL_TREE;
- if (! ANY_INTEGRAL_TYPE_P (type)
+ if (! INTEGRAL_TYPE_P (type)
|| TYPE_OVERFLOW_WRAPS (type)
/* We are neither factoring zero nor minus one. */
|| TREE_CODE (same) == INTEGER_CST)
diff --git a/gcc/tree.c b/gcc/tree.c
index efa49e99d65..33edbe7b374 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -11926,7 +11926,7 @@ int_cst_value (const_tree x)
tree
signed_or_unsigned_type_for (int unsignedp, tree type)
{
- if (ANY_INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type) == unsignedp)
+ if (TREE_CODE (type) == INTEGER_TYPE && TYPE_UNSIGNED (type) == unsignedp)
return type;
if (TREE_CODE (type) == VECTOR_TYPE)
@@ -11940,17 +11940,6 @@ signed_or_unsigned_type_for (int unsignedp, tree type)
return build_vector_type (inner2, TYPE_VECTOR_SUBPARTS (type));
}
- if (TREE_CODE (type) == COMPLEX_TYPE)
- {
- tree inner = TREE_TYPE (type);
- tree inner2 = signed_or_unsigned_type_for (unsignedp, inner);
- if (!inner2)
- return NULL_TREE;
- if (inner == inner2)
- return type;
- return build_complex_type (inner2);
- }
-
unsigned int bits;
if (INTEGRAL_TYPE_P (type)
|| POINTER_TYPE_P (type)
the issue is gone.
For the problematic condition vrp really does folding:
Folding statement: e_8 = ASSERT_EXPR <e_7, e_7 < 14>;
Not folded
Folding statement: _6 = e_8 + 4294967285; // 4294967285 == -11
Not folded
Folding statement: if (_6 > 2)
Folding predicate _6 > 2 to 0
Folded into: if (0 != 0)
It does not look correct to me, I use an unsigned type with precision 5 bits
and the expression should be true for e_8 == 11 for example.
Marc?