# HG changeset patch # User Thomas Wuerthinger # Date 1305723825 -7200 # Node ID 785e9ecdcc693fb281c34974151b8ea38bcf9df3 # Parent 773189811d10881185335cf5ce6f483edbf9a869 Removed the instruction substitutor. diff -r 773189811d10 -r 785e9ecdcc69 graal/GraalCompiler/src/com/sun/c1x/C1XCompilation.java --- a/graal/GraalCompiler/src/com/sun/c1x/C1XCompilation.java Wed May 18 14:40:29 2011 +0200 +++ b/graal/GraalCompiler/src/com/sun/c1x/C1XCompilation.java Wed May 18 15:03:45 2011 +0200 @@ -246,6 +246,7 @@ initFrameMap(hir.maxLocks()); lirGenerator = compiler.backend.newLIRGenerator(this); + for (BlockBegin begin : hir.linearScanOrder()) { lirGenerator.doBlock(begin); } diff -r 773189811d10 -r 785e9ecdcc69 graal/GraalCompiler/src/com/sun/c1x/graph/BlockUtil.java --- a/graal/GraalCompiler/src/com/sun/c1x/graph/BlockUtil.java Wed May 18 14:40:29 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2009, 2010, 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.graph; - -import com.sun.c1x.ir.*; - -/** - * The {@code BlockUtil} class contains a number of utilities for manipulating a CFG of basic blocks. - * - * @author Ben L. Titzer - */ -public class BlockUtil { - - /** - * Disconnects the specified block from all other blocks. - * @param block the block to remove from the graph - */ - public static void disconnectFromGraph(BlockBegin block) { - for (BlockEnd p : block.blockPredecessors()) { - p.blockSuccessors().remove(block); - } - for (BlockBegin s : block.end().blockSuccessors()) { - s.blockPredecessors().remove(block); - } - } -} diff -r 773189811d10 -r 785e9ecdcc69 graal/GraalCompiler/src/com/sun/c1x/graph/GraphBuilder.java --- a/graal/GraalCompiler/src/com/sun/c1x/graph/GraphBuilder.java Wed May 18 14:40:29 2011 +0200 +++ b/graal/GraalCompiler/src/com/sun/c1x/graph/GraphBuilder.java Wed May 18 15:03:45 2011 +0200 @@ -147,11 +147,6 @@ flags |= Flag.NoSafepoints.mask; } - // 1. create the start block - ir.startBlock = new BlockBegin(0, ir.nextBlockNumber(), graph); - BlockBegin startBlock = ir.startBlock; - graph.root().setStart(startBlock); - // 2. compute the block map, setup exception handlers and get the entrypoint(s) BlockMap blockMap = compilation.getBlockMap(rootMethod); @@ -169,7 +164,11 @@ blockList[block.startBci] = blockBegin; } - BlockBegin stdEntry = blockList[0]; + + // 1. create the start block + ir.startBlock = new BlockBegin(0, ir.nextBlockNumber(), graph); + BlockBegin startBlock = ir.startBlock; + graph.root().setStart(startBlock); curBlock = startBlock; RiExceptionHandler[] handlers = rootMethod.exceptionHandlers(); @@ -195,12 +194,13 @@ lastInstr = startBlock; lastInstr.appendNext(null, -1); + BlockBegin entryBlock = blockList[0]; if (isSynchronized(rootMethod.accessFlags())) { // 4A.1 add a monitor enter to the start block rootMethodSynchronizedObject = synchronizedObject(frameState, compilation.method); genMonitorEnter(rootMethodSynchronizedObject, Instruction.SYNCHRONIZATION_ENTRY_BCI); // 4A.2 finish the start block - finishStartBlock(startBlock, stdEntry); + finishStartBlock(startBlock, entryBlock); // 4A.3 setup an exception handler to unlock the root method synchronized object syncHandler = new BlockBegin(Instruction.SYNCHRONIZATION_ENTRY_BCI, ir.nextBlockNumber(), graph); @@ -213,13 +213,13 @@ addExceptionHandler(h); } else { // 4B.1 simply finish the start block - finishStartBlock(startBlock, stdEntry); + finishStartBlock(startBlock, entryBlock); } // 5. SKIPPED: look for intrinsics // 6B.1 do the normal parsing - addToWorkList(stdEntry); + addToWorkList(entryBlock); iterateAllBlocks(); if (syncHandler != null && syncHandler.stateBefore() != null) { diff -r 773189811d10 -r 785e9ecdcc69 graal/GraalCompiler/src/com/sun/c1x/opt/InstructionSubstituter.java --- a/graal/GraalCompiler/src/com/sun/c1x/opt/InstructionSubstituter.java Wed May 18 14:40:29 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,101 +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.ir.*; -import com.sun.c1x.value.*; -import com.sun.c1x.graph.IR; - -/** - * This class allows instructions to be substituted within an IR graph. It allows - * registering substitutions and iterates over the instructions of a program and replaces - * the occurrence of each instruction with its substitution, if it has one. - */ -public final class InstructionSubstituter implements BlockClosure, ValueClosure { - - final IR ir; - boolean hasSubstitution; - - public InstructionSubstituter(IR ir) { - this.ir = ir; - } - - public void apply(BlockBegin block) { - Instruction last = null; - if (block.exceptionHandlerStates() != null) { - for (FrameState s : block.exceptionHandlerStates()) { - s.inputValuesDo(this); - } - } - for (Instruction n = block; n != null; n = last.next()) { - n.allValuesDo(this); - if (n.subst != null && last != null) { - // this instruction has a substitution, skip it - last.resetNext(n.next()); - } else { - last = n; - } - } - } - - public void finish() { - if (hasSubstitution) { - ir.startBlock.iterateAnyOrder(this, false); - } - } - - public boolean hasSubst(Value i) { - return i.subst != null; - } - - public void setSubst(Value i, Value n) { - if (i == n) { - i.subst = null; - } else { - hasSubstitution = true; - i.subst = n; - } - } - - public Value getSubst(Value i) { - Value p = i; - while (true) { - if (p.subst == null) { - break; - } - p = p.subst; - } - return p; - } - - public Value apply(Value i) { - if (i instanceof FrameState) { - FrameState state = (FrameState) i; - state.inputValuesDo(this); - } - if (i != null) { - return getSubst(i); - } - return i; - } -} diff -r 773189811d10 -r 785e9ecdcc69 graal/GraalCompiler/src/com/sun/c1x/opt/PhiSimplifier.java --- a/graal/GraalCompiler/src/com/sun/c1x/opt/PhiSimplifier.java Wed May 18 14:40:29 2011 +0200 +++ b/graal/GraalCompiler/src/com/sun/c1x/opt/PhiSimplifier.java Wed May 18 15:03:45 2011 +0200 @@ -34,13 +34,10 @@ public final class PhiSimplifier implements BlockClosure { final IR ir; - final InstructionSubstituter subst; public PhiSimplifier(IR ir) { this.ir = ir; - this.subst = new InstructionSubstituter(ir); ir.startBlock.iterateAnyOrder(this, false); - subst.finish(); } /** @@ -62,10 +59,7 @@ return x; } Phi phi = (Phi) x; - if (phi.hasSubst()) { - // already substituted, but the subst could be a phi itself, so simplify - return simplify(subst.getSubst(phi)); - } else if (phi.checkFlag(Value.Flag.PhiCannotSimplify)) { + if (phi.checkFlag(Value.Flag.PhiCannotSimplify)) { // already tried, cannot simplify this phi return phi; } else if (phi.checkFlag(Value.Flag.PhiVisited)) { @@ -121,7 +115,6 @@ // successfully simplified the phi assert phiSubst != null : "illegal phi function"; phi.clearFlag(Value.Flag.PhiVisited); - subst.setSubst(phi, phiSubst); return phiSubst; } }