From 0411f1d6cb283b68e85d41fae7601d6a3e0a9954 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Sun, 7 Jul 2019 12:42:45 -0600 Subject: [PATCH] re PR tree-optimization/91090 (A suspicious code in tree-ssa-dom.c) 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 | 6 ++++++ gcc/tree-ssa-dom.c | 11 ++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0ef7eb6b93b..9f83f75b0bf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-07-07 Jeff Law + + 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 * config/darwin.c (darwin_override_options): Make a final check on PIC diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index b0d56fcf3e3..17c852d5299 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -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) -- 2.30.2