instrução de teste inútil?

QIvan:

Eu tenho a lista abaixo montagem como resultado para a compilação JIT para o meu programa java.

mov    0x14(%rsp),%r10d
inc    %r10d              

mov    0x1c(%rsp),%r8d
inc    %r8d               

test   %eax,(%r11)         ; <--- this instruction

mov    (%rsp),%r9
mov    0x40(%rsp),%r14d
mov    0x18(%rsp),%r11d
mov    %ebp,%r13d
mov    0x8(%rsp),%rbx
mov    0x20(%rsp),%rbp
mov    0x10(%rsp),%ecx
mov    0x28(%rsp),%rax    

movzbl 0x18(%r9),%edi     
movslq %r8d,%rsi          

cmp    0x30(%rsp),%rsi
jge    0x00007fd3d27c4f17 

Minha compreensão da testinstrução é inútil aqui, porque a idéia principal do teste é

As bandeiras SF, ZF, PF são modificados enquanto o resultado do AND é descartado.

e aqui não usamos estas bandeiras de resultados.

É um bug no JIT ou eu perdi alguma coisa? Se for, onde o melhor lugar para relatá-lo? Obrigado!

Aleksey Shipilev:

Esse deve ser o poll handshake segmento local . Veja onde %r11é lido. Se ele é lido de algum deslocamento para fora da %r15(armazenamento local de segmento), que é o cara. Veja o exemplo aqui :

  0.31%  ↗  ...70: movzbl 0x94(%r9),%r10d    
  0.19%  │  ...78: mov    0x108(%r15),%r11  ; read the thread-local page addr
 25.62%  │  ...7f: add    $0x1,%rbp          
 35.10%  │  ...83: test   %eax,(%r11)       ; thread-local handshake poll
 34.91%  │  ...86: test   %r10d,%r10d
         ╰  ...89: je     ...70

Não é inútil, causaria SEGV uma vez que a página de proteção é marcado como não lido por todos, e que iria transferir o controle para manipulador SEGV do JVM. Isso faz parte da mecânica do JVM para encadeamentos Java ponto seguro, por exemplo, para GC.

UPD: Esperemos que, mais detalhes aqui .

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=37709&siteId=1
Recomendado
Clasificación