Mercurial > hg > graal-compiler
diff graal/GraalCompiler/src/com/sun/c1x/value/FrameState.java @ 2763:5e8a69041cd7
Model phi inputs as direct inputs in the graph instead of referring to the framestates of the predecessors.
author | Thomas Wuerthinger <thomas@wuerthinger.net> |
---|---|
date | Mon, 23 May 2011 14:51:18 +0200 |
parents | bdaf31906620 |
children | 99912abb3ff7 |
line wrap: on
line diff
--- a/graal/GraalCompiler/src/com/sun/c1x/value/FrameState.java Sat May 21 17:56:11 2011 +0200 +++ b/graal/GraalCompiler/src/com/sun/c1x/value/FrameState.java Mon May 23 14:51:18 2011 +0200 @@ -256,17 +256,20 @@ * @param block the block begin for which we are creating the phi * @param i the index into the stack for which to create a phi */ - public void setupPhiForStack(BlockBegin block, int i) { + public Phi setupPhiForStack(BlockBegin block, int i) { Value p = stackAt(i); if (p != null) { if (p instanceof Phi) { Phi phi = (Phi) p; if (phi.block() == block && phi.isOnStack() && phi.stackIndex() == i) { - return; + return phi; } } - inputs().set(localsSize + i, new Phi(p.kind, block, -i - 1, graph())); + Phi phi = new Phi(p.kind, block, -i - 1, graph()); + inputs().set(localsSize + i, phi); + return phi; } + return null; } /** @@ -274,15 +277,17 @@ * @param block the block begin for which we are creating the phi * @param i the index of the local variable for which to create the phi */ - public void setupPhiForLocal(BlockBegin block, int i) { + public Phi setupPhiForLocal(BlockBegin block, int i) { Value p = localAt(i); if (p instanceof Phi) { Phi phi = (Phi) p; if (phi.block() == block && phi.isLocal() && phi.localIndex() == i) { - return; + return phi; } } - storeLocal(i, new Phi(p.kind, block, i, graph())); + Phi phi = new Phi(p.kind, block, i, graph()); + storeLocal(i, phi); + return phi; } /** @@ -312,28 +317,6 @@ return localsSize + stackSize; } - public void checkPhis(BlockBegin block, FrameState other) { - checkSize(other); - for (int i = 0; i < valuesSize(); i++) { - Value x = valueAt(i); - Value y = other.valueAt(i); - if (x != null && x != y) { - if (x instanceof Phi) { - Phi phi = (Phi) x; - if (phi.block() == block) { - for (int j = 0; j < phi.phiInputCount(); j++) { - if (phi.inputIn(other) == null) { - throw new CiBailout("phi " + phi + " has null operand at new predecessor"); - } - } - continue; - } - } - throw new CiBailout("instruction is not a phi or null at " + i); - } - } - } - private void checkSize(FrameStateAccess other) { if (other.stackSize() != stackSize()) { throw new CiBailout("stack sizes do not match"); @@ -342,7 +325,7 @@ } } - public void merge(BlockBegin block, FrameStateAccess other) { + public void merge(BlockBegin block, FrameStateAccess other, boolean blockAppended) { checkSize(other); for (int i = 0; i < valuesSize(); i++) { Value x = valueAt(i); @@ -359,12 +342,34 @@ inputs().set(i, null); continue; } + Phi phi = null; if (i < localsSize) { // this a local - setupPhiForLocal(block, i); + phi = setupPhiForLocal(block, i); } else { // this is a stack slot - setupPhiForStack(block, i - localsSize); + phi = setupPhiForStack(block, i - localsSize); + } + + Phi originalPhi = phi; + if (phi.phiInputCount() == 0) { + int size = block.predecessors().size(); + if (blockAppended) { + size--; + } + for (int j = 0; j < size; ++j) { + phi = phi.addInput(x); + } + phi = phi.addInput(y); + } else { + phi = phi.addInput(y); + } + if (originalPhi != phi) { + for (int j = 0; j < other.localsSize() + other.stackSize(); ++j) { + if (other.valueAt(j) == originalPhi) { + other.setValueAt(j, phi); + } + } } } } @@ -467,4 +472,9 @@ public void visitFrameState(FrameState i) { // nothing to do for now } + + @Override + public void setValueAt(int j, Value v) { + inputs().set(j, v); + } }