Mercurial > hg > graal-compiler
comparison test/compiler/whitebox/MakeMethodNotCompilableTest.java @ 10200:d1c9384eecb4
8012322: Tiered: CompilationPolicy::can_be_compiled(CompLevel_all) mistakenly return false
Reviewed-by: kvn, vlivanov
author | iignatyev |
---|---|
date | Fri, 26 Apr 2013 07:21:41 -0700 |
parents | 4b2eebe03f93 |
children | 11237ee74aae |
comparison
equal
deleted
inserted
replaced
10197:7b23cb975cf2 | 10200:d1c9384eecb4 |
---|---|
21 * questions. | 21 * questions. |
22 */ | 22 */ |
23 | 23 |
24 /* | 24 /* |
25 * @test MakeMethodNotCompilableTest | 25 * @test MakeMethodNotCompilableTest |
26 * @bug 8012322 | |
26 * @library /testlibrary /testlibrary/whitebox | 27 * @library /testlibrary /testlibrary/whitebox |
27 * @build MakeMethodNotCompilableTest | 28 * @build MakeMethodNotCompilableTest |
28 * @run main ClassFileInstaller sun.hotspot.WhiteBox | 29 * @run main ClassFileInstaller sun.hotspot.WhiteBox |
29 * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI MakeMethodNotCompilableTest | 30 * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI MakeMethodNotCompilableTest |
30 * @summary testing of WB::makeMethodNotCompilable() | 31 * @summary testing of WB::makeMethodNotCompilable() |
65 if (!WHITE_BOX.isMethodCompilable(method)) { | 66 if (!WHITE_BOX.isMethodCompilable(method)) { |
66 throw new RuntimeException(method + " must be compilable"); | 67 throw new RuntimeException(method + " must be compilable"); |
67 } | 68 } |
68 | 69 |
69 if (TIERED_COMPILATION) { | 70 if (TIERED_COMPILATION) { |
70 for (int i = 1, n = TIERED_STOP_AT_LEVEL + 1; i < n; ++i) { | 71 final int tierLimit = TIERED_STOP_AT_LEVEL + 1; |
71 WHITE_BOX.makeMethodNotCompilable(method, i); | 72 for (int testedTier = 1; testedTier < tierLimit; ++testedTier) { |
72 if (WHITE_BOX.isMethodCompilable(method, i)) { | 73 testTier(testedTier); |
74 } | |
75 for (int testedTier = 1; testedTier < tierLimit; ++testedTier) { | |
76 WHITE_BOX.makeMethodNotCompilable(method, testedTier); | |
77 if (WHITE_BOX.isMethodCompilable(method, testedTier)) { | |
73 throw new RuntimeException(method | 78 throw new RuntimeException(method |
74 + " must be not compilable at level" + i); | 79 + " must be not compilable at level" + testedTier); |
75 } | 80 } |
76 WHITE_BOX.enqueueMethodForCompilation(method, i); | 81 WHITE_BOX.enqueueMethodForCompilation(method, testedTier); |
77 checkNotCompiled(); | 82 checkNotCompiled(); |
78 | 83 |
79 if (!WHITE_BOX.isMethodCompilable(method)) { | 84 if (!WHITE_BOX.isMethodCompilable(method)) { |
80 System.out.println(method | 85 System.out.println(method |
81 + " is not compilable after level " + i); | 86 + " is not compilable after level " + testedTier); |
82 } | 87 } |
83 } | 88 } |
84 | 89 } else { |
85 // WB.clearMethodState() must reset no-compilable flags | 90 compile(); |
91 checkCompiled(); | |
92 int compLevel = WHITE_BOX.getMethodCompilationLevel(method); | |
93 WHITE_BOX.deoptimizeMethod(method); | |
94 WHITE_BOX.makeMethodNotCompilable(method, compLevel); | |
95 if (WHITE_BOX.isMethodCompilable(method, COMP_LEVEL_ANY)) { | |
96 throw new RuntimeException(method | |
97 + " must be not compilable at CompLevel::CompLevel_any," | |
98 + " after it is not compilable at " + compLevel); | |
99 } | |
86 WHITE_BOX.clearMethodState(method); | 100 WHITE_BOX.clearMethodState(method); |
87 if (!WHITE_BOX.isMethodCompilable(method)) { | 101 |
88 throw new RuntimeException(method | 102 // nocompilable at opposite level must make no sense |
89 + " is not compilable after clearMethodState()"); | 103 int oppositeLevel; |
90 } | 104 if (isC1Compile(compLevel)) { |
91 } | 105 oppositeLevel = COMP_LEVEL_FULL_OPTIMIZATION; |
106 } else { | |
107 oppositeLevel = COMP_LEVEL_SIMPLE; | |
108 } | |
109 WHITE_BOX.makeMethodNotCompilable(method, oppositeLevel); | |
110 | |
111 if (!WHITE_BOX.isMethodCompilable(method, COMP_LEVEL_ANY)) { | |
112 throw new RuntimeException(method | |
113 + " must be compilable at CompLevel::CompLevel_any," | |
114 + " even it is not compilable at opposite level [" | |
115 + compLevel + "]"); | |
116 } | |
117 | |
118 if (!WHITE_BOX.isMethodCompilable(method, compLevel)) { | |
119 throw new RuntimeException(method | |
120 + " must be compilable at level " + compLevel | |
121 + ", even it is not compilable at opposite level [" | |
122 + compLevel + "]"); | |
123 } | |
124 } | |
125 | |
126 // clearing after tiered/non-tiered tests | |
127 // WB.clearMethodState() must reset no-compilable flags | |
128 WHITE_BOX.clearMethodState(method); | |
129 if (!WHITE_BOX.isMethodCompilable(method)) { | |
130 throw new RuntimeException(method | |
131 + " is not compilable after clearMethodState()"); | |
132 } | |
133 | |
92 WHITE_BOX.makeMethodNotCompilable(method); | 134 WHITE_BOX.makeMethodNotCompilable(method); |
93 if (WHITE_BOX.isMethodCompilable(method)) { | 135 if (WHITE_BOX.isMethodCompilable(method)) { |
94 throw new RuntimeException(method + " must be not compilable"); | 136 throw new RuntimeException(method + " must be not compilable"); |
95 } | 137 } |
96 | 138 |
106 + " is not compilable after clearMethodState()"); | 148 + " is not compilable after clearMethodState()"); |
107 } | 149 } |
108 compile(); | 150 compile(); |
109 checkCompiled(); | 151 checkCompiled(); |
110 } | 152 } |
153 | |
154 // separately tests each tier | |
155 private void testTier(int testedTier) { | |
156 if (!WHITE_BOX.isMethodCompilable(method, testedTier)) { | |
157 throw new RuntimeException(method | |
158 + " is not compilable on start"); | |
159 } | |
160 WHITE_BOX.makeMethodNotCompilable(method, testedTier); | |
161 | |
162 // tests for all other tiers | |
163 for (int anotherTier = 1, tierLimit = TIERED_STOP_AT_LEVEL + 1; | |
164 anotherTier < tierLimit; ++anotherTier) { | |
165 boolean isCompilable = WHITE_BOX.isMethodCompilable(method, | |
166 anotherTier); | |
167 if (sameCompile(testedTier, anotherTier)) { | |
168 if (isCompilable) { | |
169 throw new RuntimeException(method | |
170 + " must be not compilable at level " + anotherTier | |
171 + ", if it is not compilable at " + testedTier); | |
172 } | |
173 WHITE_BOX.enqueueMethodForCompilation(method, anotherTier); | |
174 checkNotCompiled(); | |
175 } else { | |
176 if (!isCompilable) { | |
177 throw new RuntimeException(method | |
178 + " must be compilable at level " + anotherTier | |
179 + ", even if it is not compilable at " | |
180 + testedTier); | |
181 } | |
182 WHITE_BOX.enqueueMethodForCompilation(method, anotherTier); | |
183 checkCompiled(); | |
184 WHITE_BOX.deoptimizeMethod(method); | |
185 } | |
186 | |
187 if (!WHITE_BOX.isMethodCompilable(method, COMP_LEVEL_ANY)) { | |
188 throw new RuntimeException(method | |
189 + " must be compilable at 'CompLevel::CompLevel_any'" | |
190 + ", if it is not compilable only at " + testedTier); | |
191 } | |
192 } | |
193 | |
194 // clear state after test | |
195 WHITE_BOX.clearMethodState(method); | |
196 if (!WHITE_BOX.isMethodCompilable(method, testedTier)) { | |
197 throw new RuntimeException(method | |
198 + " is not compilable after clearMethodState()"); | |
199 } | |
200 } | |
201 | |
202 private boolean sameCompile(int level1, int level2) { | |
203 if (level1 == level2) { | |
204 return true; | |
205 } | |
206 if (isC1Compile(level1) && isC1Compile(level2)) { | |
207 return true; | |
208 } | |
209 if (isC2Compile(level1) && isC2Compile(level2)) { | |
210 return true; | |
211 } | |
212 return false; | |
213 } | |
111 } | 214 } |