/* * Copyright (c) 2016-2017 Chris Newland. * Licensed under https://github.com/AdoptOpenJDK/jitwatch/blob/master/LICENSE-BSD * Instructions: https://github.com/AdoptOpenJDK/jitwatch/wiki */ package org.adoptopenjdk.jitwatch.test; import static org.junit.Assert.assertEquals; import java.util.List; import org.adoptopenjdk.jitwatch.model.IMetaMember; import org.adoptopenjdk.jitwatch.model.JITDataModel; import org.adoptopenjdk.jitwatch.model.bytecode.BCAnnotationType; import org.adoptopenjdk.jitwatch.model.bytecode.BytecodeAnnotationList; import org.adoptopenjdk.jitwatch.model.bytecode.BytecodeAnnotations; import org.adoptopenjdk.jitwatch.model.bytecode.LineAnnotation; import org.junit.Test; public class TestReport { @Test public void testEliminatedAllocOnInlinedMethod() { String[] lines = new String[] { "<task_queued method='InlineElimAlloc outer (I)J' bytes='31' blocking='1' count='6' backedge_count='101376' stamp='0.242' comment='tiered' hot_count='6' compile_id='33' iicount='6'/>", "<nmethod stub_offset='912' dependencies_offset='1896' address='0x000000010b721090' method='InlineElimAlloc outer (I)J' level='4' count='6' backedge_count='101376' stamp='0.249' scopes_data_offset='1040' iicount='6' handler_table_offset='1904' oops_offset='936' entry='0x000000010b7211e0' size='1928' scopes_pcs_offset='1496' insts_offset='336' bytes='31' relocation_offset='296' compile_id='33' compiler='C2'/>", "<task method='InlineElimAlloc outer (I)J' bytes='31' blocking='1' count='6' backedge_count='101376' stamp='0.242' compile_id='33' iicount='6'>", " <phase nodes='3' name='parse' stamp='0.242' live='3'>", " <type name='long' id='722'/>", " <type name='int' id='721'/>", " <klass name='InlineElimAlloc' flags='1' id='831'/>", " <method level='3' bytes='31' name='outer' flags='1' holder='831' arguments='721' id='832' compile_id='31' compiler='C1' iicount='6' return='722'/>", " <parse method='832' stamp='0.242' uses='6'>", " <bc code='162' bci='10'/>", " <branch prob='4.88257e-05' not_taken='40960' taken='2' cnt='40962' target_bci='29'/>", " <uncommon_trap reason='predicate' bci='13' action='maybe_recompile'/>", " <uncommon_trap reason='loop_limit_check' bci='13' action='maybe_recompile'/>", " <bc code='182' bci='18'/>", " <method level='4' bytes='55' name='inner' flags='1' holder='831' arguments='721 721' id='834' compile_id='29' compiler='C2' iicount='5376' return='722'/>", " <dependency x='834' ctxk='831' type='unique_concrete_method'/>", " <call method='834' inline='1' count='40960' prof_factor='1'/>", " <inline_success reason='inline (hot)'/>", " <parse method='834' stamp='0.242' uses='40960'>", " <bc code='79' bci='11'/>", " <observe that='!need_range_check'/>", " <bc code='79' bci='16'/>", " <observe that='!need_range_check'/>", " <bc code='183' bci='21'/>", " <type name='void' id='723'/>", " <klass name='java/util/Random' flags='1' id='835'/>", " <method bytes='12' name='<init>' flags='1' holder='835' id='836' iicount='5376' return='723'/>", " <call method='836' inline='1' count='5120' prof_factor='1'/>", " <inline_success reason='inline (hot)'/>", " <parse method='836' stamp='0.242' uses='5376'>", " <bc code='184' bci='1'/>", " <method bytes='29' name='seedUniquifier' flags='10' holder='835' id='839' iicount='5376' return='722'/>", " <call method='839' inline='1' count='5121' prof_factor='1'/>", " <inline_success reason='inline (hot)'/>", " <parse method='839' stamp='0.242' uses='5376'>", " <bc code='182' bci='3'/>", " <klass name='java/util/concurrent/atomic/AtomicLong' flags='1' id='843'/>", " <method level='3' bytes='5' name='get' flags='17' holder='843' id='845' compile_id='17' compiler='C1' iicount='10751' return='722'/>", " <call method='845' inline='1' count='5121' prof_factor='1'/>", " <inline_success reason='inline (hot)'/>", " <parse method='845' stamp='0.242' uses='5376'>", " <parse_done nodes='199' memory='55224' stamp='0.242' live='196'/>", " </parse>", " <bc code='182' bci='18'/>", " <type name='boolean' id='715'/>", " <method level='3' bytes='13' name='compareAndSet' flags='17' holder='843' arguments='722 722' id='846' compile_id='18' compiler='C1' iicount='10751' return='715'/>", " <call method='846' inline='1' count='5121' prof_factor='1'/>", " <inline_success reason='inline (hot)'/>", " <parse method='846' stamp='0.242' uses='5376'>", " <bc code='182' bci='9'/>", " <klass name='java/lang/Object' flags='1' id='728'/>", " <klass name='sun/misc/Unsafe' flags='17' id='795'/>", " <method compile_kind='c2n' level='0' bytes='0' name='compareAndSwapLong' flags='273' holder='795' arguments='728 722 722 722' id='851' compile_id='15' iicount='256' return='715'/>", " <call method='851' inline='1' count='0' prof_factor='0.500046'/>", " <intrinsic nodes='19' id='_compareAndSwapLong'/>", " <parse_done nodes='234' memory='60072' stamp='0.242' live='230'/>", " </parse>", " <bc code='153' bci='21'/>", " <branch prob='never' not_taken='5376' taken='0' cnt='5376' target_bci='26'/>", " <uncommon_trap reason='unstable_if' bci='21' action='reinterpret' comment='taken never'/>", " <parse_done nodes='248' memory='62560' stamp='0.242' live='242'/>", " </parse>", " <bc code='184' bci='4'/>", " <klass name='java/lang/System' flags='17' id='734'/>", " <method compile_kind='c2n' level='0' bytes='0' name='nanoTime' flags='265' holder='734' id='840' compile_id='20' iicount='256' return='722'/>", " <call method='840' inline='1' count='5121' prof_factor='1'/>", " <intrinsic nodes='4' id='_nanoTime'/>", " <bc code='183' bci='8'/>", " <method level='4' bytes='53' name='<init>' flags='1' holder='835' arguments='722' id='841' compile_id='27' compiler='C2' iicount='5375' return='723'/>", " <call method='841' inline='1' count='5121' prof_factor='1'/>", " <inline_success reason='inline (hot)'/>", " <parse method='841' stamp='0.242' uses='5376'>", " <bc code='183' bci='1'/>", " <method level='1' bytes='1' name='<init>' flags='1' holder='728' id='854' compile_id='24' compiler='C1' iicount='12620' return='723'/>", " <call method='854' inline='1' count='5120' prof_factor='1'/>", " <inline_success reason='inline (hot)'/>", " <parse method='854' stamp='0.242' uses='5375'>", " <parse_done nodes='287' memory='75632' stamp='0.242' live='280'/>", " </parse>", " <bc code='182' bci='10'/>", " <klass name='java/lang/Class' flags='17' id='730'/>", " <method compile_kind='c2n' level='0' bytes='0' name='getClass' flags='273' holder='728' id='855' compile_id='19' iicount='256' return='730'/>", " <call method='855' inline='1' count='5120' prof_factor='1'/>", " <intrinsic nodes='3' id='_getClass'/>", " <bc code='166' bci='15'/>", " <branch prob='never' not_taken='5375' taken='0' cnt='5375' target_bci='36'/>", " <bc code='184' bci='24'/>", " <method level='3' bytes='10' name='initialScramble' flags='10' holder='835' arguments='722' id='858' compile_id='23' compiler='C1' iicount='5375' return='722'/>", " <call method='858' inline='1' count='5120' prof_factor='1'/>", " <inline_success reason='inline (hot)'/>", " <parse method='858' stamp='0.243' uses='5375'>", " <parse_done nodes='341' memory='85288' stamp='0.243' live='333'/>", " </parse>", " <bc code='183' bci='27'/>", " <method level='3' bytes='10' name='<init>' flags='1' holder='843' arguments='722' id='859' compile_id='21' compiler='C1' iicount='5376' return='723'/>", " <call method='859' inline='1' count='5120' prof_factor='1'/>", " <inline_success reason='inline (hot)'/>", " <parse method='859' stamp='0.243' uses='5375'>", " <bc code='183' bci='1'/>", " <klass name='java/lang/Number' flags='1025' id='810'/>", " <method level='3' bytes='5' name='<init>' flags='1' holder='810' id='863' compile_id='16' compiler='C1' iicount='5639' return='723'/>", " <call method='863' inline='1' count='5120' prof_factor='0.999814'/>", " <inline_success reason='inline (hot)'/>", " <parse method='863' stamp='0.243' uses='5375'>", " <bc code='183' bci='1'/>", " <call method='854' inline='1' count='5255' prof_factor='0.953183'/>", " <inline_success reason='inline (hot)'/>", " <parse method='854' stamp='0.243' uses='5375'>", " <parse_done nodes='388' memory='93360' stamp='0.243' live='379'/>", " </parse>", " <parse_done nodes='391' memory='94336' stamp='0.243' live='381'/>", " </parse>", " <parse_done nodes='401' memory='95912' stamp='0.243' live='390'/>", " </parse>", " <parse_done nodes='419' memory='98496' stamp='0.243' live='407'/>", " </parse>", " <parse_done nodes='421' memory='99536' stamp='0.243' live='408'/>", " </parse>", " <bc code='182' bci='28'/>", " <method bytes='14' name='nextBoolean' flags='1' holder='835' id='837' iicount='5376' return='715'/>", " <dependency x='837' ctxk='835' type='unique_concrete_method'/>", " <call method='837' inline='1' count='5120' prof_factor='1'/>", " <inline_success reason='inline (hot)'/>", " <parse method='837' stamp='0.243' uses='5376'>", " <bc code='182' bci='2'/>", " <method level='4' bytes='47' name='next' flags='4' holder='835' arguments='721' id='866' compile_id='28' compiler='C2' iicount='5375' return='721'/>", " <dependency x='866' ctxk='835' type='unique_concrete_method'/>", " <call method='866' inline='1' count='5121' prof_factor='1'/>", " <inline_success reason='inline (hot)'/>", " <parse method='866' stamp='0.243' uses='5376'>", " <bc code='182' bci='8'/>", " <call method='845' inline='1' count='5120' prof_factor='1'/>", " <inline_success reason='inline (hot)'/>", " <parse method='845' stamp='0.243' uses='5375'>", " <uncommon_trap reason='null_check' bci='8' action='maybe_recompile'/>", " <parse_done nodes='482' memory='110152' stamp='0.243' live='467'/>", " </parse>", " <bc code='182' bci='32'/>", " <call method='846' inline='1' count='5120' prof_factor='1'/>", " <inline_success reason='inline (hot)'/>", " <parse method='846' stamp='0.243' uses='5375'>", " <bc code='182' bci='9'/>", " <call method='851' inline='1' count='0' prof_factor='0.499953'/>", " <intrinsic nodes='19' id='_compareAndSwapLong'/>", " <parse_done nodes='517' memory='127168' stamp='0.243' live='501'/>", " </parse>", " <bc code='153' bci='35'/>", " <branch prob='never' not_taken='5375' taken='0' cnt='5375' target_bci='6'/>", " <uncommon_trap reason='unstable_if' bci='35' action='reinterpret' comment='taken never'/>", " <parse_done nodes='541' memory='131072' stamp='0.243' live='523'/>", " </parse>", " <bc code='153' bci='5'/>", " <branch prob='0.493304' not_taken='2724' taken='2652' cnt='5376' target_bci='12'/>", " <parse_done nodes='553' memory='132816' stamp='0.243' live='534'/>", " </parse>", " <bc code='153' bci='31'/>", " <branch prob='0.493304' not_taken='2724' taken='2652' cnt='5376' target_bci='45'/>", " <bc code='46' bci='38'/>", " <observe that='!need_range_check'/>", " <bc code='46' bci='49'/>", " <observe that='!need_range_check'/>", " <parse_done nodes='572' memory='135848' stamp='0.243' live='552'/>", " </parse>", " <bc code='162' bci='10'/>", " <branch prob='4.88257e-05' not_taken='40960' taken='2' cnt='40959' target_bci='29'/>", " <parse_done nodes='585' memory='139264' stamp='0.243' live='564'/>", " </parse>", " <phase_done nodes='587' name='parse' stamp='0.243' live='268'/>", " </phase>", " <phase nodes='587' name='optimizer' stamp='0.243' live='268'>", " <phase nodes='587' name='idealLoop' stamp='0.243' live='248'>", " <loop_tree>", " <loop idx='593'>", " </loop>", " </loop_tree>", " <phase_done nodes='594' name='idealLoop' stamp='0.243' live='246'/>", " </phase>", " <phase nodes='594' name='escapeAnalysis' stamp='0.243' live='246'>", " <phase nodes='595' name='connectionGraph' stamp='0.243' live='247'>", " <phase_done nodes='595' name='connectionGraph' stamp='0.243' live='247'/>", " </phase>", " <phase_done nodes='601' name='escapeAnalysis' stamp='0.243' live='253'/>", " </phase>", " <eliminate_allocation type='835'>", " <jvms method='834' bci='17'/>", " <jvms method='832' bci='18'/>", " </eliminate_allocation>", " <klass name='[I' flags='1041' id='825'/>", " <eliminate_allocation type='825'>", " <jvms method='834' bci='3'/>", " <jvms method='832' bci='18'/>", " </eliminate_allocation>", " <phase nodes='609' name='idealLoop' stamp='0.244' live='184'>", " <loop_tree>", " <loop idx='593' inner_loop='1'>", " </loop>", " </loop_tree>", " <phase_done nodes='613' name='idealLoop' stamp='0.244' live='164'/>", " </phase>", " <phase nodes='613' name='idealLoop' stamp='0.244' live='164'>", " <loop_tree>", " <loop idx='593' inner_loop='1'>", " </loop>", " </loop_tree>", " <phase_done nodes='613' name='idealLoop' stamp='0.244' live='164'/>", " </phase>", " <phase nodes='613' name='idealLoop' stamp='0.244' live='164'>", " <loop_tree>", " <loop idx='593' inner_loop='1'>", " </loop>", " </loop_tree>", " <phase_done nodes='613' name='idealLoop' stamp='0.244' live='164'/>", " </phase>", " <phase nodes='613' name='ccp' stamp='0.244' live='164'>", " <phase_done nodes='613' name='ccp' stamp='0.244' live='164'/>", " </phase>", " <phase nodes='613' name='idealLoop' stamp='0.244' live='164'>", " <loop_tree>", " <loop idx='593' inner_loop='1'>", " </loop>", " </loop_tree>", " <phase_done nodes='616' name='idealLoop' stamp='0.244' live='164'/>", " </phase>", " <phase_done nodes='671' name='optimizer' stamp='0.244' live='201'/>", " </phase>", " <phase nodes='671' name='matcher' stamp='0.244' live='201'>", " <phase_done nodes='192' name='matcher' stamp='0.244' live='192'/>", " </phase>", " <phase nodes='212' name='regalloc' stamp='0.244' live='212'>", " <regalloc success='1' attempts='0'/>", " <phase_done nodes='282' name='regalloc' stamp='0.245' live='256'/>", " </phase>", " <phase nodes='282' name='output' stamp='0.245' live='256'>", " <phase_done nodes='294' name='output' stamp='0.245' live='267'/>", " </phase>", " <dependency x='834' ctxk='831' type='unique_concrete_method'/>", " <dependency x='837' ctxk='835' type='unique_concrete_method'/>", " <dependency x='866' ctxk='835' type='unique_concrete_method'/>", " <code_cache nmethods='33' free_code_cache='250509632' adapters='148' total_blobs='267'/>", " <task_done inlined_bytes='273' success='1' count='6' backedge_count='101376' stamp='0.249' nmsize='600'/>", "</task>" }; String[] bytecodeLinesOuter = new String[] { " 0: lconst_0 ", " 1: lstore_2 ", " 2: iconst_0 ", " 3: istore 4 ", " 5: iload 4 ", " 7: sipush 20000", "10: if_icmpge 29 ", "13: lload_2 ", "14: aload_0 ", "15: iload_1 ", "16: iload 4 ", "18: invokevirtual #2 // Method inner:(II)J", "21: ladd ", "22: lstore_2 ", "23: iinc 4, 1 ", "26: goto 5 ", "29: lload_2 ", "30: lreturn " }; // String[] bytecodeLinesInner = new String[] { // " 0: lconst_0 ", // " 1: lstore_3 ", // " 2: iconst_2 ", // " 3: newarray int ", // " 5: astore 5 ", // " 7: aload 5 ", // " 9: iconst_0 ", // "10: iload_1 ", // "11: iastore ", // "12: aload 5 ", // "14: iconst_1 ", // "15: iload_2 ", // "16: iastore ", // "17: new #3 // class java/util/Random", // "20: dup ", // "21: invokespecial #4 // Method java/util/Random.\"<init>\":()V", // "24: astore 6 ", // "26: aload 6 ", // "28: invokevirtual #5 // Method java/util/Random.nextBoolean:()Z", // "31: ifeq 45 ", // "34: lload_3 ", // "35: aload 5 ", // "37: iconst_0 ", // "38: iaload ", // "39: i2l ", // "40: ladd ", // "41: lstore_3 ", // "42: goto 53 ", // "45: lload_3 ", // "46: aload 5 ", // "48: iconst_1 ", // "49: iaload ", // "50: i2l ", // "51: ladd ", // "52: lstore_3 ", // "53: lload_3 ", // "54: lreturn " }; JITDataModel model = new JITDataModel(); model.setVmVersionRelease("1.8.0"); IMetaMember memberInner = UnitTestUtil.createTestMetaMember(model, "InlineElimAlloc", "inner", new Class[] { int.class, int.class }, long.class); IMetaMember memberOuter = UnitTestUtil.createTestMetaMember(model, "InlineElimAlloc", "outer", new Class[] { int.class }, long.class); BytecodeAnnotations result = UnitTestUtil.buildAnnotations(false, true, model, memberOuter, lines, bytecodeLinesOuter); BytecodeAnnotationList listOuter = result.getAnnotationList(memberOuter); assertEquals(3, listOuter.annotatedLineCount()); UnitTestUtil.checkAnnotation(listOuter, 10, "taken", BCAnnotationType.BRANCH); UnitTestUtil.checkAnnotation(listOuter, 13, "predicate", BCAnnotationType.UNCOMMON_TRAP); UnitTestUtil.checkAnnotation(listOuter, 13, "loop_limit_check", BCAnnotationType.UNCOMMON_TRAP); UnitTestUtil.checkAnnotation(listOuter, 18, "inline (hot)", BCAnnotationType.INLINE_SUCCESS); BytecodeAnnotationList listInner = result.getAnnotationList(memberInner); assertEquals(2, listInner.annotatedLineCount()); UnitTestUtil.checkAnnotation(listInner, 3, "int", BCAnnotationType.ELIMINATED_ALLOCATION); UnitTestUtil.checkAnnotation(listInner, 17, "Random", BCAnnotationType.ELIMINATED_ALLOCATION); assertEquals(0, UnitTestUtil.unhandledTags.size()); List<LineAnnotation> annotationsForOuterBCI18 = listOuter.getAnnotationsForBCI(18); assertEquals(1 + listInner.annotatedLineCount(), annotationsForOuterBCI18.size()); } @Test public void testElidedLocks() { String[] lines = new String[] { "<task_queued osr_bci='8' method='LockEliminate <init> ()V' compile_kind='osr' bytes='65' blocking='1' count='1' backedge_count='101376' stamp='0.185' comment='tiered' hot_count='101376' compile_id='21' iicount='1'/>", "<nmethod stub_offset='1072' dependencies_offset='1584' address='0x00000001102b7d10' method='LockEliminate <init> ()V' level='4' count='1' backedge_count='101376' stamp='0.191' scopes_data_offset='1128' iicount='1' oops_offset='1096' entry='0x00000001102b7e60' size='1592' scopes_pcs_offset='1280' compile_kind='osr' insts_offset='336' bytes='65' relocation_offset='296' compile_id='21' compiler='C2'/>", "<task osr_bci='8' method='LockEliminate <init> ()V' compile_kind='osr' bytes='65' blocking='1' count='1' backedge_count='101376' stamp='0.185' compile_id='21' iicount='1'>", " <phase nodes='3' name='parse' stamp='0.185' live='3'>", " <type name='void' id='724'/>", " <klass name='LockEliminate' flags='1' id='832'/>", " <method level='3' bytes='65' name='<init>' flags='1' holder='832' id='833' compile_id='20' compiler='C1' iicount='1' return='724'/>", " <klass unloaded='1' name='java/lang/System' id='837'/>", " <uncommon_trap reason='unloaded' method='833' klass='837' bci='57' action='reinterpret' index='42'/>", " <parse osr_bci='8' method='833' stamp='0.185' uses='1'>", " <observe that='has_exception_handlers'/>", " <uncommon_trap reason='unloaded' method='833' klass='837' bci='57' action='reinterpret' index='42'/>", " <dependency ctxk='832' type='leaf_type'/>", " <dependency ctxk='832' type='leaf_type'/>", " <uncommon_trap reason='constraint' bci='8' action='reinterpret'/>", " <uncommon_trap reason='predicate' bci='8' action='maybe_recompile'/>", " <uncommon_trap reason='loop_limit_check' bci='8' action='maybe_recompile'/>", " <bc code='162' bci='11'/>", " <branch prob='never' not_taken='40960' taken='0' cnt='40960' target_bci='57'/>", " <uncommon_trap reason='unstable_if' bci='11' action='reinterpret' comment='taken never'/>", " <bc code='194' bci='18'/>", " <uncommon_trap reason='null_check' bci='18' action='maybe_recompile'/>", " <bc code='183' bci='21'/>", " <type name='long' id='723'/>", " <method level='1' bytes='6' name='increment' flags='34' holder='832' arguments='723' id='838' compile_id='17' compiler='C1' iicount='83200' return='723'/>", " <call method='838' inline='1' count='40960' prof_factor='1'/>", " <inline_success reason='inline (hot)'/>", " <parse method='838' stamp='0.185' uses='40960'>", " <parse_done nodes='182' memory='50976' stamp='0.185' live='176'/>", " </parse>", " <bc code='183' bci='27'/>", " <method level='1' bytes='6' name='decrement' flags='34' holder='832' arguments='723' id='839' compile_id='18' compiler='C1' iicount='42240' return='723'/>", " <call method='839' inline='1' count='40960' prof_factor='1'/>", " <inline_success reason='inline (hot)'/>", " <parse method='839' stamp='0.185' uses='40960'>", " <parse_done nodes='216' memory='56880' stamp='0.185' live='209'/>", " </parse>", " <bc code='183' bci='47'/>", " <call method='838' inline='1' count='40960' prof_factor='1'/>", " <inline_success reason='inline (hot)'/>", " <parse method='838' stamp='0.185' uses='40960'>", " <parse_done nodes='255' memory='63208' stamp='0.185' live='247'/>", " </parse>", " <parse_done nodes='258' memory='70920' stamp='0.185' live='250'/>", " </parse>", " <phase_done nodes='258' name='parse' stamp='0.185' live='174'/>", " </phase>", " <phase nodes='258' name='optimizer' stamp='0.185' live='174'>", " <phase nodes='263' name='idealLoop' stamp='0.185' live='167'>", " <loop_tree>", " <loop idx='263' inner_loop='1'>", " </loop>", " </loop_tree>", " <phase_done nodes='264' name='idealLoop' stamp='0.186' live='167'/>", " </phase>", " <phase nodes='264' name='escapeAnalysis' stamp='0.186' live='167'>", " <phase nodes='265' name='connectionGraph' stamp='0.186' live='168'>", " <phase_done nodes='265' name='connectionGraph' stamp='0.186' live='168'/>", " </phase>", " <phase_done nodes='265' name='escapeAnalysis' stamp='0.186' live='168'/>", " </phase>", " <phase nodes='265' name='idealLoop' stamp='0.186' live='168'>", " <loop_tree>", " <loop idx='263' inner_loop='1'>", " </loop>", " </loop_tree>", " <phase_done nodes='271' name='idealLoop' stamp='0.186' live='166'/>", " </phase>", " <phase nodes='271' name='idealLoop' stamp='0.186' live='166'>", " <loop_tree>", " <loop idx='263' inner_loop='1'>", " </loop>", " </loop_tree>", " <phase_done nodes='271' name='idealLoop' stamp='0.186' live='166'/>", " </phase>", " <phase nodes='271' name='idealLoop' stamp='0.186' live='166'>", " <loop_tree>", " <loop idx='263' inner_loop='1'>", " </loop>", " </loop_tree>", " <phase_done nodes='271' name='idealLoop' stamp='0.186' live='166'/>", " </phase>", " <phase nodes='271' name='ccp' stamp='0.186' live='166'>", " <phase_done nodes='271' name='ccp' stamp='0.186' live='166'/>", " </phase>", " <phase nodes='272' name='idealLoop' stamp='0.186' live='164'>", " <loop_tree>", " <loop idx='263' inner_loop='1'>", " </loop>", " </loop_tree>", " <phase_done nodes='272' name='idealLoop' stamp='0.186' live='149'/>", " </phase>", " <phase nodes='272' name='idealLoop' stamp='0.186' live='149'>", " <loop_tree>", " <loop idx='263' inner_loop='1'>", " </loop>", " </loop_tree>", " <phase_done nodes='272' name='idealLoop' stamp='0.186' live='149'/>", " </phase>", " <eliminate_lock kind='coarsened' class_id='lock' lock='1' stamp='0.186' compile_id='21'>", " <jvms method='838' bci='-1'/>", " <jvms method='833' bci='47'/>", " </eliminate_lock>", " <eliminate_lock kind='coarsened' class_id='unlock' lock='0' stamp='0.186' compile_id='21'>", " </eliminate_lock>", " <eliminate_lock kind='nested' class_id='unlock' lock='0' stamp='0.186' compile_id='21'>", " </eliminate_lock>", " <eliminate_lock kind='nested' class_id='lock' lock='1' stamp='0.186' compile_id='21'>", " <jvms method='839' bci='-1'/>", " <jvms method='833' bci='27'/>", " </eliminate_lock>", " <eliminate_lock kind='nested' class_id='unlock' lock='0' stamp='0.186' compile_id='21'>", " </eliminate_lock>", " <eliminate_lock kind='nested' class_id='lock' lock='1' stamp='0.186' compile_id='21'>", " <jvms method='838' bci='-1'/>", " <jvms method='833' bci='21'/>", " </eliminate_lock>", " <dependency ctxk='832' type='leaf_type'/>", " <phase_done nodes='362' name='optimizer' stamp='0.186' live='178'/>", " </phase>", " <phase nodes='362' name='matcher' stamp='0.186' live='178'>", " <phase_done nodes='162' name='matcher' stamp='0.186' live='162'/>", " </phase>", " <phase nodes='211' name='regalloc' stamp='0.186' live='211'>", " <regalloc success='1' attempts='1'/>", " <phase_done nodes='279' name='regalloc' stamp='0.187' live='254'/>", " </phase>", " <phase nodes='279' name='output' stamp='0.187' live='254'>", " <phase_done nodes='291' name='output' stamp='0.187' live='264'/>", " </phase>", " <dependency ctxk='832' type='leaf_type'/>", " <code_cache nmethods='21' free_code_cache='250525696' adapters='145' total_blobs='252'/>", " <task_done inlined_bytes='18' success='1' count='1' backedge_count='101376' stamp='0.191' nmsize='760'/>", "</task>" }; String[] bytecodeLines = new String[]{ " 0: aload_0 ", " 1: invokespecial #1 // Method java/lang/Object.\"<init>\":()V", " 4: lconst_0 ", " 5: lstore_1 ", " 6: iconst_0 ", " 7: istore_3 ", " 8: iload_3 ", " 9: ldc #2 // int 1000000", "11: if_icmpge 57 ", "14: aload_0 ", "15: dup ", "16: astore 4 ", "18: monitorenter ", "19: aload_0 ", "20: lload_1 ", "21: invokespecial #3 // Method increment:(J)J", "24: lstore_1 ", "25: aload_0 ", "26: lload_1 ", "27: invokespecial #4 // Method decrement:(J)J", "30: lstore_1 ", "31: aload 4 ", "33: monitorexit ", "34: goto 45 ", "37: astore 5 ", "39: aload 4 ", "41: monitorexit ", "42: aload 5 ", "44: athrow ", "45: aload_0 ", "46: lload_1 ", "47: invokespecial #3 // Method increment:(J)J", "50: lstore_1 ", "51: iinc 3, 1 ", "54: goto 8 ", "57: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;", "60: lload_1 ", "61: invokevirtual #6 // Method java/io/PrintStream.println:(J)V", "64: return " }; JITDataModel model = new JITDataModel(); model.setVmVersionRelease("1.8.0"); IMetaMember memberLockEliminate = UnitTestUtil.createTestMetaMember(model, "LockEliminate", "LockEliminate", new Class[] { }, void.class); BytecodeAnnotations result = UnitTestUtil.buildAnnotations(false, true, model, memberLockEliminate, lines, bytecodeLines); BytecodeAnnotationList annotations = result.getAnnotationList(memberLockEliminate); assertEquals(7, annotations.annotatedLineCount()); UnitTestUtil.checkAnnotation(annotations, 8, "constraint", BCAnnotationType.UNCOMMON_TRAP); UnitTestUtil.checkAnnotation(annotations, 8, "predicate", BCAnnotationType.UNCOMMON_TRAP); UnitTestUtil.checkAnnotation(annotations, 8, "loop_limit_check", BCAnnotationType.UNCOMMON_TRAP); UnitTestUtil.checkAnnotation(annotations, 11, "taken", BCAnnotationType.BRANCH); UnitTestUtil.checkAnnotation(annotations, 11, "unstable_if", BCAnnotationType.UNCOMMON_TRAP); UnitTestUtil.checkAnnotation(annotations, 18, "null_check", BCAnnotationType.UNCOMMON_TRAP); UnitTestUtil.checkAnnotation(annotations, 21, "inline (hot)", BCAnnotationType.INLINE_SUCCESS); UnitTestUtil.checkAnnotation(annotations, 21, "A lock was eliminated due to inlining at this bci", BCAnnotationType.LOCK_ELISION); UnitTestUtil.checkAnnotation(annotations, 27, "inline (hot)", BCAnnotationType.INLINE_SUCCESS); UnitTestUtil.checkAnnotation(annotations, 27, "A lock was eliminated due to inlining at this bci", BCAnnotationType.LOCK_ELISION); UnitTestUtil.checkAnnotation(annotations, 47, "inline (hot)", BCAnnotationType.INLINE_SUCCESS); UnitTestUtil.checkAnnotation(annotations, 47, "A lock was eliminated due to inlining at this bci", BCAnnotationType.LOCK_ELISION); UnitTestUtil.checkAnnotation(annotations, 57, "unloaded", BCAnnotationType.UNCOMMON_TRAP); // TODO handle BCI -1 (meaning = synchronized method signature?) assertEquals(3, UnitTestUtil.unhandledTags.size()); } }