# HG changeset patch # User Doug Simon # Date 1378385446 -7200 # Node ID 331f7590b7417d0b982bd38094b86e4a3724df5f # Parent be9e54fbb69928dbd1a7d78d7692a560feffaba0 modified Node.removeUsage to do less copying (GRAAL-452) diff -r be9e54fbb699 -r 331f7590b741 graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java --- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java Thu Sep 05 10:59:01 2013 +0200 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java Thu Sep 05 14:50:46 2013 +0200 @@ -279,20 +279,25 @@ } } - private Node removeFirstExtraUsage() { - Node res = null; - if (extraUsages.length > 0) { - res = extraUsages[0]; - for (int i = 1; i < extraUsages.length; ++i) { - Node n = extraUsages[i]; - extraUsages[i - 1] = n; - if (n == null) { - break; - } + private Node removeLastUsage() { + for (int i = extraUsages.length - 1; i >= 0; --i) { + Node n = extraUsages[i]; + if (n != null) { + extraUsages[i] = null; + return n; } - extraUsages[extraUsages.length - 1] = null; + } + if (usage1 != null) { + Node n = usage1; + usage1 = null; + return n; } - return res; + if (usage0 != null) { + Node n = usage0; + usage0 = null; + return n; + } + return null; } /** @@ -309,32 +314,41 @@ return false; } if (usage0 == node) { - usage0 = usage1; if (usage1 != null) { - usage1 = removeFirstExtraUsage(); + // usage0 is not the last element + usage0 = removeLastUsage(); + } else { + // usage0 is the last element + usage0 = null; } return true; } - if (usage1 == null) { - return false; - } if (usage1 == node) { - usage1 = removeFirstExtraUsage(); + if (extraUsages.length != 0 && extraUsages[0] != null) { + // usage1 is not the last element + usage1 = removeLastUsage(); + } else { + // usage1 is the last element + usage1 = null; + } return true; } - int length = extraUsages.length; - for (int i = 0; i < length; i++) { - if (extraUsages[i] == node) { - for (int j = i + 1; j < length; j++) { - Node toMove = extraUsages[j]; - extraUsages[j - 1] = toMove; - if (toMove == null) { - break; + for (int i = extraUsages.length - 1; i >= 0; --i) { + Node n = extraUsages[i]; + if (n != null) { + if (n == node) { + extraUsages[i] = null; + return true; + } else { + for (int j = 0; j < i; j++) { + if (extraUsages[j] == node) { + // Move the last element to the position of 'node' + extraUsages[j] = n; + extraUsages[i] = null; + return true; + } } } - extraUsages[length - 1] = null; - - return true; } } return false;