# HG changeset patch # User Gilles Duboscq # Date 1342429627 -7200 # Node ID 610f9e377c70d2e74a63cb78a7c31accf72b8bbb # Parent 5fcd8ae3e64a0cf502e3d75de2bb1339a88d1cbe# Parent 0095a9c235c672c56607760505d646a78a64ded6 Merge diff -r 5fcd8ae3e64a -r 610f9e377c70 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalOptions.java diff -r 5fcd8ae3e64a -r 610f9e377c70 graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java --- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java Mon Jul 16 11:04:32 2012 +0200 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java Mon Jul 16 11:07:07 2012 +0200 @@ -50,6 +50,11 @@ static final int INITIAL_ID = -1; static final int ALIVE_ID_START = 0; + /** + * Denotes a node input. This should be applied to exactly the fields of a node that are of type {@link Node}. + * Nodes that update their inputs outside of their constructor should call {@link Node#updateUsages(Node, Node)} + * just prior to doing the update of the input. + */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public static @interface Input { diff -r 5fcd8ae3e64a -r 610f9e377c70 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Mon Jul 16 11:04:32 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Mon Jul 16 11:07:07 2012 +0200 @@ -46,6 +46,7 @@ import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.java.*; +import com.oracle.graal.nodes.java.MethodCallTargetNode.InvokeKind; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; import com.oracle.graal.snippets.*; @@ -231,6 +232,42 @@ ArrayLengthNode arrayLengthNode = (ArrayLengthNode) n; SafeReadNode safeReadArrayLength = safeReadArrayLength(arrayLengthNode.array(), StructuredGraph.INVALID_GRAPH_ID); graph.replaceFixedWithFixed(arrayLengthNode, safeReadArrayLength); + } else if (n instanceof Invoke) { + if (!GraalOptions.XIRLowerInvokes) { + Invoke invoke = (Invoke) n; + MethodCallTargetNode callTarget = invoke.callTarget(); + NodeInputList parameters = callTarget.arguments(); + ValueNode receiver = parameters.size() <= 0 ? null : parameters.get(0); + if (!callTarget.isStatic() && receiver.kind() == Kind.Object && !receiver.objectStamp().nonNull()) { + invoke.node().dependencies().add(tool.createNullCheckGuard(receiver, invoke.leafGraphId())); + } + + if (callTarget.invokeKind() == InvokeKind.Virtual && + GraalOptions.InlineVTableStubs && + (GraalOptions.AlwaysInlineVTableStubs || invoke.isMegamorphic())) { + + // TODO (dnsimon) I'm not sure of other invariants of HotSpot's calling conventions that may + // be required for register indirect calls. + assert false : "HotSpot expects the methodOop of the callee to be in rbx - this is yet to be implemented for inline vtable dispatch"; + + // TODO: successive inlined invokevirtuals to the same method cause register allocation to fail - fix this! + HotSpotResolvedJavaMethod hsMethod = (HotSpotResolvedJavaMethod) callTarget.targetMethod(); + if (!hsMethod.holder().isInterface()) { + int vtableEntryOffset = hsMethod.vtableEntryOffset(); + assert vtableEntryOffset != 0; + SafeReadNode hub = safeReadHub(graph, receiver, StructuredGraph.INVALID_GRAPH_ID); + Kind wordKind = graalRuntime.getTarget().wordKind; + Stamp nonNullWordStamp = StampFactory.forWord(wordKind, true); + ReadNode methodOop = graph.add(new ReadNode(hub, LocationNode.create(LocationNode.ANY_LOCATION, wordKind, vtableEntryOffset, graph), nonNullWordStamp)); + ReadNode compiledEntry = graph.add(new ReadNode(methodOop, LocationNode.create(LocationNode.ANY_LOCATION, wordKind, config.methodCompiledEntryOffset, graph), nonNullWordStamp)); + callTarget.setAddress(compiledEntry); + + graph.addBeforeFixed(invoke.node(), hub); + graph.addAfterFixed(hub, methodOop); + graph.addAfterFixed(methodOop, compiledEntry); + } + } + } } else if (n instanceof LoadFieldNode) { LoadFieldNode field = (LoadFieldNode) n; int displacement = ((HotSpotResolvedJavaField) field.field()).offset(); @@ -366,15 +403,15 @@ memoryRead.dependencies().add(tool.createNullCheckGuard(objectClassNode.object(), StructuredGraph.INVALID_GRAPH_ID)); graph.replaceFixed(objectClassNode, memoryRead); } else if (n instanceof CheckCastNode) { - if (shouldLower(graph, GraalOptions.HIRLowerCheckcast)) { + if (matches(graph, GraalOptions.HIRLowerCheckcast)) { checkcastSnippets.lower((CheckCastNode) n, tool); } } else if (n instanceof NewInstanceNode) { - if (shouldLower(graph, GraalOptions.HIRLowerNewInstance)) { + if (matches(graph, GraalOptions.HIRLowerNewInstance)) { newObjectSnippets.lower((NewInstanceNode) n, tool); } } else if (n instanceof NewArrayNode) { - if (shouldLower(graph, GraalOptions.HIRLowerNewArray)) { + if (matches(graph, GraalOptions.HIRLowerNewArray)) { newObjectSnippets.lower((NewArrayNode) n, tool); } } else if (n instanceof TLABAllocateNode) { @@ -388,13 +425,13 @@ } } - private static boolean shouldLower(StructuredGraph graph, String option) { - if (option != null) { - if (option.length() == 0) { + private static boolean matches(StructuredGraph graph, String filter) { + if (filter != null) { + if (filter.length() == 0) { return true; } ResolvedJavaMethod method = graph.method(); - return method != null && MetaUtil.format("%H.%n", method).contains(option); + return method != null && MetaUtil.format("%H.%n", method).contains(filter); } return false; } diff -r 5fcd8ae3e64a -r 610f9e377c70 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotXirGenerator.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotXirGenerator.java Mon Jul 16 11:04:32 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotXirGenerator.java Mon Jul 16 11:07:07 2012 +0200 @@ -62,6 +62,7 @@ public static final Integer MARK_INVOKESTATIC = 0x2002; public static final Integer MARK_INVOKESPECIAL = 0x2003; public static final Integer MARK_INVOKEVIRTUAL = 0x2004; + public static final Integer MARK_INLINE_INVOKEVIRTUAL = 0x2005; public static final Integer MARK_IMPLICIT_NULL = 0x3000; public static final Integer MARK_POLL_NEAR = 0x3001; @@ -167,7 +168,7 @@ // load entry point from methodOop asm.mark(MARK_IMPLICIT_NULL); asm.pload(target.wordKind, temp, method, asm.i(config.methodCompiledEntryOffset), true); - asm.mark(MARK_INVOKEVIRTUAL); + asm.mark(MARK_INLINE_INVOKEVIRTUAL); return asm.finishTemplate(temp, "invokevirtual"); } diff -r 5fcd8ae3e64a -r 610f9e377c70 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/VerifyOopStubCall.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/VerifyOopStubCall.java Mon Jul 16 11:04:32 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/VerifyOopStubCall.java Mon Jul 16 11:07:07 2012 +0200 @@ -52,7 +52,7 @@ RegisterValue objectFixed = OBJECT.asValue(Kind.Object); gen.emitMove(gen.operand(object), objectFixed); LIRFrameState info = gen.state(); - gen.append(new AMD64VerifyOopStubCallOp(gen.operand(object), info)); + gen.append(new AMD64VerifyOopStubCallOp(objectFixed, info)); } @SuppressWarnings("unused") diff -r 5fcd8ae3e64a -r 610f9e377c70 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/HotSpotAMD64Backend.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/HotSpotAMD64Backend.java Mon Jul 16 11:04:32 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/HotSpotAMD64Backend.java Mon Jul 16 11:07:07 2012 +0200 @@ -145,9 +145,13 @@ // that loads the klassOop from the inline cache so that the C++ code can find it // and replace the inline null value with Universe::non_oop_word() assert invokeKind == Virtual || invokeKind == Interface; - tasm.recordMark(invokeKind == Virtual ? MARK_INVOKEVIRTUAL : MARK_INVOKEINTERFACE); - AMD64MacroAssembler masm = (AMD64MacroAssembler) tasm.asm; - AMD64Move.move(tasm, masm, AMD64.rax.asValue(Kind.Object), Constant.NULL_OBJECT); + if (callTarget.address() == null) { + tasm.recordMark(invokeKind == Virtual ? MARK_INVOKEVIRTUAL : MARK_INVOKEINTERFACE); + AMD64MacroAssembler masm = (AMD64MacroAssembler) tasm.asm; + AMD64Move.move(tasm, masm, AMD64.rax.asValue(Kind.Object), Constant.NULL_OBJECT); + } else { + tasm.recordMark(MARK_INLINE_INVOKEVIRTUAL); + } } } public void atCall(TargetMethodAssembler tasm) { diff -r 5fcd8ae3e64a -r 610f9e377c70 graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Call.java --- a/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Call.java Mon Jul 16 11:04:32 2012 +0200 +++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Call.java Mon Jul 16 11:07:07 2012 +0200 @@ -80,7 +80,10 @@ @Override public void emitCode(TargetMethodAssembler tasm, AMD64MacroAssembler masm) { - callAlignment(tasm, masm, callPositionListener); + if (callPositionListener != null) { + callPositionListener.beforeCall(tasm); + callPositionListener.atCall(tasm); + } indirectCall(tasm, masm, asRegister(targetAddress), targetMethod, state); } } diff -r 5fcd8ae3e64a -r 610f9e377c70 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/CallTargetNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/CallTargetNode.java Mon Jul 16 11:04:32 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/CallTargetNode.java Mon Jul 16 11:07:07 2012 +0200 @@ -38,6 +38,7 @@ } public void setAddress(ValueNode address) { + updateUsages(this.address, address); this.address = address; } diff -r 5fcd8ae3e64a -r 610f9e377c70 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java Mon Jul 16 11:04:32 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java Mon Jul 16 11:07:07 2012 +0200 @@ -97,11 +97,7 @@ @Override public void lower(LoweringTool tool) { - NodeInputList parameters = callTarget.arguments(); - ValueNode firstParam = parameters.size() <= 0 ? null : parameters.get(0); - if (!callTarget.isStatic() && firstParam.kind() == Kind.Object && !firstParam.objectStamp().nonNull()) { - dependencies().add(tool.createNullCheckGuard(firstParam, leafGraphId)); - } + tool.getRuntime().lower(this, tool); } @Override diff -r 5fcd8ae3e64a -r 610f9e377c70 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java Mon Jul 16 11:04:32 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java Mon Jul 16 11:07:07 2012 +0200 @@ -128,11 +128,7 @@ @Override public void lower(LoweringTool tool) { - NodeInputList parameters = callTarget.arguments(); - ValueNode firstParam = parameters.size() <= 0 ? null : parameters.get(0); - if (!callTarget.isStatic() && firstParam.kind() == Kind.Object && !firstParam.objectStamp().nonNull()) { - dependencies().add(tool.createNullCheckGuard(firstParam, leafGraphId)); - } + tool.getRuntime().lower(this, tool); } @Override diff -r 5fcd8ae3e64a -r 610f9e377c70 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java Mon Jul 16 11:04:32 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java Mon Jul 16 11:07:07 2012 +0200 @@ -45,7 +45,7 @@ */ public IsNullNode(ValueNode object) { super(StampFactory.condition()); - assert object.kind() == Kind.Object : object.kind(); + assert object.kind() == Kind.Object : object; this.object = object; } diff -r 5fcd8ae3e64a -r 610f9e377c70 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AccessNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AccessNode.java Mon Jul 16 11:04:32 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AccessNode.java Mon Jul 16 11:07:07 2012 +0200 @@ -26,6 +26,11 @@ import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.type.*; +/** + * Accesses a value at an memory address specified by an {@linkplain #object object} + * and a {@linkplain #location() location}. The access does not include a null check + * on the object. + */ public abstract class AccessNode extends FixedWithNextNode implements Access { @Input private ValueNode object; diff -r 5fcd8ae3e64a -r 610f9e377c70 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java Mon Jul 16 11:04:32 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java Mon Jul 16 11:07:07 2012 +0200 @@ -40,12 +40,20 @@ private Kind valueKind; private Object locationIdentity; + /** + * Denotes any location. A write to such a location kills all values in a memory map + * during an analysis of memory accesses in a graph. + */ public static final Object ANY_LOCATION = new Object() { @Override public String toString() { return "ANY_LOCATION"; } }; + + /** + * Denotes the location of a value that is guaranteed to be final. + */ public static final Object FINAL_LOCATION = new Object() { @Override public String toString() { diff -r 5fcd8ae3e64a -r 610f9e377c70 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Mon Jul 16 11:04:32 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Mon Jul 16 11:07:07 2012 +0200 @@ -28,7 +28,9 @@ import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; - +/** + * Reads an {@linkplain AccessNode accessed} value. + */ public final class ReadNode extends AccessNode implements Node.IterableNodeType, LIRLowerable/*, Canonicalizable*/ { public ReadNode(ValueNode object, LocationNode location, Stamp stamp) { diff -r 5fcd8ae3e64a -r 610f9e377c70 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeReadNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeReadNode.java Mon Jul 16 11:04:32 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeReadNode.java Mon Jul 16 11:07:07 2012 +0200 @@ -26,6 +26,10 @@ import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; +/** + * An analog to {@link ReadNode} with the additional semantics of null-checking + * the receiver object before reading from it. + */ public class SafeReadNode extends SafeAccessNode implements Lowerable { public SafeReadNode(ValueNode object, LocationNode location, Stamp stamp, long leafGraphId) { diff -r 5fcd8ae3e64a -r 610f9e377c70 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeWriteNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeWriteNode.java Mon Jul 16 11:04:32 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeWriteNode.java Mon Jul 16 11:07:07 2012 +0200 @@ -26,6 +26,10 @@ import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; +/** + * An analog to {@link WriteNode} with the additional semantics of null-checking + * the receiver object before writing to it. + */ public class SafeWriteNode extends SafeAccessNode implements StateSplit, Lowerable { @Input private ValueNode value; diff -r 5fcd8ae3e64a -r 610f9e377c70 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java Mon Jul 16 11:04:32 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java Mon Jul 16 11:07:07 2012 +0200 @@ -27,6 +27,9 @@ import com.oracle.graal.nodes.type.*; +/** + * Writes a given {@linkplain #value() value} a {@linkplain AccessNode memory location}. + */ public final class WriteNode extends AccessNode implements StateSplit, LIRLowerable { @Input private ValueNode value; @Input(notDataflow = true) private FrameState stateAfter; diff -r 5fcd8ae3e64a -r 610f9e377c70 mxtool/mx.py --- a/mxtool/mx.py Mon Jul 16 11:04:32 2012 +0200 +++ b/mxtool/mx.py Mon Jul 16 11:07:07 2012 +0200 @@ -57,7 +57,8 @@ env A set of environment variable definitions. These override any - existing environment variables. + existing environment variables. Common properties set here + include JAVA_HOME and IGNORED_PROJECTS. The includes and env files are typically not put under version control as they usually contain local file-system paths. @@ -194,7 +195,11 @@ if includeLibs and not dep in deps: deps.append(dep) else: - dep = project(name) + dep = _projects.get(name, None) + if dep is None: + if name in _opts.ignored_projects: + abort('project named ' + name + ' required by ' + self.name + ' is ignored') + abort('dependency named ' + name + ' required by ' + self.name + ' is not found') if not dep in deps: dep.all_deps(deps, includeLibs) if not self in deps and includeSelf: @@ -449,7 +454,8 @@ existing = _projects.get(p.name) if existing is not None: abort('cannot override project ' + p.name + ' in ' + p.dir + " with project of the same name in " + existing.dir) - _projects[p.name] = p + if not p.name in _opts.ignored_projects: + _projects[p.name] = p for l in self.libs: existing = _libs.get(l.name) if existing is not None: @@ -566,6 +572,8 @@ """ p = _projects.get(name) if p is None and fatalIfMissing: + if name in _opts.ignored_projects: + abort('project named ' + name + ' is ignored') abort('project named ' + name + ' not found') return p @@ -671,6 +679,7 @@ self.add_argument('--Ja', action='append', dest='java_args_sfx', help='suffix Java VM arguments (e.g. --Ja @-dsa)', metavar='@', default=[]) self.add_argument('--user-home', help='users home directory', metavar='', default=os.path.expanduser('~')) self.add_argument('--java-home', help='JDK installation directory (must be JDK 6 or later)', metavar='') + self.add_argument('--ignore-project', action='append', dest='ignored_projects', help='name of project to ignore', metavar='', default=[]) if get_os() != 'windows': # Time outs are (currently) implemented with Unix specific functionality self.add_argument('--timeout', help='Timeout (in seconds) for command', type=int, default=0, metavar='') @@ -703,6 +712,8 @@ os.environ['JAVA_HOME'] = opts.java_home os.environ['HOME'] = opts.user_home + opts.ignored_projects = opts.ignored_projects + os.environ.get('IGNORED_PROJECTS', '').split(',') + commandAndArgs = opts.__dict__.pop('commandAndArgs') return opts, commandAndArgs @@ -2409,7 +2420,13 @@ command_args = commandAndArgs[1:] if not commands.has_key(command): - abort('mx: unknown command \'{0}\'\n{1}use "mx help" for more options'.format(command, _format_commands())) + hits = [c for c in commands.iterkeys() if c.startswith(command)] + if len(hits) == 1: + command = hits[0] + elif len(hits) == 0: + abort('mx: unknown command \'{0}\'\n{1}use "mx help" for more options'.format(command, _format_commands())) + else: + abort('mx: command \'{0}\' is ambiguous\n {1}'.format(command, ' '.join(hits))) c, _ = commands[command][:2] def term_handler(signum, frame): diff -r 5fcd8ae3e64a -r 610f9e377c70 src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Client.java diff -r 5fcd8ae3e64a -r 610f9e377c70 src/share/vm/c1/c1_Runtime1.cpp --- a/src/share/vm/c1/c1_Runtime1.cpp Mon Jul 16 11:04:32 2012 +0200 +++ b/src/share/vm/c1/c1_Runtime1.cpp Mon Jul 16 11:07:07 2012 +0200 @@ -535,8 +535,9 @@ if (TraceExceptions) { ttyLocker ttyl; ResourceMark rm; - tty->print_cr("Exception <%s> (0x%x) thrown in compiled method <%s> at PC " PTR_FORMAT " for thread 0x%x", - exception->print_value_string(), (address)exception(), nm->method()->print_value_string(), pc, thread); + int offset = pc - nm->code_begin(); + tty->print_cr("Exception <%s> (0x%x) thrown in compiled method <%s> at PC " PTR_FORMAT " [" PTR_FORMAT "+%d] for thread 0x%x", + exception->print_value_string(), (address)exception(), nm->method()->print_value_string(), pc, nm->code_begin(), offset, thread); } // for AbortVMOnException flag NOT_PRODUCT(Exceptions::debug_check_abort(exception)); diff -r 5fcd8ae3e64a -r 610f9e377c70 src/share/vm/graal/graalCodeInstaller.cpp --- a/src/share/vm/graal/graalCodeInstaller.cpp Mon Jul 16 11:04:32 2012 +0200 +++ b/src/share/vm/graal/graalCodeInstaller.cpp Mon Jul 16 11:07:07 2012 +0200 @@ -695,10 +695,10 @@ TRACE_graal_3("method call"); switch (_next_call_type) { + case MARK_INLINE_INVOKEVIRTUAL: { + break; + } case MARK_INVOKEVIRTUAL: - if (is_call_reg) { - break; - } case MARK_INVOKEINTERFACE: { assert(method == NULL || !method->is_static(), "cannot call static method with invokeinterface"); @@ -843,6 +843,7 @@ // Add relocation record for the klassOop embedded in the inline cache _instructions->relocate(instruction, oop_Relocation::spec_for_immediate(), Assembler::imm_operand); } + case MARK_INLINE_INVOKEVIRTUAL: case MARK_INVOKE_INVALID: case MARK_INVOKESPECIAL: case MARK_INVOKESTATIC: diff -r 5fcd8ae3e64a -r 610f9e377c70 src/share/vm/graal/graalCodeInstaller.hpp --- a/src/share/vm/graal/graalCodeInstaller.hpp Mon Jul 16 11:04:32 2012 +0200 +++ b/src/share/vm/graal/graalCodeInstaller.hpp Mon Jul 16 11:07:07 2012 +0200 @@ -43,6 +43,7 @@ MARK_INVOKESTATIC = 0x2002, MARK_INVOKESPECIAL = 0x2003, MARK_INVOKEVIRTUAL = 0x2004, + MARK_INLINE_INVOKEVIRTUAL = 0x2005, MARK_IMPLICIT_NULL = 0x3000, MARK_POLL_NEAR = 0x3001, MARK_POLL_RETURN_NEAR = 0x3002,