Viewing file: ivopts-lower_base.c (1.39 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* { 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" } } */
|