瀏覽代碼

Eliminate some rare occurrences of redundant PHIs.

Mike Pall 14 年之前
父節點
當前提交
8437d0c48d
共有 1 個文件被更改,包括 8 次插入4 次删除
  1. 8 4
      src/lj_opt_loop.c

+ 8 - 4
src/lj_opt_loop.c

@@ -159,11 +159,15 @@ static void loop_emit_phi(jit_State *J, IRRef1 *subst, IRRef1 *phi, IRRef nphi,
   for (i = 0; i < nphi; i++) {
   for (i = 0; i < nphi; i++) {
     IRRef lref = phi[i];
     IRRef lref = phi[i];
     IRIns *ir = IR(lref);
     IRIns *ir = IR(lref);
-    if (!irt_ismarked(ir->t)) {  /* Emit PHI if not marked. */
+    if (!irt_ismarked(ir->t)) {  /* Emit PHI if not marked and not redundant. */
       IRRef rref = subst[lref];
       IRRef rref = subst[lref];
-      if (rref > invar)
-	irt_setphi(IR(rref)->t);
-      emitir_raw(IRT(IR_PHI, irt_type(ir->t)), lref, rref);
+      if (lref == rref) {
+	irt_clearphi(ir->t);
+      } else {
+	if (rref > invar)
+	  irt_setphi(IR(rref)->t);
+	emitir_raw(IRT(IR_PHI, irt_type(ir->t)), lref, rref);
+      }
     } else {  /* Otherwise eliminate PHI. */
     } else {  /* Otherwise eliminate PHI. */
       irt_clearmark(ir->t);
       irt_clearmark(ir->t);
       irt_clearphi(ir->t);
       irt_clearphi(ir->t);