謎's キッチン

謎のひとりごと。Amazon欲しい物リストはこちら: https://www.amazon.co.jp/hz/wishlist/ls/CCPOV7C6JTD2

何この最適化の余地の塊

GCCの最適化について試してみたんですよ。
/usr/local/gcc4.3/bin/gcc -O3 -march=pentium4 -mtune=pentium4で。

int main(){
  char*s = malloc(10);
  char*t = malloc(10);
  *s++=*t++;
  *s++=*t++;
  *s++=*t++;
  *s=*t;
  free(s);
  free(t);
  return 0;
}

mallocはbuiltin関数であり、結局sが使われてないので最適化して

int main(){
  return 0;
}

までしてしまうんじゃないかと思ったのにしてない。
以下のように最適化してくれないかと期待してたけど、それもない。

int main(){
  char*s = malloc(10);
  char*t = malloc(10);
  int*s2 = (int*)s;
  int*t2 = (int*)t;
  *s2=*t2;
  free(s);
  free(t);
  return 0;
}

ってかこのケースだとmallocをスタックを利用するように最適化してくれても良いのになぁ。
メモリがネックの今には期待外れすぎるんですが。(ちなみにmemcpyやmemsetはちゃんと最適化される。)
弄るとしたらtree-ssa-*辺り?

memcpy(ptr, "test", 4);は最適化される、*(int*)ptr=*(int*)"test";は最適化されない。
memcpy(ptr, ptr2, 4*i)は最適化されない。

//コードにすると最速はこんな感じ?
long long*ptr_64=(long long*)ptr,*ptr2_64=(long long*)ptr2;
int j=0;
for(;j<(i<<1);j++)__builtin_memcpy(ptr_64+j, ptr2_64+j, 8);
if(i%2)__builtin_memcpy(ptr_64+j, ptr2_64+j, 4);

memcpy(ptr, ptr2, 8*i)は最適化されない。

//コードにすると最速はこんな感じ?
long long*ptr_64=(long long*)ptr,*ptr2_64=(long long*)ptr2;
int j=0;
for(;j<i;j++)__builtin_memcpy(ptr_64+j, ptr2_64+j, 8);

memcpy(ptr, ptr2, 16*i)は最適化されない。

//コードにすると最速はこんな感じ?
long long*ptr_64=(long long*)ptr,*ptr2_64=(long long*)ptr2;
for(int j=0;j<i*2;j++)__builtin_memcpy(ptr_64+j, ptr2_64+j, 8);