aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-switch-conversion.h
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2020-09-24 13:34:13 +0200
committerMartin Liska <mliska@suse.cz>2020-09-29 09:26:07 +0200
commite46858e4eeee45d35ca4a7df1996186fe884879b (patch)
tree4a6167125770535ea2e0c7d1ff4bb527890ef671 /gcc/tree-switch-conversion.h
parent37ffe56c01e4a9e80a3b3c4f5beb86d80a0663db (diff)
downloadgcc-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.h7
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. */