diff --git a/src/ir/BasicBlock.java b/src/ir/BasicBlock.java
index c3f34a96999ae850df128ea4b81aa52d4c7808d8..d9e007ba3c3e7220d11013f2cd21b117a4ec9e20 100644
--- a/src/ir/BasicBlock.java
+++ b/src/ir/BasicBlock.java
@@ -195,6 +195,15 @@ public class BasicBlock extends User
         replaceOperandCO(index, newPred);
     }
 
+    public void resetPredecessorsOrder(List<BasicBlock> newPredecessorsOrder) {
+        final var newPreds = new HashSet<>(newPredecessorsOrder);
+        final var oldPreds = new HashSet<>(getPredecessors());
+        Log.ensure(newPreds.equals(oldPreds), "Predecessors are different");
+
+        removeOperandAllCO();
+        newPredecessorsOrder.forEach(this::addOperandCO);
+    }
+
 
     //========================================== Value/User 相关 =====================================================//
 
diff --git a/src/pass/ir/FunctionInline.java b/src/pass/ir/FunctionInline.java
index 7c036fac0934ecd455b875fe8fc7c8c5f1c0afc1..e71dcb6aa245dbff6041b17d43d50f36535bbc8f 100644
--- a/src/pass/ir/FunctionInline.java
+++ b/src/pass/ir/FunctionInline.java
@@ -226,10 +226,7 @@ public class FunctionInline implements IRPass {
         public List<BasicBlock> convert() {
             for (final var block : callee) {
                 final var newBlock = getOrCreate(block);
-                for (final var inst : block.allInst()) {
-                    newBlock.addInstAtEnd(getOrCreate(inst));
-                }
-
+                block.stream().map(this::getOrCreate).forEach(newBlock::add);
                 newBlock.adjustPhiEnd();
             }
 
@@ -239,9 +236,19 @@ public class FunctionInline implements IRPass {
                 ((PhiInst) first).setIncomingCO(returnValues);
             }
 
+            // 要保证克隆后各个基本块的前继顺序与克隆之前一样, 防止 phi 的 incoming value 顺序跟 block 的不一样
+            for (final var oldBlock : callee) {
+                final var newBlock = getOrCreate(oldBlock);
+                final var newPreds = oldBlock.getPredecessors().stream()
+                    .map(this::getOrCreate).collect(Collectors.toList());
+
+                newBlock.resetPredecessorsOrder(newPreds);
+            }
+
             return callee.stream().map(this::getOrCreate).collect(Collectors.toList());
         }
 
+
         @SuppressWarnings("unchecked")
         public <T extends Value> T getOrCreate(T old) {
             return (T) visit(old);
diff --git a/src/pass/ir/memory/MemCache.java b/src/pass/ir/memory/MemCache.java
index 1a03a0372132f73798b573f7f85ff9e3eea4a4be..d2c8f2b7246e048469e47739498bd798e85bbf5b 100644
--- a/src/pass/ir/memory/MemCache.java
+++ b/src/pass/ir/memory/MemCache.java
@@ -22,7 +22,12 @@ class MemCache {
     }
 
     public static MemCache copyFrom(MemCache other) {
-        return new MemCache(other);
+        final var result = empty();
+        for (final var entry : other.cache.entrySet()) {
+            result.cache.put(entry.getKey(), entry.getValue().deepCopy());
+        }
+
+        return result;
     }
 
     public void setByInit(MemInitInst init) {
diff --git a/src/pass/ir/memory/MemPositionHandler.java b/src/pass/ir/memory/MemPositionHandler.java
index 744b4565c2e953ee1d789015d55d05238116abb7..87ab1dc8fff3bfe97e037b1337dce00f6ba4c01d 100644
--- a/src/pass/ir/memory/MemPositionHandler.java
+++ b/src/pass/ir/memory/MemPositionHandler.java
@@ -128,6 +128,23 @@ class MemPositionHandler {
             || this.isVariable() && other.isVariable();
     }
 
+    public MemPositionHandler deepCopy() {
+        if (isUndef()) {
+            return new MemPositionHandler();
+        } else if (isVariable()) {
+            return new MemPositionHandler(value, null);
+        } else {
+            Log.ensure(isArray());
+
+            final var newElements = new HashMap<Integer, MemPositionHandler>();
+            for (final var entry : elements.entrySet()) {
+                newElements.put(entry.getKey(), entry.getValue().deepCopy());
+            }
+
+            return new MemPositionHandler(null, newElements);
+        }
+    }
+
     /**
      * <h3>合并两个 MemPositionHandler</h3>
      * <p>
@@ -175,10 +192,6 @@ class MemPositionHandler {
         this.elements = elements;
     }
 
-    public MemPositionHandler copy() {
-        return new MemPositionHandler(value, new HashMap<>(elements));
-    }
-
     private Map<Integer, MemPositionHandler> elements;
     private Value value;
 }