Mercurial > hg > graal-compiler
view graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/LIRFrameStateBuilder.java @ 14821:71ec7648c56c
Fix baseline compiler warnings.
author | Josef Eisl <josef.eisl@jku.at> |
---|---|
date | Wed, 19 Mar 2014 15:26:44 +0100 |
parents | 80147dac0d6e |
children | 2ed3233503b8 |
line wrap: on
line source
package com.oracle.graal.baseline; import com.oracle.graal.api.meta.*; import com.oracle.graal.java.*; import com.oracle.graal.lir.*; public class LIRFrameStateBuilder extends AbstractFrameStateBuilder<Variable> { private final Variable[] locals; private final Variable[] stack; private Variable[] lockedObjects; public LIRFrameStateBuilder(ResolvedJavaMethod method) { super(method); this.locals = new Variable[method.getMaxLocals()]; // we always need at least one stack slot (for exceptions) this.stack = new Variable[Math.max(1, method.getMaxStackSize())]; } protected LIRFrameStateBuilder(LIRFrameStateBuilder other) { super(other); // TODO Auto-generated constructor stub locals = other.locals; stack = other.stack; lockedObjects = other.lockedObjects; } @Override public int localsSize() { return locals.length; } @Override public Variable localAt(int i) { return locals[i]; } @Override public Variable stackAt(int i) { return stack[i]; } @Override public Variable loadLocal(int i) { Variable x = locals[i]; assert !isTwoSlot(x.getKind()) || locals[i + 1] == null; assert i == 0 || locals[i - 1] == null || !isTwoSlot(locals[i - 1].getKind()); return x; } @Override public void storeLocal(int i, Variable x) { assert x == null || x.getKind() != Kind.Void && x.getKind() != Kind.Illegal : "unexpected value: " + x; locals[i] = x; if (x != null && isTwoSlot(x.getKind())) { // if this is a double word, then kill i+1 locals[i + 1] = null; } if (x != null && i > 0) { Variable p = locals[i - 1]; if (p != null && isTwoSlot(p.getKind())) { // if there was a double word at i - 1, then kill it locals[i - 1] = null; } } } @Override public void storeStack(int i, Variable x) { assert x == null || (stack[i] == null || x.getKind() == stack[i].getKind()) : "Method does not handle changes from one-slot to two-slot values or non-alive values"; stack[i] = x; } @Override public void push(Kind kind, Variable x) { assert x.getKind() != Kind.Void && x.getKind() != Kind.Illegal; xpush(assertKind(kind, x)); if (isTwoSlot(kind)) { xpush(null); } } @Override public void xpush(Variable x) { assert x == null || (x.getKind() != Kind.Void && x.getKind() != Kind.Illegal); stack[stackSize++] = x; } @Override public void ipush(Variable x) { xpush(assertInt(x)); } @Override public void fpush(Variable x) { xpush(assertFloat(x)); } @Override public void apush(Variable x) { xpush(assertObject(x)); } @Override public void lpush(Variable x) { xpush(assertLong(x)); } @Override public void dpush(Variable x) { xpush(assertDouble(x)); } @Override public void pushReturn(Kind kind, Variable x) { if (kind != Kind.Void) { push(kind.getStackKind(), x); } } @Override public Variable pop(Kind kind) { assert kind != Kind.Void; if (isTwoSlot(kind)) { xpop(); } return assertKind(kind, xpop()); } @Override public Variable xpop() { Variable result = stack[--stackSize]; return result; } @Override public Variable ipop() { return assertInt(xpop()); } @Override public Variable fpop() { return assertFloat(xpop()); } @Override public Variable apop() { return assertObject(xpop()); } @Override public Variable lpop() { assertHigh(xpop()); return assertLong(xpop()); } @Override public Variable dpop() { assertHigh(xpop()); return assertDouble(xpop()); } @Override public Variable[] popArguments(int slotSize, int argSize) { int base = stackSize - slotSize; Variable[] r = new Variable[argSize]; int argIndex = 0; int stackindex = 0; while (stackindex < slotSize) { Variable element = stack[base + stackindex]; assert element != null; r[argIndex++] = element; stackindex += stackSlots(element.getKind()); } stackSize = base; return r; } @Override public Variable peek(int argumentNumber) { int idx = stackSize() - 1; for (int i = 0; i < argumentNumber; i++) { if (stackAt(idx) == null) { idx--; assert isTwoSlot(stackAt(idx).getKind()); } idx--; } return stackAt(idx); } private static Variable assertKind(Kind kind, Variable x) { assert x != null && x.getKind() == kind : "kind=" + kind + ", value=" + x + ((x == null) ? "" : ", value.kind=" + x.getKind()); return x; } private static Variable assertLong(Variable x) { assert x != null && (x.getKind() == Kind.Long); return x; } private static Variable assertInt(Variable x) { assert x != null && (x.getKind() == Kind.Int); return x; } private static Variable assertFloat(Variable x) { assert x != null && (x.getKind() == Kind.Float); return x; } private static Variable assertObject(Variable x) { assert x != null && (x.getKind() == Kind.Object); return x; } private static Variable assertDouble(Variable x) { assert x != null && (x.getKind() == Kind.Double); return x; } private static void assertHigh(Variable x) { assert x == null; } }