re PR tree-optimization/91090 (A suspicious code in tree-ssa-dom.c)
authorJeff Law <law@redhat.com>
Sun, 7 Jul 2019 18:42:45 +0000 (12:42 -0600)
committerJeff Law <law@gcc.gnu.org>
Sun, 7 Jul 2019 18:42:45 +0000 (12:42 -0600)
        PR tree-optimization/91090
        * tree-ssa-dom.c (simplify_stmt_for_jump_threading): Fix logic error
        in handling of ranges to simplify switch statements.

From-SVN: r273184

gcc/ChangeLog
gcc/tree-ssa-dom.c

index 0ef7eb6b93b793c692fe83b1d2a432c881bdddba..9f83f75b0bffa01d6c09bbbc0e55540f210a06e0 100644 (file)
@@ -1,3 +1,9 @@
+2019-07-07  Jeff Law  <law@redhat.com>
+
+       PR tree-optimization/91090
+       * tree-ssa-dom.c (simplify_stmt_for_jump_threading): Fix logic error
+       in handling of ranges to simplify switch statements.
+
 2019-07-07  Iain Sandoe  <iain@sandoe.co.uk>
 
        * config/darwin.c (darwin_override_options): Make a final check on PIC
index b0d56fcf3e378c285c9b6c3ff891080d54fc0edd..17c852d529918243eb6f2d4bd69225b6378da785 100644 (file)
@@ -913,21 +913,26 @@ simplify_stmt_for_jump_threading (gimple *stmt,
 
          find_case_label_range (switch_stmt, vr->min (), vr->max (), &i, &j);
 
+         /* Is there only one such label?  */
          if (i == j)
            {
              tree label = gimple_switch_label (switch_stmt, i);
              tree singleton;
 
+             /* The i'th label will only be taken if the value range of the
+                operand is entirely within the bounds of this label.  */
              if (CASE_HIGH (label) != NULL_TREE
                  ? (tree_int_cst_compare (CASE_LOW (label), vr->min ()) <= 0
                     && tree_int_cst_compare (CASE_HIGH (label), vr->max ()) >= 0)
                  : (vr->singleton_p (&singleton)
                     && tree_int_cst_equal (CASE_LOW (label), singleton)))
                return label;
-
-             if (i > j)
-               return gimple_switch_label (switch_stmt, 0);
            }
+
+         /* If there are no such labels, then the default label
+            will be taken.  */
+         if (i > j)
+           return gimple_switch_label (switch_stmt, 0);
        }
 
       if (vr->kind () == VR_ANTI_RANGE)