diff options
author | Martin Liska <mliska@suse.cz> | 2020-09-24 13:34:13 +0200 |
---|---|---|
committer | Martin Liska <mliska@suse.cz> | 2020-09-29 09:26:07 +0200 |
commit | e46858e4eeee45d35ca4a7df1996186fe884879b (patch) | |
tree | 4a6167125770535ea2e0c7d1ff4bb527890ef671 /gcc/tree-switch-conversion.h | |
parent | 37ffe56c01e4a9e80a3b3c4f5beb86d80a0663db (diff) | |
download | gcc-e46858e4eeee45d35ca4a7df1996186fe884879b.zip gcc-e46858e4eeee45d35ca4a7df1996186fe884879b.tar.gz gcc-e46858e4eeee45d35ca4a7df1996186fe884879b.tar.bz2 |
switch conversion: make a rapid speed up
gcc/ChangeLog:
PR tree-optimization/96979
* tree-switch-conversion.c (jump_table_cluster::can_be_handled):
Make a fast bail out.
(bit_test_cluster::can_be_handled): Likewise here.
* tree-switch-conversion.h (get_range): Use wi::to_wide instead
of a folding.
gcc/testsuite/ChangeLog:
PR tree-optimization/96979
* g++.dg/tree-ssa/pr96979.C: New test.
Diffstat (limited to 'gcc/tree-switch-conversion.h')
-rw-r--r-- | gcc/tree-switch-conversion.h | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/gcc/tree-switch-conversion.h b/gcc/tree-switch-conversion.h index 9ebcf10..dbfd9ee 100644 --- a/gcc/tree-switch-conversion.h +++ b/gcc/tree-switch-conversion.h @@ -84,11 +84,10 @@ public: then return 0. */ static unsigned HOST_WIDE_INT get_range (tree low, tree high) { - tree r = fold_build2 (MINUS_EXPR, TREE_TYPE (low), high, low); - if (!tree_fits_uhwi_p (r)) + wide_int w = wi::to_wide (high) - wi::to_wide (low); + if (wi::neg_p (w, TYPE_SIGN (TREE_TYPE (low))) || !wi::fits_uhwi_p (w)) return 0; - - return tree_to_uhwi (r) + 1; + return w.to_uhwi () + 1; } /* Case label. */ |