test/compiler/6942326/Test.java

Mon, 28 Jul 2014 15:06:38 -0700

author
fzhinkin
date
Mon, 28 Jul 2014 15:06:38 -0700
changeset 6997
dbb05f6d93c4
parent 0
f90c822e73f8
permissions
-rw-r--r--

8051344: JVM crashed in Compile::start() during method parsing w/ UseRTMDeopt turned on
Summary: call rtm_deopt() only if there were no compilation bailouts before.
Reviewed-by: kvn

     1 /*
     2  * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    25 /**
    26  * @test
    27  * @bug 6942326
    28  * @summary x86 code in string_indexof() could read beyond reserved heap space
    29  *
    30  * @run main/othervm/timeout=300 -Xmx32m -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:CompileCommand=exclude,Test,main -XX:CompileCommand=exclude,Test,test_varsub_indexof -XX:CompileCommand=exclude,Test,test_varstr_indexof -XX:CompileCommand=exclude,Test,test_missub_indexof -XX:CompileCommand=exclude,Test,test_consub_indexof -XX:CompileCommand=exclude,Test,test_conmis_indexof -XX:CompileCommand=exclude,Test,test_subcon Test
    31  *
    32  */
    34 public class Test {
    36     static String[] strings = new String[1024];
    37     private static final int ITERATIONS = 100000;
    39     public static void main(String[] args) {
    41         long start_total = System.currentTimeMillis();
    43         // search variable size substring in string (33 chars).
    44         String a = " 1111111111111xx1111111111111xx11y"; // +1 to execute a.substring(1) first
    45         String b =  "1111111111111xx1111111111111xx11y";
    46         test_varsub_indexof(a, b);
    48         // search variable size substring in string (32 chars).
    49         a = " 1111111111111xx1111111111111xx1y";
    50         b =  "1111111111111xx1111111111111xx1y";
    51         test_varsub_indexof(a, b);
    53         // search variable size substring in string (17 chars).
    54         a = " 1111111111111xx1y";
    55         b =  "1111111111111xx1y";
    56         test_varsub_indexof(a, b);
    58         // search variable size substring in string (16 chars).
    59         a = " 111111111111xx1y";
    60         b =  "111111111111xx1y";
    61         test_varsub_indexof(a, b);
    63         // search variable size substring in string (8 chars).
    64         a = " 1111xx1y";
    65         b =  "1111xx1y";
    66         test_varsub_indexof(a, b);
    68         // search variable size substring in string (7 chars).
    69         a = " 111xx1y";
    70         b =  "111xx1y";
    71         test_varsub_indexof(a, b);
    75         // search substring (17 chars) in variable size string.
    76         a =                 "1111111111111xx1x";
    77         b = " 1111111111111xx1111111111111xx1x"; // +1 to execute b.substring(1) first
    78         test_varstr_indexof(a, b);
    80         // search substring (16 chars) in variable size string.
    81         a =                  "111111111111xx1x";
    82         b = " 1111111111111xx1111111111111xx1x";
    83         test_varstr_indexof(a, b);
    85         // search substring (9 chars) in variable size string.
    86         a =                         "11111xx1x";
    87         b = " 1111111111111xx1111111111111xx1x";
    88         test_varstr_indexof(a, b);
    90         // search substring (8 chars) in variable size string.
    91         a =                          "1111xx1x";
    92         b = " 1111111111111xx1111111111111xx1x";
    93         test_varstr_indexof(a, b);
    95         // search substring (4 chars) in variable size string.
    96         a =                              "xx1x";
    97         b = " 1111111111111xx1111111111111xx1x";
    98         test_varstr_indexof(a, b);
   100         // search substring (3 chars) in variable size string.
   101         a =                               "x1x";
   102         b = " 1111111111111xx1111111111111xx1x";
   103         test_varstr_indexof(a, b);
   105         // search substring (2 chars) in variable size string.
   106         a =                                "1y";
   107         b = " 1111111111111xx1111111111111xx1y";
   108         test_varstr_indexof(a, b);
   112         // search non matching variable size substring in string (33 chars).
   113         a = " 1111111111111xx1111111111111xx11z"; // +1 to execute a.substring(1) first
   114         b =  "1111111111111xx1111111111111xx11y";
   115         test_missub_indexof(a, b);
   117         // search non matching variable size substring in string (32 chars).
   118         a = " 1111111111111xx1111111111111xx1z";
   119         b =  "1111111111111xx1111111111111xx1y";
   120         test_missub_indexof(a, b);
   122         // search non matching variable size substring in string (17 chars).
   123         a = " 1111111111111xx1z";
   124         b =  "1111111111111xx1y";
   125         test_missub_indexof(a, b);
   127         // search non matching variable size substring in string (16 chars).
   128         a = " 111111111111xx1z";
   129         b =  "111111111111xx1y";
   130         test_missub_indexof(a, b);
   132         // search non matching variable size substring in string (8 chars).
   133         a = " 1111xx1z";
   134         b =  "1111xx1y";
   135         test_missub_indexof(a, b);
   137         // search non matching variable size substring in string (7 chars).
   138         a = " 111xx1z";
   139         b =  "111xx1y";
   140         test_missub_indexof(a, b);
   144         // Testing constant substring search in variable size string.
   146         // search constant substring (17 chars).
   147         b = " 1111111111111xx1111111111111xx1x"; // +1 to execute b.substring(1) first
   148         TestCon tc = new TestCon17();
   149         test_consub_indexof(tc, b);
   151         // search constant substring (16 chars).
   152         b = " 1111111111111xx1111111111111xx1x";
   153         tc = new TestCon16();
   154         test_consub_indexof(tc, b);
   156         // search constant substring (9 chars).
   157         b = " 1111111111111xx1111111111111xx1x";
   158         tc = new TestCon9();
   159         test_consub_indexof(tc, b);
   161         // search constant substring (8 chars).
   162         b = " 1111111111111xx1111111111111xx1x";
   163         tc = new TestCon8();
   164         test_consub_indexof(tc, b);
   166         // search constant substring (4 chars).
   167         b = " 1111111111111xx1111111111111xx1x";
   168         tc = new TestCon4();
   169         test_consub_indexof(tc, b);
   171         // search constant substring (3 chars).
   172         b = " 1111111111111xx1111111111111xx1x";
   173         tc = new TestCon3();
   174         test_consub_indexof(tc, b);
   176         // search constant substring (2 chars).
   177         b = " 1111111111111xx1111111111111xx1y";
   178         tc = new TestCon2();
   179         test_consub_indexof(tc, b);
   181         // search constant substring (1 chars).
   182         b = " 1111111111111xx1111111111111xx1y";
   183         tc = new TestCon1();
   184         test_consub_indexof(tc, b);
   187         // search non matching constant substring (17 chars).
   188         b = " 1111111111111xx1111111111111xx1z"; // +1 to execute b.substring(1) first
   189         tc = new TestCon17();
   190         test_conmis_indexof(tc, b);
   192         // search non matching constant substring (16 chars).
   193         b = " 1111111111111xx1111111111111xx1z";
   194         tc = new TestCon16();
   195         test_conmis_indexof(tc, b);
   197         // search non matching constant substring (9 chars).
   198         b = " 1111111111111xx1111111111111xx1z";
   199         tc = new TestCon9();
   200         test_conmis_indexof(tc, b);
   202         // search non matching constant substring (8 chars).
   203         b = " 1111111111111xx1111111111111xx1z";
   204         tc = new TestCon8();
   205         test_conmis_indexof(tc, b);
   207         // search non matching constant substring (4 chars).
   208         b = " 1111111111111xx1111111111111xx1z";
   209         tc = new TestCon4();
   210         test_conmis_indexof(tc, b);
   212         // search non matching constant substring (3 chars).
   213         b = " 1111111111111xx1111111111111xx1z";
   214         tc = new TestCon3();
   215         test_conmis_indexof(tc, b);
   217         // search non matching constant substring (2 chars).
   218         b = " 1111111111111xx1111111111111xx1z";
   219         tc = new TestCon2();
   220         test_conmis_indexof(tc, b);
   222         // search non matching constant substring (1 chars).
   223         b = " 1111111111111xx1111111111111xx1z";
   224         tc = new TestCon1();
   225         test_conmis_indexof(tc, b);
   227         long end_total = System.currentTimeMillis();
   228         System.out.println("End run time: " + (end_total - start_total));
   230     }
   232     public static long test_init(String a, String b) {
   233         for (int i = 0; i < 512; i++) {
   234             strings[i * 2] = new String(b.toCharArray());
   235             strings[i * 2 + 1] = new String(a.toCharArray());
   236         }
   237         System.out.print(a.length() + " " + b.length() + " ");
   238         return System.currentTimeMillis();
   239     }
   241     public static void test_end(String a, String b, int v, int expected, long start) {
   242         long end = System.currentTimeMillis();
   243         int res = (v/ITERATIONS);
   244         System.out.print(" " + res);
   245         System.out.println(" time:" + (end - start));
   246         if (res != expected) {
   247             System.out.println("wrong indexOf result: " + res + ", expected " + expected);
   248             System.out.println("\"" + b + "\".indexOf(\"" + a + "\")");
   249             System.exit(97);
   250         }
   251     }
   253     public static int test_subvar() {
   254         int s = 0;
   255         int v = 0;
   256         for (int i = 0; i < ITERATIONS; i++) {
   257             v += strings[s].indexOf(strings[s + 1]);
   258             s += 2;
   259             if (s >= strings.length) s = 0;
   260         }
   261         return v;
   262     }
   264     public static void test_varsub_indexof(String a, String b) {
   265         System.out.println("Start search variable size substring in string (" + b.length() + " chars)");
   266         long start_it = System.currentTimeMillis();
   267         int limit = 1; // last a.length() == 1
   268         while (a.length() > limit) {
   269             a = a.substring(1);
   270             long start = test_init(a, b);
   271             int v = test_subvar();
   272             test_end(a, b, v, (b.length() - a.length()), start);
   273         }
   274         long end_it = System.currentTimeMillis();
   275         System.out.println("End search variable size substring in string (" + b.length() + " chars), time: " + (end_it - start_it));
   276     }
   278     public static void test_varstr_indexof(String a, String b) {
   279         System.out.println("Start search substring (" + a.length() + " chars) in variable size string");
   280         long start_it = System.currentTimeMillis();
   281         int limit = a.length();
   282         while (b.length() > limit) {
   283             b = b.substring(1);
   284             long start = test_init(a, b);
   285             int v = test_subvar();
   286             test_end(a, b, v, (b.length() - a.length()), start);
   287         }
   288         long end_it = System.currentTimeMillis();
   289         System.out.println("End search substring (" + a.length() + " chars) in variable size string, time: " + (end_it - start_it));
   290     }
   292     public static void test_missub_indexof(String a, String b) {
   293         System.out.println("Start search non matching variable size substring in string (" + b.length() + " chars)");
   294         long start_it = System.currentTimeMillis();
   295         int limit = 1; // last a.length() == 1
   296         while (a.length() > limit) {
   297             a = a.substring(1);
   298             long start = test_init(a, b);
   299             int v = test_subvar();
   300             test_end(a, b, v, (-1), start);
   301         }
   302         long end_it = System.currentTimeMillis();
   303         System.out.println("End search non matching variable size substring in string (" + b.length() + " chars), time: " + (end_it - start_it));
   304     }
   308     public static void test_consub_indexof(TestCon tc, String b) {
   309         System.out.println("Start search constant substring (" + tc.constr().length() + " chars)");
   310         long start_it = System.currentTimeMillis();
   311         int limit = tc.constr().length();
   312         while (b.length() > limit) {
   313             b = b.substring(1);
   314             long start = test_init(tc.constr(), b);
   315             int v = test_subcon(tc);
   316             test_end(tc.constr(), b, v, (b.length() - tc.constr().length()), start);
   317         }
   318         long end_it = System.currentTimeMillis();
   319         System.out.println("End search constant substring (" + tc.constr().length() + " chars), time: " + (end_it - start_it));
   320     }
   322     public static void test_conmis_indexof(TestCon tc, String b) {
   323         System.out.println("Start search non matching constant substring (" + tc.constr().length() + " chars)");
   324         long start_it = System.currentTimeMillis();
   325         int limit = tc.constr().length();
   326         while (b.length() > limit) {
   327             b = b.substring(1);
   328             long start = test_init(tc.constr(), b);
   329             int v = test_subcon(tc);
   330             test_end(tc.constr(), b, v, (-1), start);
   331         }
   332         long end_it = System.currentTimeMillis();
   333         System.out.println("End search non matching constant substring (" + tc.constr().length() + " chars), time: " + (end_it - start_it));
   334     }
   336     public static int test_subcon(TestCon tc) {
   337         int s = 0;
   338         int v = 0;
   339         for (int i = 0; i < ITERATIONS; i++) {
   340             v += tc.indexOf(strings[s]);
   341             s += 2;
   342             if (s >= strings.length) s = 0;
   343         }
   344         return v;
   345     }
   347     private interface TestCon {
   348         public String constr();
   349         public int indexOf(String str);
   350     }
   352     // search constant substring (17 chars).
   353     private final static class TestCon17 implements TestCon {
   354         private static final String constr = "1111111111111xx1x";
   355         public String constr() { return constr; }
   356         public int indexOf(String str) { return str.indexOf(constr); }
   357     }
   359     // search constant substring (16 chars).
   360     private final static class TestCon16 implements TestCon {
   361         private static final String constr = "111111111111xx1x";
   362         public String constr() { return constr; }
   363         public int indexOf(String str) { return str.indexOf(constr); }
   364     }
   366     // search constant substring (9 chars).
   367     private final static class TestCon9 implements TestCon {
   368         private static final String constr = "11111xx1x";
   369         public String constr() { return constr; }
   370         public int indexOf(String str) { return str.indexOf(constr); }
   371     }
   373     // search constant substring (8 chars).
   374     private final static class TestCon8 implements TestCon {
   375         private static final String constr = "1111xx1x";
   376         public String constr() { return constr; }
   377         public int indexOf(String str) { return str.indexOf(constr); }
   378     }
   380     // search constant substring (4 chars).
   381     private final static class TestCon4 implements TestCon {
   382         private static final String constr = "xx1x";
   383         public String constr() { return constr; }
   384         public int indexOf(String str) { return str.indexOf(constr); }
   385     }
   387     // search constant substring (3 chars).
   388     private final static class TestCon3 implements TestCon {
   389         private static final String constr = "x1x";
   390         public String constr() { return constr; }
   391         public int indexOf(String str) { return str.indexOf(constr); }
   392     }
   394     // search constant substring (2 chars).
   395     private final static class TestCon2 implements TestCon {
   396         private static final String constr = "1y";
   397         public String constr() { return constr; }
   398         public int indexOf(String str) { return str.indexOf(constr); }
   399     }
   402     // search constant substring (1 chars).
   403     private final static class TestCon1 implements TestCon {
   404         private static final String constr = "y";
   405         public String constr() { return constr; }
   406         public int indexOf(String str) { return str.indexOf(constr); }
   407     }
   408 }

mercurial