You need either %PrepareFunctionForOptimization(my_mod); before you start collecting unoptimized feedback (i.e. before the my_mod(2) call), or more unoptimized calls until feedback collection kicks in on its own. And of course you need a build that has disassembler support enabled.
--- Raw source --- (n) { if (n % 2 == 1) return true; return false; } --- Optimized code --- optimization_id = 0 source_position = 340 kind = TURBOFAN_JS name = my_mod compiler = turbofan address = 0x176e001401a1 Instructions (size = 176) 0x55a9e0000040 0 55 push rbp 0x55a9e0000041 1 4889e5 REX.W movq rbp,rsp 0x55a9e0000044 4 56 push rsi 0x55a9e0000045 5 57 push rdi 0x55a9e0000046 6 50 push rax 0x55a9e0000047 7 4883ec08 REX.W subq rsp,0x8 0x55a9e000004b b 488975e0 REX.W movq [rbp-0x20],rsi 0x55a9e000004f f 493b65a0 REX.W cmpq rsp,[r13-0x60] (external value (StackGuard::address_of_jslimit())) 0x55a9e0000053 13 0f865e000000 jna 0x55a9e00000b7 <+0x77> 0x55a9e0000059 19 488b5518 REX.W movq rdx,[rbp+0x18] 0x55a9e000005d 1d f6c201 testb rdx,0x1 0x55a9e0000060 20 0f857b000000 jnz 0x55a9e00000e1 <+0xa1> 0x55a9e0000066 26 488bca REX.W movq rcx,rdx 0x55a9e0000069 29 d1f9 sarl rcx, 1 0x55a9e000006b 2b 85d2 testl rdx,rdx 0x55a9e000006d 2d 0f8c08000000 jl 0x55a9e000007b <+0x3b> 0x55a9e0000073 33 83e101 andl rcx,0x1 0x55a9e0000076 36 e90f000000 jmp 0x55a9e000008a <+0x4a> 0x55a9e000007b 3b f7d9 negl rcx 0x55a9e000007d 3d 83e101 andl rcx,0x1 0x55a9e0000080 40 85c9 testl rcx,rcx 0x55a9e0000082 42 0f845d000000 jz 0x55a9e00000e5 <+0xa5> 0x55a9e0000088 48 f7d9 negl rcx 0x55a9e000008a 4a 83f901 cmpl rcx,0x1 0x55a9e000008d 4d 0f841e000000 jz 0x55a9e00000b1 <+0x71> 0x55a9e0000093 53 498d4655 REX.W leaq rax,[r14+0x55] 0x55a9e0000097 57 488b4de8 REX.W movq rcx,[rbp-0x18] 0x55a9e000009b 5b 488be5 REX.W movq rsp,rbp 0x55a9e000009e 5e 5d pop rbp 0x55a9e000009f 5f 4883f902 REX.W cmpq rcx,0x2 0x55a9e00000a3 63 7f03 jg 0x55a9e00000a8 <+0x68> 0x55a9e00000a5 65 c21000 ret 0x10 0x55a9e00000a8 68 415a pop r10 0x55a9e00000aa 6a 488d24cc REX.W leaq rsp,[rsp+rcx*8] 0x55a9e00000ae 6e 4152 push r10 0x55a9e00000b0 70 c3 retl 0x55a9e00000b1 71 498d4671 REX.W leaq rax,[r14+0x71] 0x55a9e00000b5 75 ebe0 jmp 0x55a9e0000097 <+0x57> 0x55a9e00000b7 77 ba40000000 movl rdx,0x40 0x55a9e00000bc 7c 52 push rdx 0x55a9e00000bd 7d 48bb00405fc7a9550000 REX.W movq rbx,0x55a9c75f4000 0x55a9e00000c7 87 b801000000 movl rax,0x1 0x55a9e00000cc 8c 48bee51a1800f57d0000 REX.W movq rsi,0x7df500181ae5 ;; object: 0x7df500181ae5 <NativeContext[302]> 0x55a9e00000d6 96 e825a246e8 call 0x55a9c846a300 (CEntry_Return1_ArgvOnStack_NoBuiltinExit) ;; near builtin entry 0x55a9e00000db 9b e979ffffff jmp 0x55a9e0000059 <+0x19> 0x55a9e00000e0 a0 90 nop 0x55a9e00000e1 a1 41ff55d8 call [r13-0x28] 0x55a9e00000e5 a5 41ff55d8 call [r13-0x28] 0x55a9e00000e9 a9 41ff55e0 call [r13-0x20] 0x55a9e00000ed ad 0f1f00 nop Inlined functions (count = 0) Deoptimization Input Data (deopt points = 3) index bytecode-offset pc 0 2 NA 1 2 NA 2 -1 9b Safepoints (stack slots = 6, entries = 1, byte size = 16) 0x55a9e00000db 9b slots (sp->fp): 100000 deopt 2 trampoline: a9 RelocInfo (size = 5) 0x55a9e00000ce full embedded object (0x7df500181ae5 <NativeContext[12e]>) 0x55a9e00000d7 near builtin entry --- End code --- On Tue, Mar 11, 2025 at 2:35 PM Sỹ Trần Dũng <sytranc...@gmail.com> wrote: > I tried d8 with --allow-natives-syntax --turbofan --print-opt-code flags > and following code but don't get any output. > > function my_mod(n) { > if (n % 2 == 1) > return true; > return false; > } > > my_mod(2); > my_mod(1); > my_mod(3); > > %OptimizeFunctionOnNextCall(my_mod); > > my_mod(100) > > I'm not sure which flags to use here. > On Tuesday, March 11, 2025 at 5:35:11 PM UTC+7 Jakob Kummerow wrote: > >> Why don't you test it and find out yourself? >> >> >> On Tue, Mar 11, 2025 at 10:20 AM Sỹ Trần Dũng <sytra...@gmail.com> wrote: >> >>> I have a question regarding V8's compiler optimization, specifically >>> concerning the modulo 2 operation. In compilers like GCC and Clang, it's >>> common to see the operation n % 2 optimized to a bitwise AND (n & 1) or a >>> bit check instruction, as these are generally more efficient. >>> >>> I've been examining the bytecode generated by V8, and I've observed that >>> a modulo instruction is used for n % 2. >>> >>> [generated bytecode for function: my_mod (0x3de244c5b401 >>> <SharedFunctionInfo my_mod>)] >>> Bytecode length: 17 >>> Parameter count 2 >>> Register count 1 >>> Frame size 8 >>> 23 S> 0x32c69b60dc80 @ 0 : 0b 03 Ldar a0 >>> 29 E> 0x32c69b60dc82 @ 2 : 4b 02 00 ModSmi [2], [0] >>> 0x32c69b60dc85 @ 5 : c9 Star0 >>> 0x32c69b60dc86 @ 6 : 0d 01 LdaSmi [1] >>> 33 E> 0x32c69b60dc88 @ 8 : 6f f9 01 TestEqual r0, [1] >>> 0x32c69b60dc8b @ 11 : 9e 04 JumpIfFalse [4] >>> (0x32c69b60dc8f @ 15) >>> 45 S> 0x32c69b60dc8d @ 13 : 11 LdaTrue >>> 57 S> 0x32c69b60dc8e @ 14 : ae Return >>> 64 S> 0x32c69b60dc8f @ 15 : 12 LdaFalse >>> 77 S> 0x32c69b60dc90 @ 16 : ae Return >>> >>> I'm curious if this behavior changes when the code is "heated" and >>> optimized by Turbofan. >>> >>> Could someone please tell whether Turbofan performs this particular >>> optimization? >>> >>> Thank you for your time and expertise. >>> >>> -- >> >> -- -- v8-dev mailing list v8-dev@googlegroups.com http://groups.google.com/group/v8-dev --- You received this message because you are subscribed to the Google Groups "v8-dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to v8-dev+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/v8-dev/CAKSzg3Rsj97V%2BecDqs7CLVdA3dEuRd4qWvtUuFRTKgux5qQ0zA%40mail.gmail.com.