Odd Loop x86 CodeGen Behavior
Edward Lee
edilee at gmail.com
Tue Dec 9 10:07:25 PST 2008
Some reason codegen is adding unnecessary stores that in turn cause
unnecessary loads to be added. Below is a snippet of the output of
opto assembly after some changes I've done to the nodes such as
removing the safepoint for this particular backedge. Any tips on where
I should look would be useful.
The high level code is doing HashMap.get where the object has a custom
equals method inlined that checks a long field. Kinda like..
if (entry.hash == hash_ECX && entry.key.longField == long_ESP_64)
The odd behavior is in B8 and B10, where long_ESP_64 gets loaded into
EAX,EDX in B8 and written back to the stack in B10 even though both
pair of load/stores are unnecessary. It seems that code gen is
confused by the fact that B3 loads long_ESP_64 into EAX,EDX for the
long compare and the branch from B3->B9 has a higher frequency
(0.029548) than the branch B2->B8 (0.023747).
But the really odd thing is why does B10 even exist in the first
place? There's no point in writing EAX,EDX back to the stack, and this
seems to be purely an artifact of code gen as the ideal graph doesn't
have any store nodes to that location.
080 B2: # B8 B3 <- B1 B10 Loop: B2-B10 inner Freq: 1.01271
080 MOV EDI,[EBX + #8] ! Field java/util/HashMap$Entry.hash
083 CMP EDI,ECX
085 Jne,s B8 P=0.023747 C=6443.000000
085
087 B3: # B9 B4 <- B2 Freq: 0.98866
087 MOV ESI,[EBX + #12] ! Field java/util/HashMap$Entry.key
08a MOV EBP.lo,[ESI + #8]
MOV EBP.hi,[ESI + #8]+4 ! Field customEquals.longField
090 MOV EAX,[ESP + #64]
MOV EDX,[ESP + #68]
098 CMP EAX.lo,EBP.lo ! Long compare; set flags for low bits
JNE,s skip
CMP EAX.hi,EBP.hi
skip:
09e Jne,s B9 P=0.029548 C=6701.000000
09e
0a0 B4: # B5 <- B3 B9 Freq: 0.959448
0a0 MOV EBX,[EBX + #16] ! Field java/util/HashMap$Entry.value
...
0d8 RET
0e0 B8: # B9 <- B2 Freq: 0.0240485
0e0 MOV EAX,[ESP + #64]
MOV EDX,[ESP + #68]
0e0
0e8 B9: # B7 B10 <- B3 B8 Freq: 0.0532613
0e8 MOV EBX,[EBX + #20] ! Field java/util/HashMap$Entry.next
0eb TEST EBX,EBX
0ed Je,s B4 P=0.038502 C=718.000000
0ed
0ef B10: # B2 <- B9 Freq: 0.0512106
0ef MOV [ESP + #64],EAX
MOV [ESP + #68],EDX
0f7 JMP B2
Ed
More information about the hotspot-dev
mailing list