I have a weird issue that I don't understand. One of my customers has a problem with my software (it crashes immediately on startup, with a c000001d - invalid instruction - exception). Unfortunately I have no access to the system on which it happens.
OS: Microsoft Server 2012 R2 with Hyper-V inside Microsoft Server 2016
CPU: Intel Xeon Silver 4108 CPU @ 1,80Hz, which supports AVX512.
Binary created with Intel Compiler 17.0 inside Visual Studio 2015.
64 bit, minimum supported target needs to have SSE2 (/arch:SSE2), with optional paths for SSE4.1, 4.2, AVX and AVX2: /QaxSSE4.1 /QaxSSE4.2 /QaxAVX /QaxCORE-AVX-I /QaxCORE-AVX2.
The customer ran a debugger and the code crashes on an instruction that attempts to use the xmm16 register, which only exists in AVX512. I'm not building for AVX512, so I don't understand why it would generate such an instruction. Also, MS Server 2012 doesn't support AVX512 so any checking code should have protected against reaching this instruction (MS Server 2016 and the CPU both do support AVX512 though).
Unfortunately my customer has no access to the Server 2016 system so he hasn't been able to test if the software runs fine outside of the Server 2012 host.
The instruction it crashes on:
00007ff7`e76c2626 62817e08100498 vmovss xmm16,dword ptr [r8+r11*4] ds:00007ff7`e862e320=3ec3ef15