DynamoRIO / DynamoRIO/drmemory
add fastpath for unaligned memory accesses
- Dominant language
- C
- Stars
- 2.7k
- Forks
- 290
- PR merge metrics
- No merged PRs in 30d
Description
_From [derek.br...@gmail.com](https://code.google.com/u/117968039472581148324/) on December 10, 2010 17:58:21_
PR 575179
unaligned multi-byte memory accesses are not handled by my fastpath and they go to the slowpath.
this is the reason for Dr. Memory's poor performance on spec2k vortex, and I suspect for perf issues on eon.
my plan is to add non-inlined shared asm code that loops through the bytes.
turns out that it was partial-undef dwords that were the main bottleneck
for vortex.
I have seen eon be 2x as slow in some runs, non-deterministically: perhaps
due to dword accesses sometimes being aligned, sometimes not?
on spec2k mesa on Windows I'm seeing millions of unaligned 4-byte references involving _LDBL12 data type
debug run after a few mins:
slow instead of fast: 802019, b/c unaligned: 66208448
addr exceptions: header: 3963, tls: 0, alloca: 938196016
after using a hack to fix alloca , still a ton of slowpaths: does seem to
be unaligned refs:
examples:
slow_path 0x77bdd894: push (%ecx) %esp -> %esp (%esp)
memref: read @0x77bdd894 0x0022fa62 0x4 bytes (pre-dword 0x00)
memref: push @0x77bdd894 0x0022fa24 0x4 bytes (pre-dword 0x55)
in slow path for unknown reason @0x77bdd894 0x0022fa24
slow_path 0x77bdd5ca: mov %ecx -> (%edx) | 0x0
memref: write @0x77bdd5ca 0x0022fa62 0x4 bytes (pre-dword 0x00)
slow_path 0x77bdd948: cmp 0xfffffff2(%ebp) $0xffffffff
memref: read @0x77bdd948 0x0022fa5e 0x4 bytes (pre-dword 0x00)
slow_path 0x77bdd97a: inc 0xfffffff2(%ebp) -> 0xfffffff2(%ebp) | 0x0
memref: read @0x77bdd97a 0x0022fa5e 0x4 bytes (pre-dword 0x00)
memref: write @0x77bdd97a 0x0022fa5e 0x4 bytes (pre-dword 0x00)
slow_path_xl8_sharing for pc=0x77bdd97d addr=0x196e0400
slow_path 0x77bdd990: mov %ecx -> 0x02(%esi) | 0x0
memref: write @0x77bdd990 0x0022faee 0x4 bytes (pre-dword 0x00)
slow_path 0x77bdd996: mov %ecx -> 0x06(%esi) | 0x0
memref: write @0x77bdd996 0x0022faf2 0x4 bytes (pre-dword 0x00)
slow_path 0x77bdc9af: mov %esi -> 0x02(%edi) | 0x3
memref: write @0x77bdc9af 0x0022fb4a 0x4 bytes (pre-dword 0xf0)
slow_path 0x77bdc9b9: mov %edx -> 0x06(%edi) | 0x3
memref: write @0x77bdc9b9 0x0022fb4e 0x4 bytes (pre-dword 0xf0)
slow_path 0x77bdcc9c: mov 0x06(%eax) -> %ecx
memref: read @0x77bdcc9c 0x0022fb4e 0x4 bytes (pre-dword 0x00)
slowpaths sorted by occurrences for partial run, tail -30:
6 slow_path_xl8_sharing for pc=0x77bdd952 addr=0x196e0400
12 slow_path 0x77bd33ec: jmp 0x77bd3cf7(,%eax,4)
86 slow_path 0x7d6215bf: push 0x00000578(%eax) %esp -> %esp (%esp)
90 slow_path 0x7d621349: push 0x00000578(%ebx) %esp -> %esp (%esp)
91 slow_path 0x7d61f1a5: lock btr %eax (%ecx) -> (%ecx) | 0x1
91 slow_path 0x7d61f1bf: mov %eax -> 0x0c(%edx) | 0x1
91 slow_path 0x7d61f1c2: mov $0x00000001 -> 0x08(%edx) | 0x1
91 slow_path 0x7d61f1e0: dec 0x08(%edi) -> 0x08(%edi) | 0x1
91 slow_path 0x7d61f1e7: mov $0x00000000 -> 0x0c(%edi) | 0x1
91 slow_path 0x7d61f1f6: lock xadd (%esi) %ebx -> (%esi) %ebx | 0x1
92 slow_path_xl8_sharing for pc=0x7d61f1c2 addr=0x196e0400
93 slow_path 0x7d5125a4: movs %ds:(%esi) %esi %edi -> %es:(%edi) %esi %edi | 0x0
5001 slow_path 0x77bdd97d: mov 0xffffffec(%ebp) -> %eax
68898 slow_path 0x77bdd97a: inc 0xfffffff2(%ebp) -> 0xfffffff2(%ebp) | 0x0
68898 slow_path_xl8_sharing for pc=0x77bdd97d addr=0x196e0400
68904 slow_path 0x77bdd948: cmp 0xfffffff2(%ebp) $0xffffffff
120007 slow_path 0x77bdda34: dec 0xfffffff2(%ebp) -> 0xfffffff2(%ebp) | 0x0
132790 slow_path 0x77bdd990: mov %ecx -> 0x02(%esi) | 0x0
132790 slow_path 0x77bdd996: mov %ecx -> 0x06(%esi) | 0x0
135000 slow_path 0x77bdc9af: mov %esi -> 0x02(%edi) | 0x3
135000 slow_path 0x77bdc9b9: mov %edx -> 0x06(%edi) | 0x3
135000 slow_path 0x77bdcc9c: mov 0x06(%eax) -> %ecx
135000 slow_path 0x77bdcca2: mov 0x02(%eax) -> %ecx
358439 slow_path 0x77be610c: mov 0x0e(%ebp) -> %eax
358488 slow_path 0x77be6110: data16 and $0x7ff0 %ax -> %ax
358518 slow_path 0x77be6114: data16 cmp %ax $0x7ff0
358646 slow_path 0x77be6187: test %ah $0x44
459568 slow_path 0x77bdc627: jmp 0x77bdc9c5(,%ecx,4)
796740 slow_path 0x77bdd5ca: mov %ecx -> (%edx) | 0x0
796740 slow_path 0x77bdd894: push (%ecx) %esp -> %esp (%esp)
0:001> U 77bdd990
msvcrt!__ld12mul+0x1fb:
77bdd990 894e02 mov [esi+0x2],ecx
77bdd993 8b4df8 mov ecx,[ebp-0x8]
77bdd996 894e06 mov [esi+0x6],ecx
77bdd999 0bc7 or eax,edi
77bdd99b 6689460a mov [esi+0xa],ax
77bdd99f eb1b jmp msvcrt!__ld12mul+0x227 (77bdd9bc)
77bdd9a1 66f7df neg di
77bdd9a4 1bff sbb edi,edi
0:001> U 0x77bdda34
msvcrt!__multtenpow12+0x66:
77bdda34 ff4df2 dec dword ptr [ebp-0xe]
77bdda37 8d75f0 lea esi,[ebp-0x10]
77bdda3a 56 push esi
77bdda3b 51 push ecx
77bdda3c e854fdffff call msvcrt!__ld12mul (77bdd795)
77bdda41 59 pop ecx
77bdda42 59 pop ecx
77bdda43 8b4dec mov ecx,[ebp-0x14]
0:001> U 0x77bdd894
msvcrt!__ld12mul+0xff:
77bdd894 ff31 push dword ptr [ecx]
77bdd896 e810fdffff call msvcrt!__addl (77bdd5ab)
77bdd89b 83c40c add esp,0xc
77bdd89e 85c0 test eax,eax
77bdd8a0 7406 jz msvcrt!__ld12mul+0x113 (77bdd8a8)
77bdd8a2 8b45e4 mov eax,[ebp-0x1c]
77bdd8a5 66ff00 inc word ptr [eax]
77bdd8a8 8345d802 add dword ptr [ebp-0x28],0x2
0:001> U 0x77bdd5ca
msvcrt!__addl+0x1f:
77bdd5ca 890a mov [edx],ecx
77bdd5cc 5e pop esi
77bdd5cd 5d pop ebp
77bdd5ce c3 ret http://www.koders.com/cpp/fidE276ECFD578FD00925A0F246DEB0D311B28A5299.aspx?s=mdef%3Aserial+port ld12mul is at line 261
_LDBL12 type is a 12-byte long double
looks like the component parts are manipulated in software and are not aligned
#pragma pack(4)
typedef struct {
unsigned char ld12[12];
} _LDBL12;
#pragma pack()
_Original issue: http://code.google.com/p/drmemory/issues/detail?id=186_
Contributor guide
Assessment
This issue has not been assessed yet.