--- /dev/null
+/* { 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); }
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);
= 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);