aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-cfgcleanup.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-08-29 11:20:54 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2019-08-29 11:20:54 +0200
commit1d9cd701ec31686dbd037e0fe264c8738d993e41 (patch)
treec21d3fa2978d3c7b2e588a5c894f40a108b0f09d /gcc/tree-cfgcleanup.c
parentc3bad34748071038343f8b88a30128faee7c5c0c (diff)
downloadgcc-1d9cd701ec31686dbd037e0fe264c8738d993e41.zip
gcc-1d9cd701ec31686dbd037e0fe264c8738d993e41.tar.gz
gcc-1d9cd701ec31686dbd037e0fe264c8738d993e41.tar.bz2
re PR tree-optimization/91351 (-fstrict-enums generates incorrect code)
PR tree-optimization/91351 * tree-cfg.c (generate_range_test): Use range_check_type instead of unsigned_type_for. * tree-cfgcleanup.c (convert_single_case_switch): Punt if range_check_type returns NULL. * tree-switch-conversion.c (switch_conversion::build_one_array): Use range_check_type instead of unsigned_type_for, don't perform linear opt if it returns NULL. (bit_test_cluster::find_bit_tests): Formatting fix. (bit_test_cluster::emit): Use range_check_type instead of unsigned_type_for. (switch_decision_tree::try_switch_expansion): Punt if range_check_type returns NULL. * g++.dg/opt/pr91351.C: New test. From-SVN: r275026
Diffstat (limited to 'gcc/tree-cfgcleanup.c')
-rw-r--r--gcc/tree-cfgcleanup.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c
index 183b491..4bac38a 100644
--- a/gcc/tree-cfgcleanup.c
+++ b/gcc/tree-cfgcleanup.c
@@ -101,6 +101,8 @@ convert_single_case_switch (gswitch *swtch, gimple_stmt_iterator &gsi)
if (high)
{
tree lhs, rhs;
+ if (range_check_type (TREE_TYPE (index)) == NULL_TREE)
+ return false;
generate_range_test (bb, index, low, high, &lhs, &rhs);
cond = gimple_build_cond (LE_EXPR, lhs, rhs, NULL_TREE, NULL_TREE);
}