In short, the reason is that eliminating bounds checks in JavaScript is
harder than it seems. It also doesn't make a huge performance difference on
most real-world code (i.e. aside from micro-benchmarks), so supporting it
doesn't have very high priority. That said, we are hoping to implement a
system one day that would at least handle the relatively straightforward
case in your example.

The "most correct flags" are none at all. Everything that makes sense to
enable is enabled by default anyway.


On Sun, Apr 3, 2016 at 10:40 PM, Gem Dot Artigas <[email protected]> wrote:

> Thanks a lot for your answer.
>
> But, There is any reason for this?  In other words, why they have been
> disabed it by defect? Usually, What do the current browsers do? I would
> like to know which are the the most correct flags for achademic research.
>
> thanks in advance
>
>
> El domingo, 3 de abril de 2016, 18:17:15 (UTC+2), Yang escribió:
>>
>> For Crankshaft, bounds check hoisting optimization has been disabled. You
>> can try to turn the flag on and try your test case.
>> Not sure if TurboFan already has similar optimization implemented or
>> enabled.
>>
>> On Sunday, April 3, 2016 at 1:38:57 AM UTC-7, Gem Dot Artigas wrote:
>>>
>>> Hi,
>>>
>>>
>>> I have an important question about check bounds. Why, in some very clear
>>> cases, V8 put the instruction to obtain the length of the array out of the
>>> loop, but the check bounds is still inside? (I refer the scenarios when the
>>> loop control variable is clear to be incremented by 1 at each loop
>>> iteration and it is not manipulated by no function)
>>>
>>>
>>>
>>> I put an example to clarify it:
>>>
>>> Given this JS function from Kraken suite:
>>>
>>> 1    findGraphNode = function(node) {
>>> 2        for(var i=0;i<this.length;i++) {
>>> 3            if(this[i].position == node.position) {
>>> 4                return true;
>>> 5            }
>>> 6        }
>>> 7         return false;
>>> 8    }
>>>
>>>
>>> The optimized generated x86 code is the following:
>>>
>>> I1    movq rax, this        // load this
>>> I2    test rax, 1            // check non-smi
>>> I3    jz code_deoptimization    // check non-smi
>>> I4    movq r10, nodeList        // check maps
>>> I5    cmpq (rax-1), r10        // check maps
>>> I6    jnz code_deoptimization    // check maps
>>> I7    movl rbx, (rax+27)        // load elements length
>>> I8    movq rdx,(rax+15)        // load elements array
>>> I9    movq rcx, (rbp+16)         // load node
>>> I10    testb rcx, 1            // check non-smi
>>> I11    jz code_deoptimization     // check non-smi
>>> I12    movq r10, GraphNode         // check maps
>>> I13    cmpq (rcx-1), r10        // check maps
>>> I14    jnz code_deoptimization    // check maps
>>> I15    movq rsi,(rcx+47)        // load node.position
>>> loop:
>>> I16    cmpl rdi, rbx         // compare i to this.length
>>> I17    jge return_false        // node not found: return false
>>> I18    cmpq rsp, (stack_limit)     // check stack
>>> I19    jc external_exception    // check stack
>>> I20    cmpl rbx,rdi            // check bounds
>>> I21    jna code_deoptimization    // check bounds
>>> I22    movq r8, (rdx+rdi*8)        // load this[i]
>>> I23    testb r8, 1            // check non-smi
>>> I24    jz code_deoptimization    // check non-smi
>>> I25    movq r10, GraphNode        // check maps
>>> I26    cmpq (r8-1), r10        // check maps
>>> I27    jnz code_deoptimization     // check maps
>>> I28    movq r9,(r8+47)        // load this[i].position
>>> I29    cmpq r9,rsi            // compare this[i].position to
>>> node.position
>>> I30    jz return_true        //  node found: return true
>>> I31    addl rdi,0x1                // i++
>>> I32    jmp loop            // loop back edge
>>>
>>>
>>> So, Why check bounds can not be put out of the loop? You can put a check
>>> bounds out of the loop and compare it with this.length variable directly...
>>>
>>> Thanks in Avdance
>>>
>> --
> --
> v8-dev mailing list
> [email protected]
> 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 [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
-- 
v8-dev mailing list
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to