changeset 2738:88123130ede6

Moved phi simplifier.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Fri, 20 May 2011 10:46:15 +0200
parents 99c84a06bb64
children bdaf31906620 6e3cc55cf54e
files graal/GraalCompiler/src/com/sun/c1x/gen/LIRGenerator.java graal/GraalCompiler/src/com/sun/c1x/gen/PhiSimplifier.java graal/GraalCompiler/src/com/sun/c1x/opt/PhiSimplifier.java
diffstat 3 files changed, 121 insertions(+), 122 deletions(-) [+]
line wrap: on
line diff
--- a/graal/GraalCompiler/src/com/sun/c1x/gen/LIRGenerator.java	Fri May 20 10:40:39 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/gen/LIRGenerator.java	Fri May 20 10:46:15 2011 +0200
@@ -38,7 +38,6 @@
 import com.sun.c1x.graph.*;
 import com.sun.c1x.ir.*;
 import com.sun.c1x.lir.*;
-import com.sun.c1x.opt.*;
 import com.sun.c1x.util.*;
 import com.sun.c1x.value.*;
 import com.sun.cri.bytecode.*;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/GraalCompiler/src/com/sun/c1x/gen/PhiSimplifier.java	Fri May 20 10:46:15 2011 +0200
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.c1x.gen;
+
+import com.sun.c1x.graph.*;
+import com.sun.c1x.ir.*;
+import com.sun.c1x.value.*;
+
+/**
+ * The {@code PhiSimplifier} class is a helper class that can reduce phi instructions.
+ *
+ * @author Ben L. Titzer
+ */
+public final class PhiSimplifier implements BlockClosure {
+
+    final IR ir;
+
+    public PhiSimplifier(IR ir) {
+        this.ir = ir;
+        ir.getHIRStartBlock().iterateAnyOrder(this, false);
+    }
+
+    /**
+     * This method is called for each block and processes any phi statements in the block.
+     * @param block the block to apply the simplification to
+     */
+    public void apply(BlockBegin block) {
+        FrameState state = block.stateBefore();
+        for (int i = 0; i < state.stackSize(); i++) {
+            simplify(state.stackAt(i));
+        }
+        for (int i = 0; i < state.localsSize(); i++) {
+            simplify(state.localAt(i));
+        }
+    }
+
+    Value simplify(Value x) {
+        if (x == null || !(x instanceof Phi)) {
+            return x;
+        }
+        Phi phi = (Phi) x;
+        if (phi.checkFlag(Value.Flag.PhiCannotSimplify)) {
+            // already tried, cannot simplify this phi
+            return phi;
+        } else if (phi.checkFlag(Value.Flag.PhiVisited)) {
+            // break cycles in phis
+            return phi;
+        } else if (phi.isIllegal()) {
+            // don't bother with illegals
+            return phi;
+        } else {
+            // attempt to simplify the phi by recursively simplifying its operands
+            phi.setFlag(Value.Flag.PhiVisited);
+            Value phiSubst = null;
+            int max = phi.phiInputCount();
+            boolean cannotSimplify = false;
+            for (int i = 0; i < max; i++) {
+                Value oldInstr = phi.inputAt(i);
+
+                if (oldInstr == null || oldInstr.isIllegal() || oldInstr.isDeadPhi()) {
+                    // if one operand is illegal, make the entire phi illegal
+                    phi.makeDead();
+                    phi.clearFlag(Value.Flag.PhiVisited);
+                    return phi;
+                }
+
+                Value newInstr = simplify(oldInstr);
+
+                if (newInstr == null || newInstr.isIllegal() || newInstr.isDeadPhi()) {
+                    // if the subst instruction is illegal, make the entire phi illegal
+                    phi.makeDead();
+                    phi.clearFlag(Value.Flag.PhiVisited);
+                    return phi;
+                }
+
+                // attempt to simplify this operand
+                if (!cannotSimplify) {
+
+                    if (newInstr != phi && newInstr != phiSubst) {
+                        if (phiSubst == null) {
+                            phiSubst = newInstr;
+                            continue;
+                        }
+                        // this phi cannot be simplified
+                        cannotSimplify = true;
+                    }
+                }
+            }
+            if (cannotSimplify) {
+                phi.setFlag(Value.Flag.PhiCannotSimplify);
+                phi.clearFlag(Value.Flag.PhiVisited);
+                return phi;
+            }
+
+            // successfully simplified the phi
+            assert phiSubst != null : "illegal phi function";
+            phi.clearFlag(Value.Flag.PhiVisited);
+            return phiSubst;
+        }
+    }
+}
--- a/graal/GraalCompiler/src/com/sun/c1x/opt/PhiSimplifier.java	Fri May 20 10:40:39 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,121 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.sun.c1x.opt;
-
-import com.sun.c1x.graph.*;
-import com.sun.c1x.ir.*;
-import com.sun.c1x.value.*;
-
-/**
- * The {@code PhiSimplifier} class is a helper class that can reduce phi instructions.
- *
- * @author Ben L. Titzer
- */
-public final class PhiSimplifier implements BlockClosure {
-
-    final IR ir;
-
-    public PhiSimplifier(IR ir) {
-        this.ir = ir;
-        ir.getHIRStartBlock().iterateAnyOrder(this, false);
-    }
-
-    /**
-     * This method is called for each block and processes any phi statements in the block.
-     * @param block the block to apply the simplification to
-     */
-    public void apply(BlockBegin block) {
-        FrameState state = block.stateBefore();
-        for (int i = 0; i < state.stackSize(); i++) {
-            simplify(state.stackAt(i));
-        }
-        for (int i = 0; i < state.localsSize(); i++) {
-            simplify(state.localAt(i));
-        }
-    }
-
-    Value simplify(Value x) {
-        if (x == null || !(x instanceof Phi)) {
-            return x;
-        }
-        Phi phi = (Phi) x;
-        if (phi.checkFlag(Value.Flag.PhiCannotSimplify)) {
-            // already tried, cannot simplify this phi
-            return phi;
-        } else if (phi.checkFlag(Value.Flag.PhiVisited)) {
-            // break cycles in phis
-            return phi;
-        } else if (phi.isIllegal()) {
-            // don't bother with illegals
-            return phi;
-        } else {
-            // attempt to simplify the phi by recursively simplifying its operands
-            phi.setFlag(Value.Flag.PhiVisited);
-            Value phiSubst = null;
-            int max = phi.phiInputCount();
-            boolean cannotSimplify = false;
-            for (int i = 0; i < max; i++) {
-                Value oldInstr = phi.inputAt(i);
-
-                if (oldInstr == null || oldInstr.isIllegal() || oldInstr.isDeadPhi()) {
-                    // if one operand is illegal, make the entire phi illegal
-                    phi.makeDead();
-                    phi.clearFlag(Value.Flag.PhiVisited);
-                    return phi;
-                }
-
-                Value newInstr = simplify(oldInstr);
-
-                if (newInstr == null || newInstr.isIllegal() || newInstr.isDeadPhi()) {
-                    // if the subst instruction is illegal, make the entire phi illegal
-                    phi.makeDead();
-                    phi.clearFlag(Value.Flag.PhiVisited);
-                    return phi;
-                }
-
-                // attempt to simplify this operand
-                if (!cannotSimplify) {
-
-                    if (newInstr != phi && newInstr != phiSubst) {
-                        if (phiSubst == null) {
-                            phiSubst = newInstr;
-                            continue;
-                        }
-                        // this phi cannot be simplified
-                        cannotSimplify = true;
-                    }
-                }
-            }
-            if (cannotSimplify) {
-                phi.setFlag(Value.Flag.PhiCannotSimplify);
-                phi.clearFlag(Value.Flag.PhiVisited);
-                return phi;
-            }
-
-            // successfully simplified the phi
-            assert phiSubst != null : "illegal phi function";
-            phi.clearFlag(Value.Flag.PhiVisited);
-            return phiSubst;
-        }
-    }
-}