/* { dg-do compile } */ /* { dg-options "-O2 -fdump-tree-ivopts-details" } */ #include <string.h> #include <stdlib.h> #define MAX_NUM (256) void sort_pointers (size_t n, void **pointers, void **work) { typedef unsigned char digit_t; unsigned int count[MAX_NUM]; int big_endian_p; size_t i; size_t j; if ((sizeof (void *) / sizeof (digit_t)) % 2 != 0) abort (); for (i = 0, j = 0; i < sizeof (size_t); ++i) { j *= MAX_NUM; j += i; } big_endian_p = (((char *)&j)[0] == 0); for (i = 0; i < sizeof (void *) / sizeof (digit_t); ++i) { digit_t *digit; digit_t *bias; digit_t *top; unsigned int *countp; void **pointerp; if (big_endian_p) j = sizeof (void *) / sizeof (digit_t) - i; else j = i; memset (count, 0, MAX_NUM * sizeof (unsigned int)); bias = ((digit_t *) pointers) + j; top = ((digit_t *) (pointers + n)) + j; for (digit = bias; digit < top; digit += sizeof (void *) / sizeof (digit_t)) ++count[*digit]; for (countp = count + 1; countp < count + MAX_NUM; ++countp) *countp += countp[-1]; for (pointerp = pointers + n - 1; pointerp >= pointers; --pointerp) work[--count[((digit_t *) pointerp)[j]]] = *pointerp; pointerp = pointers; pointers = work; work = pointerp; } } /* { dg-final { scan-tree-dump-not "base \[^\\n\]*&MEM\\\[" "ivopts" } } */