From fe449c868f2561f3e0494da9c5357284ccf95861 Mon Sep 17 00:00:00 2001 From: jochen Date: Wed, 28 Oct 1998 18:26:25 +0000 Subject: [PATCH] removeSwap added git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@95 379699f6-c40d-0410-875b-85095c16579e --- jode/jode/flow/RemoveEmpty.java | 50 ++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/jode/jode/flow/RemoveEmpty.java b/jode/jode/flow/RemoveEmpty.java index 6f700e9..461c7e9 100644 --- a/jode/jode/flow/RemoveEmpty.java +++ b/jode/jode/flow/RemoveEmpty.java @@ -24,7 +24,7 @@ import jode.NopOperator; public class RemoveEmpty implements Transformation { public boolean transform (FlowBlock fb) { - return (removeNop(fb) || removeEmpty(fb)); + return (removeNop(fb) || removeSwap(fb) || removeEmpty(fb)); } public boolean removeNop(FlowBlock flow) { @@ -55,6 +55,54 @@ public class RemoveEmpty implements Transformation { return false; } + public boolean removeSwap(FlowBlock flow) { + /* Remove non needed swaps; convert: + * + * PUSH expr1 + * PUSH expr2 + * SWAP + * + * to: + * + * PUSH expr2 + * PUSH expr1 + */ + StructuredBlock block = flow.lastModified; + if (block instanceof SpecialBlock + && ((SpecialBlock)block).type == SpecialBlock.SWAP + && block.outer instanceof SequentialBlock + && block.outer.outer instanceof SequentialBlock + && block.outer.getSubBlocks()[0] instanceof InstructionBlock + && block.outer.outer.getSubBlocks()[0] + instanceof InstructionBlock) { + + InstructionBlock block1 + = (InstructionBlock) block.outer.outer.getSubBlocks()[0]; + InstructionBlock block2 + = (InstructionBlock) block.outer.getSubBlocks()[0]; + + if (block1.getInstruction().isVoid() + || block2.getInstruction().isVoid()) + return false; + /* PUSH expr1 == block1 + * PUSH expr2 + * SWAP + */ + block.outer.replace(block1.outer); + /* PUSH expr2 + * SWAP + */ + block1.replace(block); + block1.moveJump(block.jump); + /* PUSH expr2 + * PUSH expr1 + */ + flow.lastModified = block1; + return true; + } + return false; + } + public boolean removeEmpty(FlowBlock flow) { StructuredBlock lastBlock = flow.lastModified; if (lastBlock instanceof EmptyBlock &&