tree phi_def = gimple_phi_result (phi);
tree type = gimple_range_type (phi);
int_range_max arg_range;
+ int_range_max equiv_range;
unsigned x;
if (!type)
// Get the range of the argument on its edge.
src.get_phi_operand (arg_range, arg, e);
+ // Likewise, if the incoming PHI argument is equivalent to this
+ // PHI definition, it provides no new info. Accumulate these ranges
+ // in case all arguments are equivalences.
+ if (src.query ()->query_relation (e, arg, phi_def, false) == EQ_EXPR)
+ {
+ single_arg = arg;
+ equiv_range.union_(arg_range);
+ continue;
+ }
+
if (!arg_range.undefined_p ())
{
// Register potential dependencies for stale value tracking.
break;
}
+ // If all arguments were equivalences, use the equivalence ranges as no
+ // arguments were processed.
+ if (!seen_arg)
+ r = equiv_range;
+
// If the PHI boils down to a single effective argument, look at it.
if (single_arg)
{
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-tree-evrp" } */
+
+void foo();
+static char a, c;
+static int d, e;
+static short b(short f, short g) { return f * g; }
+int main() {
+ short h = 4;
+ for (; d;)
+ if (h)
+ if(e) {
+ if (!b(a & 1 | h, 3))
+ c = 0;
+ h = 1;
+ }
+ if (c)
+ foo();
+}
+
+/* { dg-final { scan-tree-dump-not "c = 0" "evrp" } } */