diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2023-11-13 09:58:10 -0500 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2023-11-14 10:33:29 -0500 |
commit | 8f331be42991aa4d58ac770faf993accfcce882b (patch) | |
tree | 57cd5baa64b0d4f657b9b700f0f1c65b5f53fd84 | |
parent | 2c2fcd6d2a315069f9bef0117f8d7bebe7cb4957 (diff) | |
download | gcc-8f331be42991aa4d58ac770faf993accfcce882b.zip gcc-8f331be42991aa4d58ac770faf993accfcce882b.tar.gz gcc-8f331be42991aa4d58ac770faf993accfcce882b.tar.bz2 |
Use case label type to create case range.
Create a range from the label type, and cast it to the required type.
PR tree-optimization/112509
gcc/
* tree-vrp.cc (find_case_label_range): Create range from case labels.
gcc/testsuite/
* gcc.dg/pr112509.c: New.
-rw-r--r-- | gcc/testsuite/gcc.dg/pr112509.c | 22 | ||||
-rw-r--r-- | gcc/tree-vrp.cc | 6 |
2 files changed, 23 insertions, 5 deletions
diff --git a/gcc/testsuite/gcc.dg/pr112509.c b/gcc/testsuite/gcc.dg/pr112509.c new file mode 100644 index 0000000..b733780 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr112509.c @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-tree-vrp -fno-tree-fre -fno-tree-forwprop" } */ + +struct S { + unsigned j : 3; +}; +int k, l, m_1 = {0}; +void f(int l, struct S x) { + unsigned int k_1; + while (m_1 % 8) switch (x.j) { + case 1: + case 3: + case 4: + case 6: + case 2: + case 5: l = m_1; + case 7: + case 0: k_1 = 0; + default: break; + } +} +void foo(struct S x) { f(l, x); } diff --git a/gcc/tree-vrp.cc b/gcc/tree-vrp.cc index 19d8f99..917fa87 100644 --- a/gcc/tree-vrp.cc +++ b/gcc/tree-vrp.cc @@ -886,8 +886,6 @@ find_case_label_range (gswitch *switch_stmt, const irange *range_of_op) size_t i, j; tree op = gimple_switch_index (switch_stmt); tree type = TREE_TYPE (op); - unsigned prec = TYPE_PRECISION (type); - signop sign = TYPE_SIGN (type); tree tmin = wide_int_to_tree (type, range_of_op->lower_bound ()); tree tmax = wide_int_to_tree (type, range_of_op->upper_bound ()); find_case_label_range (switch_stmt, tmin, tmax, &i, &j); @@ -900,9 +898,7 @@ find_case_label_range (gswitch *switch_stmt, const irange *range_of_op) = CASE_HIGH (label) ? CASE_HIGH (label) : CASE_LOW (label); wide_int wlow = wi::to_wide (CASE_LOW (label)); wide_int whigh = wi::to_wide (case_high); - int_range_max label_range (type, - wide_int::from (wlow, prec, sign), - wide_int::from (whigh, prec, sign)); + int_range_max label_range (TREE_TYPE (case_high), wlow, whigh); if (!types_compatible_p (label_range.type (), range_of_op->type ())) range_cast (label_range, range_of_op->type ()); label_range.intersect (*range_of_op); |