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; }