+ panic("too large switch encountered (%+F)", node);
+ }
+ ++length;
+
+ labels = XMALLOCNZ(const ir_node*, length);
+ for (e = 0; e < n_entries; ++e) {
+ const ir_switch_table_entry *entry
+ = ir_switch_table_get_entry_const(table, e);
+ ir_tarval *min = entry->min;
+ ir_tarval *max = entry->max;
+ const ir_node *target = targets[entry->pn];
+ assert(entry->pn < (long)n_outs);
+ if (min == max) {
+ unsigned long val = (unsigned long)get_tarval_long(max);
+ labels[val] = target;
+ } else {
+ unsigned long min_val;
+ unsigned long max_val;
+ unsigned long i;
+ if (!tarval_is_long(min))
+ panic("switch case overflow (%+F)", node);
+ min_val = (unsigned long)get_tarval_long(min);
+ max_val = (unsigned long)get_tarval_long(max);
+ assert(min_val <= max_val);
+ for (i = min_val; i <= max_val; ++i) {
+ labels[i] = target;
+ }
+ }