changeset 21226:2f2fac20c446

LIRVerifier: verify PHIs.
author Josef Eisl <josef.eisl@jku.at>
date Thu, 23 Apr 2015 11:30:36 +0200
parents 422c91256dd9
children f85711ac631c
files graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRVerifier.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/ssa/SSAUtils.java
diffstat 2 files changed, 14 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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;
--- 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());
+            });
+        }
+    }
+
 }