# HG changeset patch # User Josef Eisl # Date 1429781436 -7200 # Node ID 2f2fac20c446386c53699d7fbc36dd9535cc0e0d # Parent 422c91256dd942c22821bdce488835f4b1dbb6c5 LIRVerifier: verify PHIs. diff -r 422c91256dd9 -r 2f2fac20c446 graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRVerifier.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRVerifier.java Wed Apr 29 11:57:47 2015 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRVerifier.java Thu Apr 23 11:30:36 2015 +0200 @@ -35,6 +35,7 @@ import com.oracle.graal.lir.LIRInstruction.OperandFlag; import com.oracle.graal.lir.LIRInstruction.OperandMode; import com.oracle.graal.lir.framemap.*; +import com.oracle.graal.lir.ssa.*; public final class LIRVerifier { @@ -128,6 +129,9 @@ LIRInstruction last = lir.getLIRforBlock(block).get(lir.getLIRforBlock(block).size() - 1); assert last instanceof StandardOp.JumpOp : "block with successor must end with unconditional jump"; } + if (block.getPredecessorCount() > 1) { + SSAUtils.verifyPhi(lir, block); + } for (LIRInstruction op : lir.getLIRforBlock(block)) { curInstruction = op; diff -r 422c91256dd9 -r 2f2fac20c446 graal/com.oracle.graal.lir/src/com/oracle/graal/lir/ssa/SSAUtils.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/ssa/SSAUtils.java Wed Apr 29 11:57:47 2015 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/ssa/SSAUtils.java Thu Apr 23 11:30:36 2015 +0200 @@ -103,4 +103,14 @@ return new SSAVerifier(lir).verify(); } + public static void verifyPhi(LIR lir, AbstractBlockBase merge) { + assert merge.getPredecessorCount() > 1; + for (AbstractBlockBase pred : merge.getPredecessors()) { + forEachPhiValuePair(lir, merge, pred, (phiIn, phiOut) -> { + assert phiIn.getLIRKind().equals(phiOut.getLIRKind()) || + (phiIn.getPlatformKind().equals(phiOut.getPlatformKind()) && phiIn.getLIRKind().isDerivedReference() && phiOut.getLIRKind().isValue()); + }); + } + } + }