/* PR tree-optimization/36038 */ long long list[10]; long long expect[10] = { 0, 1, 2, 3, 4, 4, 5, 6, 7, 9 }; long long *stack_base; int indices[10]; int *markstack_ptr; void doit (void) { long long *src; long long *dst; long long *sp = stack_base + 5; int diff = 2; int shift; int count; shift = diff - (markstack_ptr[-1] - markstack_ptr[-2]); count = (sp - stack_base) - markstack_ptr[-1] + 2; src = sp; dst = (sp += shift); while (--count) *dst-- = *src--; } int main () { int i; for (i = 0; i < 10; i++) list[i] = i; markstack_ptr = indices + 9; markstack_ptr[-1] = 2; markstack_ptr[-2] = 1; stack_base = list + 2; doit (); if (__builtin_memcmp (expect, list, sizeof (list))) __builtin_abort (); return 0; }