Skip to content

Commit 1f7cba2

Browse files
committed
Update IR
IR commit: 89989794a25ac43778398545b32d030dddc0e8b1
1 parent f6016c7 commit 1f7cba2

File tree

2 files changed

+70
-6
lines changed

2 files changed

+70
-6
lines changed

ext/opcache/jit/ir/ir.c

Lines changed: 68 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1882,6 +1882,42 @@ ir_ref _ir_IF(ir_ctx *ctx, ir_ref condition)
18821882
ir_ref if_ref;
18831883

18841884
IR_ASSERT(ctx->control);
1885+
if (IR_IS_CONST_REF(condition)) {
1886+
condition = ir_ref_is_true(ctx, condition) ? IR_TRUE : IR_FALSE;
1887+
} else {
1888+
ir_insn *prev = NULL;
1889+
ir_ref ref = ctx->control;
1890+
ir_insn *insn;
1891+
1892+
while (ref > condition) {
1893+
insn = &ctx->ir_base[ref];
1894+
if (insn->op == IR_GUARD_NOT) {
1895+
if (insn->op2 == condition) {
1896+
condition = IR_FALSE;
1897+
break;
1898+
}
1899+
} else if (insn->op == IR_GUARD) {
1900+
if (insn->op2 == condition) {
1901+
condition = IR_TRUE;
1902+
break;
1903+
}
1904+
} else if (insn->op == IR_IF) {
1905+
if (insn->op2 == condition) {
1906+
if (prev->op == IR_IF_TRUE) {
1907+
condition = IR_TRUE;
1908+
break;
1909+
} else if (prev->op == IR_IF_FALSE) {
1910+
condition = IR_FALSE;
1911+
break;
1912+
}
1913+
}
1914+
} else if (insn->op == IR_START || insn->op == IR_MERGE || insn->op == IR_LOOP_BEGIN) {
1915+
break;
1916+
}
1917+
prev = insn;
1918+
ref = insn->op1;
1919+
}
1920+
}
18851921
if_ref = ir_emit2(ctx, IR_IF, ctx->control, condition);
18861922
ctx->control = IR_UNUSED;
18871923
return if_ref;
@@ -2353,9 +2389,13 @@ ir_ref _ir_ADD_OFFSET(ir_ctx *ctx, ir_ref addr, uintptr_t offset)
23532389
void _ir_GUARD(ir_ctx *ctx, ir_ref condition, ir_ref addr)
23542390
{
23552391
IR_ASSERT(ctx->control);
2356-
if (condition == IR_TRUE) {
2357-
return;
2392+
if (IR_IS_CONST_REF(condition)) {
2393+
if (ir_ref_is_true(ctx, condition)) {
2394+
return;
2395+
}
2396+
condition = IR_FALSE;
23582397
} else {
2398+
ir_insn *prev = NULL;
23592399
ir_ref ref = ctx->control;
23602400
ir_insn *insn;
23612401

@@ -2370,9 +2410,19 @@ void _ir_GUARD(ir_ctx *ctx, ir_ref condition, ir_ref addr)
23702410
condition = IR_FALSE;
23712411
break;
23722412
}
2413+
} else if (insn->op == IR_IF) {
2414+
if (insn->op2 == condition) {
2415+
if (prev->op == IR_IF_TRUE) {
2416+
return;
2417+
} else if (prev->op == IR_IF_FALSE) {
2418+
condition = IR_FALSE;
2419+
break;
2420+
}
2421+
}
23732422
} else if (insn->op == IR_START || insn->op == IR_MERGE || insn->op == IR_LOOP_BEGIN) {
23742423
break;
23752424
}
2425+
prev = insn;
23762426
ref = insn->op1;
23772427
}
23782428
}
@@ -2385,9 +2435,13 @@ void _ir_GUARD(ir_ctx *ctx, ir_ref condition, ir_ref addr)
23852435
void _ir_GUARD_NOT(ir_ctx *ctx, ir_ref condition, ir_ref addr)
23862436
{
23872437
IR_ASSERT(ctx->control);
2388-
if (condition == IR_FALSE) {
2389-
return;
2438+
if (IR_IS_CONST_REF(condition)) {
2439+
if (!ir_ref_is_true(ctx, condition)) {
2440+
return;
2441+
}
2442+
condition = IR_TRUE;
23902443
} else {
2444+
ir_insn *prev = NULL;
23912445
ir_ref ref = ctx->control;
23922446
ir_insn *insn;
23932447

@@ -2402,9 +2456,19 @@ void _ir_GUARD_NOT(ir_ctx *ctx, ir_ref condition, ir_ref addr)
24022456
condition = IR_TRUE;
24032457
break;
24042458
}
2459+
} else if (insn->op == IR_IF) {
2460+
if (insn->op2 == condition) {
2461+
if (prev->op == IR_IF_TRUE) {
2462+
condition = IR_TRUE;
2463+
break;
2464+
} else if (prev->op == IR_IF_FALSE) {
2465+
return;
2466+
}
2467+
}
24052468
} else if (insn->op == IR_START || insn->op == IR_MERGE || insn->op == IR_LOOP_BEGIN) {
24062469
break;
24072470
}
2471+
prev = insn;
24082472
ref = insn->op1;
24092473
}
24102474
}

ext/opcache/jit/ir/ir_cfg.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -409,8 +409,8 @@ static void ir_remove_merge_input(ir_ctx *ctx, ir_ref merge, ir_ref from)
409409
}
410410
i--;
411411
if (i == 1) {
412-
insn->op = IR_BEGIN;
413-
insn->inputs_count = 0;
412+
insn->op = IR_BEGIN;
413+
insn->inputs_count = 1;
414414
use_list = &ctx->use_lists[merge];
415415
if (use_list->count > 1) {
416416
for (k = 0, p = &ctx->use_edges[use_list->refs]; k < use_list->count; k++, p++) {

0 commit comments

Comments
 (0)