diff options
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r-- | src/lj_opt_fold.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index ce78505b..62483c26 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
@@ -1935,9 +1935,10 @@ LJFOLDF(abc_k) | |||
1935 | LJFOLD(ABC any any) | 1935 | LJFOLD(ABC any any) |
1936 | LJFOLDF(abc_invar) | 1936 | LJFOLDF(abc_invar) |
1937 | { | 1937 | { |
1938 | /* Invariant ABC marked as PTR. Drop if op1 is invariant, too. */ | 1938 | /* Invariant ABC marked as P32 or U32. Drop if op1 is invariant too. */ |
1939 | if (!irt_isint(fins->t) && fins->op1 < J->chain[IR_LOOP] && | 1939 | if (!irt_isint(fins->t) && fins->op1 < J->chain[IR_LOOP] && |
1940 | !irt_isphi(IR(fins->op1)->t)) | 1940 | (irt_isu32(fins->t) || |
1941 | (!irref_isk(fins->op1) && !irt_isphi(IR(fins->op1)->t)))) | ||
1941 | return DROPFOLD; | 1942 | return DROPFOLD; |
1942 | return NEXTFOLD; | 1943 | return NEXTFOLD; |
1943 | } | 1944 | } |
@@ -2485,6 +2486,17 @@ LJFOLD(CNEW any any) | |||
2485 | LJFOLD(XSNEW any any) | 2486 | LJFOLD(XSNEW any any) |
2486 | LJFOLDX(lj_ir_emit) | 2487 | LJFOLDX(lj_ir_emit) |
2487 | 2488 | ||
2489 | /* -- Miscellaneous ------------------------------------------------------- */ | ||
2490 | |||
2491 | LJFOLD(CARG any any) | ||
2492 | LJFOLDF(cse_carg) | ||
2493 | { | ||
2494 | TRef tr = lj_opt_cse(J); | ||
2495 | if (tref_ref(tr) < J->chain[IR_LOOP]) /* CSE across loop? */ | ||
2496 | return EMITFOLD; /* Raw emit. Assumes fins is left intact by CSE. */ | ||
2497 | return tr; | ||
2498 | } | ||
2499 | |||
2488 | /* ------------------------------------------------------------------------ */ | 2500 | /* ------------------------------------------------------------------------ */ |
2489 | 2501 | ||
2490 | /* Every entry in the generated hash table is a 32 bit pattern: | 2502 | /* Every entry in the generated hash table is a 32 bit pattern: |