Details
-
Bug
-
Status: Open
-
Major
-
Resolution: Unresolved
-
None
-
None
-
None
-
IA32 Windows
Description
When early_prop turned off in server_static mode, there is a NullPointerException during running startup.helloworld. The bug comes from the last BB of the callee - DataInputStream.readByte(). Following are the generated binary code for this bug:
with early_prop
02D67855 I15: MOVSX t26(EAX):I_32,t12(EAX):I_32
without early_prop
02D67865 I33: MOV t25(BH):I_8,t12(EAX):I_32
02D67867 I15: MOVSX t26(EAX):I_32,t25(BH):I_8
BH is defined if early_prop bypassed and no other code related to EBX is in this method. But in the caller - ICUBinary.readHeader() - EBX is actually defined before the above part of code and assumed to keep unmodifed and be used later. See details:
02466A22 mov edx,edi
02466A24 mov dword ptr [esp+9Ch],eax
02466A2B mov edi,ebx
02466A2D mov ebx,edx // ebx is defined
02466A2F sub esp,8
02466A35 push ebx
02466A36 call dword ptr [esi] // call to readByte() and ebx is changed in the callee
02466A38 mov edx,dword ptr [esp+9Ch]
02466A3F mov dword ptr [esp+98h],esi
02466A46 mov esi,ebp
02466A48 mov ecx,ebx // ebx is used
02466A4A mov dword ptr [esp+94h],eax
02466A51 mov ebx,edx
02466A53 mov ebp,edi
02466A55 mov edi,ecx
02466A57 mov edx,dword ptr [esp+98h]
02466A5E sub esp,8
02466A64 push edi // the value of ebx is pushed
02466A65 call dword ptr [edx] // call to readByte() and exception thrown out finally
So some part of EBX (BH) is changed uncarefully and an exception is thrown out finally. With early_prop the bug is gone because there is no changes about EBX.
With some changes in Ia32RegAlloc0.cpp to only use bin packing register allocation I found no bug when running startup.helloworld.
My basic assumptions are early_prop is NOT indispensable and each optimization pass should be independent as much as possible.
Attachments
Attachments
Issue Links
- is part of
-
HARMONY-6027 [drlvm][jit] An incorrect register assignment in graph coloring register allocation
- Open