Бесполезная инструкция по тестированию?

Я получил приведенный ниже список сборок как результат компиляции JIT для моей 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 

Мое понимание инструкции test здесь бесполезно, потому что основная идея теста

Флаги SF, ZF, PF модифицируются, а результат AND отбрасывается.

и здесь мы не используем эти флаги результата.

Это ошибка в JIT или я что-то пропустил? Если это так, то где лучше всего сообщить об этом? Спасибо!

Ответы

Ответ 1

Это должен быть локальный опрос рукопожатия. Посмотрите, откуда читается %r11. Если он читается из некоторого смещения из %r15 (локальное хранилище потока), то это парень. Смотрите пример здесь:

  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

Это не бесполезно, это вызовет SEGV, как только защитная страница будет помечена как нечитаемая, и это передаст управление обработчику JVM SEGV. Это часть механики JVM для обеспечения безопасности потоков Java, например, для GC.

UPD: надеюсь, подробнее здесь.