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/e23b2218-3880-46f4-810c-6348d3d562acn%40googlegroups.com.