util_dynarray_num_elements(arr, struct entry *),
sizeof(struct entry *), &sort_entries);
- unsigned i = 0;
- for (; i < util_dynarray_num_elements(arr, struct entry*) - 1; i++) {
- struct entry *low = *util_dynarray_element(arr, struct entry *, i);
- struct entry *high = *util_dynarray_element(arr, struct entry *, i + 1);
+ unsigned num_entries = util_dynarray_num_elements(arr, struct entry *);
- uint64_t diff = high->offset_signed - low->offset_signed;
- if (diff > get_bit_size(low) / 8u * low->intrin->num_components)
+ for (unsigned first_idx = 0; first_idx < num_entries; first_idx++) {
+ struct entry *low = *util_dynarray_element(arr, struct entry *, first_idx);
+ if (!low)
continue;
- struct entry *first = low->index < high->index ? low : high;
- struct entry *second = low->index < high->index ? high : low;
+ for (unsigned second_idx = first_idx + 1; second_idx < num_entries; second_idx++) {
+ struct entry *high = *util_dynarray_element(arr, struct entry *, second_idx);
+ if (!high)
+ continue;
- if (try_vectorize(impl, ctx, low, high, first, second)) {
- *util_dynarray_element(arr, struct entry *, i) = NULL;
- *util_dynarray_element(arr, struct entry *, i + 1) = low->is_store ? second : first;
- progress = true;
+ uint64_t diff = high->offset_signed - low->offset_signed;
+ if (diff > get_bit_size(low) / 8u * low->intrin->num_components)
+ break;
+
+ struct entry *first = low->index < high->index ? low : high;
+ struct entry *second = low->index < high->index ? high : low;
+
+ if (try_vectorize(impl, ctx, low, high, first, second)) {
+ low = low->is_store ? second : first;
+ *util_dynarray_element(arr, struct entry *, second_idx) = NULL;
+ progress = true;
+ }
}
+
+ *util_dynarray_element(arr, struct entry *, first_idx) = low;
}
util_dynarray_foreach(arr, struct entry *, elem) {