This behavior is observed in cl.exe 16.00.40219.1I have this code:int _tmain(int /*argc*/, _TCHAR* /*argv*/[]){ char buffer[4]; memset( buffer, 0, sizeof( buffer ) ); memset( buffer, 1, sizeof( buffer ) ); memset( buffer, 1, sizeof( buffer ) / 2 ); memset( buffer + sizeof( buffer ) / 2, 1, sizeof( buffer ) / 2 ); buffer[0] && rand(); return 0;}which I compile with /O2 and get the following disassembly:5: int _tmain(int /*argc*/, _TCHAR* /*argv*/[]) 6: {00401000 push ebp 00401001 mov ebp,esp 00401003 push ecx 00401004 push edi 7: char buffer[4]; 8: memset( buffer, 0, sizeof( buffer ) ); 9: memset( buffer, 1, sizeof( buffer ) );00401005 mov eax,1010101h 0040100A lea edi,[buffer] 0040100D stos dword ptr es:[edi] 10: memset( buffer, 1, sizeof( buffer ) / 2 );0040100E lea edi,[buffer] 00401011 stos word ptr es:[edi] 11: memset( buffer + sizeof( buffer ) / 2, 1, sizeof( buffer ) / 2 );00401013 lea edi,[ebp-2] 00401016 stos word ptr es:[edi] 12: buffer[0] && rand();00401018 cmp byte ptr [buffer],0 0040101C pop edi 0040101D je wmain+25h (401025h) 0040101F call dword ptr [__imp__rand (4020A0h)] 13: return 0;00401025 xor eax,eax 14: }00401027 leave 00401028 retThe compiler detected that the first memset() is seperceded by the second memset() and successfully eliminated the first memset(). Yet it failed to detect that the third and the fourth memset()s supercede the second one. The compiler should have eliminated the first and the second memset()s and merge the third and the fourth one.
Visual Studio/Team Foundation Server/.NET Framework Tooling version
Steps to reproduce
Product Language
Operating System
Operating System Language
Actual results
Expected results
Please wait...