diff options
| author | Mike Pall <mike> | 2015-06-10 16:14:41 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2015-06-10 16:14:41 +0200 |
| commit | 7f454aed82ef364245ae73a16a04b21e2245e342 (patch) | |
| tree | 98015f244c88502dd509d2adb9366693b0514c1c /src | |
| parent | 72347895edbdc8730c1e758bfee4264fd60164ac (diff) | |
| download | luajit-7f454aed82ef364245ae73a16a04b21e2245e342.tar.gz luajit-7f454aed82ef364245ae73a16a04b21e2245e342.tar.bz2 luajit-7f454aed82ef364245ae73a16a04b21e2245e342.zip | |
Fix narrowing of TOBIT.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lj_opt_narrow.c | 7 |
1 files changed, 2 insertions, 5 deletions
diff --git a/src/lj_opt_narrow.c b/src/lj_opt_narrow.c index 58b3763d..fb647189 100644 --- a/src/lj_opt_narrow.c +++ b/src/lj_opt_narrow.c | |||
| @@ -205,7 +205,6 @@ typedef struct NarrowConv { | |||
| 205 | jit_State *J; /* JIT compiler state. */ | 205 | jit_State *J; /* JIT compiler state. */ |
| 206 | NarrowIns *sp; /* Current stack pointer. */ | 206 | NarrowIns *sp; /* Current stack pointer. */ |
| 207 | NarrowIns *maxsp; /* Maximum stack pointer minus redzone. */ | 207 | NarrowIns *maxsp; /* Maximum stack pointer minus redzone. */ |
| 208 | int lim; /* Limit on the number of emitted conversions. */ | ||
| 209 | IRRef mode; /* Conversion mode (IRCONV_*). */ | 208 | IRRef mode; /* Conversion mode (IRCONV_*). */ |
| 210 | IRType t; /* Destination type: IRT_INT or IRT_I64. */ | 209 | IRType t; /* Destination type: IRT_INT or IRT_I64. */ |
| 211 | NarrowIns stack[NARROW_MAX_STACK]; /* Stack holding stack-machine code. */ | 210 | NarrowIns stack[NARROW_MAX_STACK]; /* Stack holding stack-machine code. */ |
| @@ -342,7 +341,7 @@ static int narrow_conv_backprop(NarrowConv *nc, IRRef ref, int depth) | |||
| 342 | NarrowIns *savesp = nc->sp; | 341 | NarrowIns *savesp = nc->sp; |
| 343 | int count = narrow_conv_backprop(nc, ir->op1, depth); | 342 | int count = narrow_conv_backprop(nc, ir->op1, depth); |
| 344 | count += narrow_conv_backprop(nc, ir->op2, depth); | 343 | count += narrow_conv_backprop(nc, ir->op2, depth); |
| 345 | if (count <= nc->lim) { /* Limit total number of conversions. */ | 344 | if (count <= 1) { /* Limit total number of conversions. */ |
| 346 | *nc->sp++ = NARROWINS(IRT(ir->o, nc->t), ref); | 345 | *nc->sp++ = NARROWINS(IRT(ir->o, nc->t), ref); |
| 347 | return count; | 346 | return count; |
| 348 | } | 347 | } |
| @@ -414,12 +413,10 @@ TRef LJ_FASTCALL lj_opt_narrow_convert(jit_State *J) | |||
| 414 | nc.t = irt_type(fins->t); | 413 | nc.t = irt_type(fins->t); |
| 415 | if (fins->o == IR_TOBIT) { | 414 | if (fins->o == IR_TOBIT) { |
| 416 | nc.mode = IRCONV_TOBIT; /* Used only in the backpropagation cache. */ | 415 | nc.mode = IRCONV_TOBIT; /* Used only in the backpropagation cache. */ |
| 417 | nc.lim = 2; /* TOBIT can use a more optimistic rule. */ | ||
| 418 | } else { | 416 | } else { |
| 419 | nc.mode = fins->op2; | 417 | nc.mode = fins->op2; |
| 420 | nc.lim = 1; | ||
| 421 | } | 418 | } |
| 422 | if (narrow_conv_backprop(&nc, fins->op1, 0) <= nc.lim) | 419 | if (narrow_conv_backprop(&nc, fins->op1, 0) <= 1) |
| 423 | return narrow_conv_emit(J, &nc); | 420 | return narrow_conv_emit(J, &nc); |
| 424 | } | 421 | } |
| 425 | return NEXTFOLD; | 422 | return NEXTFOLD; |
