On Fri, Dec 6, 2013 at 2:25 AM, Richard Biener <richard.guenther@xxxxxxxxx> wrote: > On Fri, Dec 6, 2013 at 11:19 AM, Konstantin Vladimirov > <konstantin.vladimirov@xxxxxxxxx> wrote: >> Hi, >> >> nothing changes if everything is unsigned and we are guaranteed to not >> raise UB on overflow: >> >> unsigned foo(unsigned char *t, unsigned char *v, unsigned w) >> { >> unsigned i; >> >> for (i = 1; i != w; ++i) >> { >> unsigned x = i << 2; >> v[x + 4] = t[x + 4]; >> } >> >> return 0; >> } >> >> yields: >> >> .L5: >> leal 0(,%eax,4), %edx >> addl $1, %eax >> movzbl 4(%edi,%edx), %ecx >> cmpl %ebx, %eax >> movb %cl, 4(%esi,%edx) >> jne .L5 >> >> What is SCEV infrastructure (guessing scalar evolutions?) and what >> files/passes to look in? > > tree-scalar-evolution.c, look at where it handles MULT_EXPR but > lacks LSHIFT_EXPR support. > For -- int foo(char *t, char *v, int w) { int i; for (i = 1; i != w; ++i) { int x = i * 2; v[x + 4] = t[x + 4]; } return 0; } --- -O2 gives: .L6: movzbl 4(%esi,%eax,2), %edx movb %dl, 4(%ebx,%eax,2) addl $1, %eax cmpl %ecx, %eax jne .L6 -- H.J.