Mercurial > hg > truffle
diff graal/GraalCompiler/src/com/sun/c1x/graph/GraphBuilder.java @ 2634:4dd0573f510b
FrameState fixes.
author | Thomas Wuerthinger <thomas@wuerthinger.net> |
---|---|
date | Wed, 11 May 2011 10:52:37 +0200 |
parents | 721a45190d6d |
children | 8e96b2b3a866 |
line wrap: on
line diff
--- a/graal/GraalCompiler/src/com/sun/c1x/graph/GraphBuilder.java Tue May 10 18:12:26 2011 +0200 +++ b/graal/GraalCompiler/src/com/sun/c1x/graph/GraphBuilder.java Wed May 11 10:52:37 2011 +0200 @@ -344,7 +344,8 @@ // this is a load of class constant which might be unresolved RiType riType = (RiType) con; if (!riType.isResolved() || C1XOptions.TestPatching) { - frameState.push(CiKind.Object, append(new ResolveClass(riType, RiType.Representation.JavaClass, graph))); + ResolveClass rc = new ResolveClass(riType, RiType.Representation.JavaClass, graph, frameState.create(bci())); + frameState.push(CiKind.Object, append(rc)); } else { frameState.push(CiKind.Object, append(new Constant(riType.getEncoding(Representation.JavaClass), graph))); } @@ -585,27 +586,42 @@ void genNewInstance(int cpi) { RiType type = constantPool().lookupType(cpi, NEW); + FrameState stateBefore = null; + if (!type.isResolved()) { + stateBefore = frameState.create(bci()); + } NewInstance n = new NewInstance(type, cpi, constantPool(), graph); if (memoryMap != null) { memoryMap.newInstance(n); } + n.setStateBefore(stateBefore); frameState.apush(append(n)); } void genNewTypeArray(int typeCode) { CiKind kind = CiKind.fromArrayTypeCode(typeCode); RiType elementType = compilation.runtime.asRiType(kind); - frameState.apush(append(new NewTypeArray(frameState.ipop(), elementType, graph))); + NewTypeArray nta = new NewTypeArray(frameState.ipop(), elementType, graph); + frameState.apush(append(nta)); } void genNewObjectArray(int cpi) { RiType type = constantPool().lookupType(cpi, ANEWARRAY); + FrameState stateBefore = null; + if (!type.isResolved()) { + stateBefore = frameState.create(bci()); + } NewArray n = new NewObjectArray(type, frameState.ipop(), graph); frameState.apush(append(n)); + n.setStateBefore(stateBefore); } void genNewMultiArray(int cpi) { RiType type = constantPool().lookupType(cpi, MULTIANEWARRAY); + FrameState stateBefore = null; + if (!type.isResolved()) { + stateBefore = frameState.create(bci()); + } int rank = stream().readUByte(bci() + 3); Value[] dims = new Value[rank]; for (int i = rank - 1; i >= 0; i--) { @@ -613,26 +629,41 @@ } NewArray n = new NewMultiArray(type, dims, cpi, constantPool(), graph); frameState.apush(append(n)); + n.setStateBefore(stateBefore); } void genGetField(int cpi, RiField field) { // Must copy the state here, because the field holder must still be on the stack. + FrameState stateBefore = null; + if (!field.isResolved()) { + stateBefore = frameState.create(bci()); + } LoadField load = new LoadField(frameState.apop(), field, graph); appendOptimizedLoadField(field.kind(), load); + load.setStateBefore(stateBefore); } void genPutField(int cpi, RiField field) { // Must copy the state here, because the field holder must still be on the stack. + FrameState stateBefore = null; + if (!field.isResolved()) { + stateBefore = frameState.create(bci()); + } Value value = frameState.pop(field.kind().stackKind()); - appendOptimizedStoreField(new StoreField(frameState.apop(), field, value, graph)); + StoreField store = new StoreField(frameState.apop(), field, value, graph); + appendOptimizedStoreField(store); + store.setStateBefore(stateBefore); } void genGetStatic(int cpi, RiField field) { RiType holder = field.holder(); boolean isInitialized = !C1XOptions.TestPatching && field.isResolved(); CiConstant constantValue = null; + FrameState stateBefore = null; if (isInitialized) { constantValue = field.constantValue(null); + } else { + stateBefore = frameState.create(bci()); } if (constantValue != null) { frameState.push(constantValue.kind.stackKind(), appendConstant(constantValue)); @@ -640,15 +671,21 @@ Value container = genResolveClass(RiType.Representation.StaticFields, holder, field.isResolved(), cpi); LoadField load = new LoadField(container, field, graph); appendOptimizedLoadField(field.kind(), load); + load.setStateBefore(stateBefore); } } void genPutStatic(int cpi, RiField field) { RiType holder = field.holder(); + FrameState stateBefore = null; + if (!field.isResolved()) { + stateBefore = frameState.create(bci()); + } Value container = genResolveClass(RiType.Representation.StaticFields, holder, field.isResolved(), cpi); Value value = frameState.pop(field.kind().stackKind()); StoreField store = new StoreField(container, field, value, graph); appendOptimizedStoreField(store); + store.setStateBefore(stateBefore); } private Value genResolveClass(RiType.Representation representation, RiType holder, boolean initialized, int cpi) { @@ -656,7 +693,7 @@ if (initialized) { holderInstr = appendConstant(holder.getEncoding(representation)); } else { - ResolveClass rc = new ResolveClass(holder, representation, graph); + ResolveClass rc = new ResolveClass(holder, representation, graph, frameState.create(bci())); holderInstr = append(rc); } return holderInstr;