irbasicblock.java

来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 133 行

JAVA
133
字号
/*
 * $Id: IRBasicBlock.java,v 1.5 2004/02/16 18:55:52 epr Exp $
 */
package org.jnode.vm.compiler.ir;

import java.util.List;

import org.jnode.util.BootableArrayList;
import org.jnode.vm.bytecode.BasicBlock;
import org.jnode.vm.compiler.ir.quad.AssignQuad;

/**
 * @author Madhu Siddalingaiah
 * 
 */
public class IRBasicBlock extends BasicBlock {
	private BootableArrayList predecessors;
	private BootableArrayList successors;
	private Variable[] variables;
	private BootableArrayList phiReferences;

	// This is useful for finding the bottom of a loop.
	private IRBasicBlock lastPredecessor;

	/**
	 * @param startPC
	 * @param endPC
	 * @param startOfExceptionHandler
	 */
	public IRBasicBlock(
		int startPC,
		int endPC,
		boolean startOfExceptionHandler) {
		super(startPC, endPC, startOfExceptionHandler);
		this.predecessors = new BootableArrayList();
		this.successors = new BootableArrayList();
		this.phiReferences = new BootableArrayList();
	}

	/**
	 * @param address
	 */
	public IRBasicBlock(int address) {
		this(address, -1, false);
	}

	/**
	 * @return a List containing BasicBlocks that may precede this block
	 */
	public List getPredecessors() {
		return predecessors;
	}

	/**
	 * @return a List containing BasicBlocks that may succeed this block
	 */
	public List getSuccessors() {
		return successors;
	}

	final void addPredecessor(IRBasicBlock block) {
		if (!this.predecessors.contains(block)) {
			this.predecessors.add(block);
			if (lastPredecessor == null ||
				block.getEndPC() > lastPredecessor.getEndPC()) {
				lastPredecessor = block;
			}
		}
		// Closure
		List preds = block.getPredecessors();
		int n = preds.size();
		for (int i=0; i<n; i+=1) {
			IRBasicBlock pred = (IRBasicBlock) preds.get(i);
			if (!predecessors.contains(pred)) {
				addPredecessor(pred);
			}
			pred.addSuccessor(this);
		}
	}

	// TODO This isn't complete, but it's good enough for now...
	final void addSuccessor(IRBasicBlock block) {
		if (!this.successors.contains(block)) {
			this.successors.add(block);
		}
	}

	/**
	 * @return
	 */
	public Variable[] getVariables() {
		return variables;
	}

	/**
	 * @param variables
	 */
	public void setVariables(Variable[] variables) {
		this.variables = variables;
	}

	/**
	 * @param phi
	 */
	public void addPhiReference(PhiOperand phi) {
		phiReferences.add(phi);
	}

	/**
	 * 
	 */
	public void resolvePhiReferences() {
		int n = phiReferences.size();
		for (int i=0; i<n; i+=1) {
			PhiOperand phi = (PhiOperand) phiReferences.get(i);
			Variable op = variables[phi.getIndex()];
			AssignQuad assignQuad = op.getAssignQuad();
			IRBasicBlock block = assignQuad.getBasicBlock();
			if (block == this) {
				assignQuad.setDeadCode(false);
				phi.addSource(op);
			}
		}
	}

	/**
	 * @return
	 */
	public IRBasicBlock getLastPredecessor() {
		return lastPredecessor;
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?