пример с лишними обращениями к памяти, от которых можно избавиться вручную
Компилятор не может поместить переменную dst в регистр, поскольку если ячейки *x и *dst частично или полностью перекрываются, модификация ячейки *dst приводит к неожиданному изменению *x! Бред, конечно, но Стандарт таких трюков не запрещает, а оптимизатор не имеет права отступать от Стандарта, поэтому обращения к памяти происходят на _каждой_ итерации, а это весьма "дорогостоящая" в плане процессорных тактов операция!
Переписанный код выглядит так:
f(char *x, int *dst, int n)
{
int i,t =0;
for
(i=0;i<n;i++) t+=x[i]; // сохранение суммы во временной переменной
*dst+=t; // запись конечного результата в память
}