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.

Reply via email to