diff options
author | Jakub Jelinek <jakub@redhat.com> | 2019-08-29 11:20:54 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-08-29 11:20:54 +0200 |
commit | 1d9cd701ec31686dbd037e0fe264c8738d993e41 (patch) | |
tree | c21d3fa2978d3c7b2e588a5c894f40a108b0f09d /gcc/tree-cfgcleanup.c | |
parent | c3bad34748071038343f8b88a30128faee7c5c0c (diff) | |
download | gcc-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.c | 2 |
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); } |