Hi Leszek, Thanks for your excellent explanation! Now I have a better understanding of function optimization.
However, after running the code you listed I still got ` OptimizationMarker::kNone`: - optimized code: 0x204700044001 <Code TURBOFAN> - optimization marker: OptimizationMarker::kNone - optimization tier: OptimizationTier::kTopTier Is this the expected behavior? I'm expecting ` OptimizationMarker::kCompileOptimized` here since I have got the top tier optimization, turbofan, as stated in the following `optimization tier` field. Many Thanks, Jiading On Tuesday, December 7, 2021 at 9:30:58 PM UTC+8 les...@chromium.org wrote: > There's actually a couple of things going on here. > > First of all, this is actually a great example of why we always tell > people that we can't "just" optimize functions ahead of time. You may > notice that "add" is in the --trace-opt twice; it's optimized exactly when > you request it, but then as soon as that optimized code is executed, it > immediately deopts due to insufficient type feedback for the add operation > (this is called a "soft" deopt). You'll see the deopt/bailout if you run > with --trace-deopt. Then, later, it's optimised again from being run lots > of times, which is a concurrent compilation that may or may not complete > before your loop ends. To get "add" properly optimized using > OptimizeFunctionOnNextCall, you have to > > 1. Call %PrepareFunctionForOptimization(add) -- this makes sure that > the add function can collect type feedback and that its bytecode is not > flushed away by GC > 2. Call add(1,2) -- this is a call with the correct types, two small > integers, which teach it the correct type feedback for the sum > 3. Call %OptimizeFunctionOnNextCall(add) > > Secondly, this is a bit of a printing failure -- the "code" you're seeing > is on the JSFunction as you'd expect, but the "no optimized code" is > actually printing as part of printing the "feedback vector" of the > JSFunction. The reason is that there is only one closure (JSFunction) in > one context that implements "add", which means that we can do some extra > optimisations called "function context specialization"; this is the common > case, but in some cases you may have JSFunctions implementing the same > underlying code (e.g. function factory() { return function add(a+b) { > return a+b; } } always returns a new JSFunction but one that implements > the same code). For those cases, we skip the "function context > specialization", and share code between these different JSFunctions by > putting it on the feedback vector. > > Putting this together, you'll see what you originally expected by running: > > function factory() { > return function add(a, b) { return a + b; } > } > > // Create two closures for 'add', to turn off function context > specialization. > add = factory(); > some_other_add = factory(); > > %PrepareFunctionForOptimization(add); > // Warm up the type feedback. > add(1, 2); > > %OptimizeFunctionOnNextCall(add); > // Do the optimization. > add(1, 2); > > // Run the loop. > let sum = 0; > for (let i = 0; i < 100000; i++) { > sum += add(i, i); > } > %DebugPrint(add); > > - Leszek > > On Tuesday, December 7, 2021 at 5:45:51 AM UTC+1 zin...@gmail.com wrote: > >> Hi all, >> >> I'm trying to mannually optimize my function [1] by >> calling %OptimizeFunctionOnNextCall. >> >> I run `./d8 --allow-natives-syntax --trace-opt --print-opt-code foo.js`, >> it seems that the function is compiled: >> >> [manually marking 0x1e6e082935b5 <JSFunction add (sfi = 0x1e6e08293485)> >> for non-concurrent optimization] >> [compiling method 0x1e6e082935b5 <JSFunction add (sfi = 0x1e6e08293485)> >> (target TURBOFAN) using TurboFan] >> --- Optimized code --- >> optimization_id = 0 >> source_position = 12 >> kind = TURBOFAN >> name = add >> stack_slots = 6 >> compiler = turbofan >> address = 0x1e6e00044001 >> ... >> >> But according to `%DebugPrint(add)` in the last line, it says: >> >> - code: 0x1e6e00045841 <Code TURBOFAN> >> ... >> - shared function info: 0x1e6e08293485 <SharedFunctionInfo add> >> - no optimized code >> - optimization marker: OptimizationMarker::kNone >> - optimization tier: OptimizationTier::kNone >> >> I'm curious why it has `<Code TURBOFAN>` but `no optimized code` and >> `OptimizationMarker::kNone`? Shouldn't the function be compiled with >> `OptimizationMarker::kCompileOptimized`? Is there something I'm missing? >> Thanks in advance! >> >> Regards, >> Jiading >> >> [1] add.js: >> function add(a, b) { return a + b; } >> %OptimizeFunctionOnNextCall(add); >> add(1, 2); >> let sum = 0; >> for (let i = 0; i < 100000; i++) { >> sum += add(i, i); >> } >> %DebugPrint(add); >> > -- -- v8-users mailing list v8-users@googlegroups.com http://groups.google.com/group/v8-users --- You received this message because you are subscribed to the Google Groups "v8-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to v8-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/v8-users/09f67353-4ff8-492d-baaa-36770f1e0199n%40googlegroups.com.