Right.  The print function is the one defined in the v8 shell, which I am
under the impression would not include a stack limit check as it is not
being compiled by v8.

- Kyle


2011/8/31 Vyacheslav Egorov <[email protected]>

> > but the optimized code only appears to be checking the stack limit at
> > the function entry, not in the loop itself.
>
> Yes. As I said in my previous email: optimizing compiler eliminates
> stack checks that are dominated by calls because called functions
> should at least have a stack check in the prologue.
>
> However there seems to be a minor issue here. Apparently HandleApiCall
> builtin does not perform any stack checks thus breaking
> HStackCheckEliminator assumption that every call implies a stack
> check.
>
> If print in your example is a JS function everything is fine because
> JS function has a stack check in the prologue. But if print is an API
> function then this loop will have no interruption point which is bad.
>
> --
> Vyacheslav Egorov
>
>
> On Wed, Aug 31, 2011 at 10:39 PM, Kyle Morgan <[email protected]>
> wrote:
> > Hi Vyacheslav,
> >
> > Allow me to demonstrate what I mean.  I ran the v8 shell with code
> > containing the following function.
> >
> > function loop() {
> >   for(var i = 0; i < 5; ++i) {
> >     print(i);
> >   }
> > }
> >
> > It appears to be emitting the following code (optimized and unoptimized).
> >
> > --- Code ---
> > kind = FUNCTION
> > name = loop
> > Instructions (size = 196)
> > 0x7f6f3e26fca0     0  55             push rbp
> > 0x7f6f3e26fca1     1  4889e5         REX.W movq rbp,rsp
> > 0x7f6f3e26fca4     4  56             push rsi
> > 0x7f6f3e26fca5     5  57             push rdi
> > 0x7f6f3e26fca6     6  41ff7598       push [r13-0x68]
> > 0x7f6f3e26fcaa    10  493b6508       REX.W cmpq rsp,[r13+0x8]
> > 0x7f6f3e26fcae    14  7305           jnc 21  (0x7f6f3e26fcb5)
> > 0x7f6f3e26fcb0    16  e82bf4fdff     call 0x7f6f3e24f0e0     ;; debug:
> > statement 36
> >                                                             ;; code:
> STUB,
> > StackCheckStub, minor: 0
> > 0x7f6f3e26fcb5    21  33c0           xorl rax,rax
> > 0x7f6f3e26fcb7    23  488945e8       REX.W movq [rbp-0x18],rax
> > 0x7f6f3e26fcbb    27  e94d000000     jmp 109  (0x7f6f3e26fd0d)
> > 0x7f6f3e26fcc0    32  ff7627         push [rsi+0x27]
> > 0x7f6f3e26fcc3    35  ff75e8         push [rbp-0x18]
> > 0x7f6f3e26fcc6    38  48b9919790636f7f0000 REX.W movq rcx,0x7f6f63909791
> >  ;; object: 0x7f6f63909791 <String[5]: print>
> > 0x7f6f3e26fcd0    48  e80b98ffff     call 0x7f6f3e2694e0     ;; debug:
> > statement 76
> >                                                             ;; code:
> > contextual, CALL_IC, UNINITIALIZED, in_loop, argc = 1
> > 0x7f6f3e26fcd5    53  488b75f8       REX.W movq rsi,[rbp-0x8]
> > 0x7f6f3e26fcd9    57  488b45e8       REX.W movq rax,[rbp-0x18]
> > 0x7f6f3e26fcdd    61  a801           test al,0x1
> > 0x7f6f3e26fcdf    63  7405           jz 70  (0x7f6f3e26fce6)
> > 0x7f6f3e26fce1    65  e89a83feff     call 0x7f6f3e258080     ;; debug:
> > statement 43
> >                                                             ;; debug:
> > position 67
> >                                                             ;; code:
> STUB,
> > ToNumberStub, minor: 0
> > 0x7f6f3e26fce6    70  4c01e0         REX.W addq rax,r12
> > 0x7f6f3e26fce9    73  7004           jo 79  (0x7f6f3e26fcef)
> > 0x7f6f3e26fceb    75  a801           test al,0x1
> > 0x7f6f3e26fced    77  720d           jc 92  (0x7f6f3e26fcfc)
> > 0x7f6f3e26fcef    79  4c29e0         REX.W subq rax,r12
> > 0x7f6f3e26fcf2    82  4c89e2         REX.W movq rdx,r12
> > 0x7f6f3e26fcf5    85  e80658feff     call 0x7f6f3e255500     ;; code:
> > BINARY_OP_IC, UNINITIALIZED (id = 30)
> > 0x7f6f3e26fcfa    90  a80d           test al,0xd
> > 0x7f6f3e26fcfc    92  488945e8       REX.W movq [rbp-0x18],rax
> > 0x7f6f3e26fd00    96  493b6508       REX.W cmpq rsp,[r13+0x8]
> > 0x7f6f3e26fd04   100  7307           jnc 109  (0x7f6f3e26fd0d)
> > 0x7f6f3e26fd06   102  e8d5f3fdff     call 0x7f6f3e24f0e0     ;; code:
> STUB,
> > StackCheckStub, minor: 0
> > 0x7f6f3e26fd0b   107  a801           test al,0x1
> > 0x7f6f3e26fd0d   109  ff75e8         push [rbp-0x18]
> > 0x7f6f3e26fd10   112  4b8d04a4       REX.W leaq rax,[r12+r12*4]
> > 0x7f6f3e26fd14   116  5a             pop rdx
> > 0x7f6f3e26fd15   117  488bca         REX.W movq rcx,rdx
> > 0x7f6f3e26fd18   120  480bc8         REX.W orq rcx,rax
> > 0x7f6f3e26fd1b   123  f6c101         testb rcx,0x1
> > 0x7f6f3e26fd1e   126  730a           jnc 138  (0x7f6f3e26fd2a)
> > 0x7f6f3e26fd20   128  483bd0         REX.W cmpq rdx,rax
> > 0x7f6f3e26fd23   131  7c9b           jl 32  (0x7f6f3e26fcc0)
> > 0x7f6f3e26fd25   133  e91d000000     jmp 167  (0x7f6f3e26fd47)
> > 0x7f6f3e26fd2a   138  e8313cfeff     call 0x7f6f3e253960     ;; debug:
> > position 60
> >                                                             ;; code:
> > COMPARE_IC, UNINITIALIZED (id = 23)
> > 0x7f6f3e26fd2f   143  a811           test al,0x11
> > 0x7f6f3e26fd31   145  eb0b           jmp 158  (0x7f6f3e26fd3e)
> > 0x7f6f3e26fd33   147  493b45b0       REX.W cmpq rax,[r13-0x50]
> > 0x7f6f3e26fd37   151  7487           jz 32  (0x7f6f3e26fcc0)
> > 0x7f6f3e26fd39   153  e909000000     jmp 167  (0x7f6f3e26fd47)
> > 0x7f6f3e26fd3e   158  4885c0         REX.W testq rax,rax
> > 0x7f6f3e26fd41   161  0f8c79ffffff   jl 32  (0x7f6f3e26fcc0)
> > 0x7f6f3e26fd47   167  498b4598       REX.W movq rax,[r13-0x68]
> > 0x7f6f3e26fd4b   171  488be5         REX.W movq rsp,rbp      ;; debug:
> > statement 90
> >                                                             ;; js return
> > 0x7f6f3e26fd4e   174  5d             pop rbp
> > 0x7f6f3e26fd4f   175  c20800         ret 0x8
> > 0x7f6f3e26fd52   178  cc             int3
> > 0x7f6f3e26fd53   179  cc             int3
> > 0x7f6f3e26fd54   180  cc             int3
> > 0x7f6f3e26fd55   181  cc             int3
> > 0x7f6f3e26fd56   182  cc             int3
> > 0x7f6f3e26fd57   183  cc             int3
> >
> > --- Optimized code ---
> > kind = OPTIMIZED_FUNCTION
> > name = loop
> > stack_slots = 2
> > Instructions (size = 234)
> > 0x7f6f3e2703a0     0  55             push rbp
> > 0x7f6f3e2703a1     1  4889e5         REX.W movq rbp,rsp
> > 0x7f6f3e2703a4     4  56             push rsi
> > 0x7f6f3e2703a5     5  57             push rdi
> > 0x7f6f3e2703a6     6  4883ec10       REX.W subq rsp,0x10
> > 0x7f6f3e2703aa    10  488bc6         REX.W movq rax,rsi
> > 0x7f6f3e2703ad    13  493b6508       REX.W cmpq rsp,[r13+0x8]
> > 0x7f6f3e2703b1    17  7305           jnc 24  (0x7f6f3e2703b8)
> > 0x7f6f3e2703b3    19  e828edfdff     call 0x7f6f3e24f0e0     ;; code:
> STUB,
> > StackCheckStub, minor: 0
> > 0x7f6f3e2703b8    24  488b4627       REX.W movq rax,[rsi+0x27]
> > 0x7f6f3e2703bc    28  488b4027       REX.W movq rax,[rax+0x27]
> > 0x7f6f3e2703c0    32  488945e8       REX.W movq [rbp-0x18],rax
> > 0x7f6f3e2703c4    36  bb00000000     movl rbx,(nil)
> > 0x7f6f3e2703c9    41  48895de0       REX.W movq [rbp-0x20],rbx
> > 0x7f6f3e2703cd    45  83fb05         cmpl rbx,0x5
> > 0x7f6f3e2703d0    48  0f8d5c000000   jge 146  (0x7f6f3e270432)
> > 0x7f6f3e2703d6    54  48ba881d7f636f7f0000 REX.W movq rdx,0x7f6f637f1d88
> >  ;; global property cell
> > 0x7f6f3e2703e0    64  488b12         REX.W movq rdx,[rdx]
> > 0x7f6f3e2703e3    67  493b55a0       REX.W cmpq rdx,[r13-0x60]
> > 0x7f6f3e2703e7    71  0f8456000000   jz 163  (0x7f6f3e270443)
> > 0x7f6f3e2703ed    77  49ba719295636f7f0000 REX.W movq r10,0x7f6f63959271
> >  ;; object: 0x7f6f63959271 <JS Function print>
> > 0x7f6f3e2703f7    87  493bd2         REX.W cmpq rdx,r10
> > 0x7f6f3e2703fa    90  0f8550000000   jnz 176  (0x7f6f3e270450)
> > 0x7f6f3e270400    96  50             push rax
> > 0x7f6f3e270401    97  488bd3         REX.W movq rdx,rbx
> > 0x7f6f3e270404   100  48c1e220       REX.W shlq rdx,32
> > 0x7f6f3e270408   104  52             push rdx
> > 0x7f6f3e270409   105  48bf719295636f7f0000 REX.W movq rdi,0x7f6f63959271
> >  ;; object: 0x7f6f63959271 <JS Function print>
> > 0x7f6f3e270413   115  b801000000     movl rax,0x1
> > 0x7f6f3e270418   120  4c89e1         REX.W movq rcx,r12
> > 0x7f6f3e27041b   123  ff5717         call [rdi+0x17]         ;; debug:
> > position 76
> > 0x7f6f3e27041e   126  488b75f8       REX.W movq rsi,[rbp-0x8]
> > 0x7f6f3e270422   130  488b45e0       REX.W movq rax,[rbp-0x20]
> > 0x7f6f3e270426   134  83c001         addl rax,0x1
> > 0x7f6f3e270429   137  488bd8         REX.W movq rbx,rax
> > 0x7f6f3e27042c   140  488b45e8       REX.W movq rax,[rbp-0x18]
> > 0x7f6f3e270430   144  eb97           jmp 41  (0x7f6f3e2703c9)
> > 0x7f6f3e270432   146  48b8b1208f636f7f0000 REX.W movq rax,0x7f6f638f20b1
> >  ;; object: 0x7f6f638f20b1 <undefined>
> > 0x7f6f3e27043c   156  488be5         REX.W movq rsp,rbp
> > 0x7f6f3e27043f   159  5d             pop rbp
> > 0x7f6f3e270440   160  c20800         ret 0x8
> > 0x7f6f3e270443   163  49ba4aa0283e6f7f0000 REX.W movq r10,0x7f6f3e28a04a
> >  ;; deoptimization bailout 1
> > 0x7f6f3e27044d   173  41ffe2         jmp r10
> > 0x7f6f3e270450   176  49ba54a0283e6f7f0000 REX.W movq r10,0x7f6f3e28a054
> >  ;; deoptimization bailout 2
> > 0x7f6f3e27045a   186  41ffe2         jmp r10
> > 0x7f6f3e27045d   189  90             nop
> > 0x7f6f3e27045e   190  90             nop
> > 0x7f6f3e27045f   191  90             nop
> > 0x7f6f3e270460   192  90             nop
> > 0x7f6f3e270461   193  90             nop
> > 0x7f6f3e270462   194  90             nop
> > 0x7f6f3e270463   195  90             nop
> > 0x7f6f3e270464   196  90             nop
> > 0x7f6f3e270465   197  90             nop
> > 0x7f6f3e270466   198  90             nop
> > 0x7f6f3e270467   199  90             nop
> > 0x7f6f3e270468   200  90             nop
> > 0x7f6f3e270469   201  90             nop
> > 0x7f6f3e27046a   202  6690           nop
> >
> > It appears that the unoptimized code is emitting two stack limit checks.
> >  One at offset 16 at the function entry (but prior to the loop starting
> at
> > offset 32), and another at offset 102, prior to the loop's backward jump.
> >  However, the optimized code is only emitting one stack check at offset
> 19,
> > when the loop doesn't appear to start until offset 41.  Correct me if I'm
> > wrong, but the optimized code only appears to be checking the stack limit
> at
> > the function entry, not in the loop itself.
> >
> > - Kyle
> >
> >
> >
> > On Wed, Aug 31, 2011 at 3:53 PM, Vyacheslav Egorov <[email protected]
> >
> > wrote:
> >> Hi Kyle,
> >>
> >> Optimizing compiler inserts stack checks (HStackCheck instruction)
> >> explicitly at loop body's entry[1].
> >>
> >> It also does an optimization pass[2] to remove redundant stack checks
> >> that are dominated by function calls (as functions always does stack
> >> check in the prologue).
> >>
> >> Stack checks are important part of V8's interruption mechanism so both
> >> compilers emit them to make all loops interruptable.
> >>
> >> [1]
> http://code.google.com/p/v8/source/browse/trunk/src/hydrogen.cc#2823
> >> [2]
> http://code.google.com/p/v8/source/browse/trunk/src/hydrogen.cc#1247
> >>
> >> --
> >> Vyacheslav Egorov
> >>
> >>
> >> On Wed, Aug 31, 2011 at 9:27 PM, Kyle <[email protected]> wrote:
> >>> Hello,
> >>>
> >>> Some time ago I noticed that the v8 compile was inserting stack limit
> >>> checks at the back edges of loops.  I later found out that this check
> >>> was doubling as a preemption mechanism to interrupt potentially long-
> >>> running code.  However, I've noticed that the hydrogen/lithium
> >>> compiler included with crankshaft does not seem to include these
> >>> checks.  Is there a particular reason for this?  Is the previous
> >>> design for JavaScript preemption no longer being pursued?
> >>>
> >>> --
> >>> v8-users mailing list
> >>> [email protected]
> >>> http://groups.google.com/group/v8-users
> >>>
> >>
> >> --
> >> v8-users mailing list
> >> [email protected]
> >> http://groups.google.com/group/v8-users
> >
> > --
> > v8-users mailing list
> > [email protected]
> > http://groups.google.com/group/v8-users
>
> --
> v8-users mailing list
> [email protected]
> http://groups.google.com/group/v8-users
>

-- 
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users

Reply via email to