test/compiler/5091921/Test5091921.java

Wed, 27 Apr 2016 01:25:04 +0800

author
aoqi
date
Wed, 27 Apr 2016 01:25:04 +0800
changeset 0
f90c822e73f8
permissions
-rw-r--r--

Initial load
http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/
changeset: 6782:28b50d07f6f8
tag: jdk8u25-b17

     1 /*
     2  * Copyright (c) 2011 Hewlett-Packard Company. 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 5091921
    28  * @summary Sign flip issues in loop optimizer
    29  *
    30  * @run main/othervm -Xcomp -XX:CompileOnly=Test5091921 -XX:MaxInlineSize=1 Test5091921
    31  */
    33 public class Test5091921 {
    34   private static int result = 0;
    37   /* Test for the bug of transforming indx >= MININT to indx > MININT-1 */
    38   public static int test_ge1(int limit) {
    39     int indx;
    40     int sum = 0;
    41     for (indx = 500; indx >= limit; indx -= 2) {
    42       sum += 2000 / indx;
    43       result = sum;
    44     }
    45     return sum;
    46   }
    48   /* Test for the bug of transforming indx <= MAXINT to indx < MAXINT+1 */
    49   public static int test_le1(int limit) {
    50     int indx;
    51     int sum = 0;
    52     for (indx = -500; indx <= limit; indx += 2)
    53     {
    54       sum += 3000 / indx;
    55       result = sum;
    56     }
    57     return sum;
    58   }
    60   /* Run with -Xcomp -XX:CompileOnly=wrap1.test1 -XX:MaxInlineSize=1 */
    61   /* limit reset to ((limit-init+stride-1)/stride)*stride+init */
    62   /* Calculation may overflow */
    63   public static volatile int c = 1;
    64   public static int test_wrap1(int limit)
    65   {
    66     int indx;
    67     int sum = 0;
    68     for (indx = 0xffffffff; indx < limit; indx += 0x20000000)
    69     {
    70       sum += c;
    71     }
    72     return sum;
    73   }
    75   /* Test for range check elimination with bit flip issue for
    76      scale*i+offset<limit where offset is not 0 */
    77   static int[] box5 = {1,2,3,4,5,6,7,8,9};
    78   public static int test_rce5(int[] b, int limit)
    79   {
    80     int indx;
    81     int sum = b[1];
    82     result = sum;
    83     for (indx = 0x80000000; indx < limit; ++indx)
    84     {
    85       if (indx > 0x80000000)
    86       {
    87         // this test is not issued in pre-loop but issued in main loop
    88         // trick rce into thinking expression is false when indx >= 0
    89         // in fact it is false when indx==0x80000001
    90         if (indx - 9 < -9)
    91         {
    92           sum += indx;
    93           result = sum;
    94           sum ^= b[indx & 7];
    95           result = sum;
    96         }
    97         else
    98           break;
    99       }
   100       else
   101       {
   102         sum += b[indx & 3];
   103         result = sum;
   104       }
   105     }
   106     return sum;
   107   }
   109   /* Test for range check elimination with bit flip issue for
   110      scale*i<limit where scale > 1 */
   111   static int[] box6 = {1,2,3,4,5,6,7,8,9};
   112   public static int test_rce6(int[] b, int limit)
   113   {
   114     int indx;
   115     int sum = b[1];
   116     result = sum;
   117     for (indx = 0x80000000; indx < limit; ++indx)
   118     {
   119       if (indx > 0x80000000)
   120       {
   121         // harmless rce target
   122         if (indx < 0)
   123         {
   124           sum += result;
   125           result = sum;
   126         }
   127         else
   128           break;
   129         // this test is not issued in pre-loop but issued in main loop
   130         // trick rce into thinking expression is false when indx >= 0
   131         // in fact it is false when indx==0x80000001
   132         // In compilers that transform mulI to shiftI may mask this issue.
   133         if (indx * 28 + 1 < 0)
   134         {
   135           sum += indx;
   136           result = sum;
   137           sum ^= b[indx & 7];
   138           result = sum;
   139         }
   140         else
   141           break;
   142       }
   143       else
   144       {
   145         sum += b[indx & 3];
   146         result = sum;
   147       }
   148     }
   149     return sum;
   150   }
   152   /* Test for range check elimination with i <= limit */
   153   static int[] box7 = {1,2,3,4,5,6,7,8,9,0x7fffffff};
   154   public static int test_rce7(int[] b)
   155   {
   156     int indx;
   157     int max = b[9];
   158     int sum = b[7];
   159     result = sum;
   160     for (indx = 0; indx < b.length; ++indx)
   161     {
   162       if (indx <= max)
   163       {
   164         sum += (indx ^ 15) + ((result != 0) ? 0 : sum);
   165         result = sum;
   166       }
   167       else
   168         throw new RuntimeException();
   169     }
   170     for (indx = -7; indx < b.length; ++indx)
   171     {
   172       if (indx <= 9)
   173       {
   174         sum += (sum ^ 15) + ((result != 0) ? 0 : sum);
   175         result = sum;
   176       }
   177       else
   178         throw new RuntimeException();
   179     }
   180     return sum;
   181   }
   183   /* Test for range check elimination with i >= limit */
   184   static int[] box8 = {-1,0,1,2,3,4,5,6,7,8,0x80000000};
   185   public static int test_rce8(int[] b)
   186   {
   187     int indx;
   188     int sum = b[5];
   189     int min = b[10];
   190     result = sum;
   191     for (indx = b.length-1; indx >= 0; --indx)
   192     {
   193       if (indx >= min)
   194       {
   195         sum += (sum ^ 9) + ((result != 0) ? 0 :sum);
   196         result = sum;
   197       }
   198       else
   199         throw new RuntimeException();
   200     }
   201     return sum;
   202   }
   204   public static void main(String[] args)
   205   {
   206     result=1;
   207     int r = 0;
   208     try {
   209       r = test_ge1(0x80000000);
   210       System.out.println(result);
   211       System.out.println("test_ge1 FAILED");
   212       System.exit(1);
   213     }
   214     catch (ArithmeticException e1) {
   215       System.out.println("test_ge1: Expected exception caught");
   216       if (result != 5986) {
   217         System.out.println(result);
   218         System.out.println("test_ge1 FAILED");
   219         System.exit(97);
   220       }
   221     }
   222     System.out.println("test_ge1 WORKED");
   224     result=0;
   225     try
   226     {
   227       r = test_le1(0x7fffffff);
   228       System.out.println(result);
   229       System.out.println("test_le1 FAILED");
   230       System.exit(1);
   231     }
   232     catch (ArithmeticException e1)
   233     {
   234       System.out.println("test_le1: Expected exception caught");
   235       if (result != -9039)
   236       {
   237         System.out.println(result);
   238         System.out.println("test_le1 FAILED");
   239         System.exit(97);
   240       }
   241     }
   242     System.out.println("test_le1 WORKED");
   244     result=0;
   245     r = test_wrap1(0x7fffffff);
   246     if (r != 4)
   247     {
   248       System.out.println(result);
   249       System.out.println("test_wrap1 FAILED");
   250       System.exit(97);
   251     }
   252     else
   253     {
   254       System.out.println("test_wrap1 WORKED");
   255     }
   257     result=0;
   258     r = test_rce5(box5,0x80000100);
   259     if (result != 3)
   260     {
   261       System.out.println(result);
   262       System.out.println("test_rce5 FAILED");
   263       System.exit(97);
   264     }
   265     else
   266     {
   267       System.out.println("test_rce5 WORKED");
   268     }
   270     result=0;
   271     r = test_rce6(box6,0x80000100);
   272     if (result != 6)
   273     {
   274       System.out.println(result);
   275       System.out.println("test_rce6 FAILED");
   276       System.exit(97);
   277     }
   278     else
   279     {
   280       System.out.println("test_rce6 WORKED");
   281     }
   283     result=0;
   284     r = test_rce7(box7);
   285     if (result != 14680079)
   286     {
   287       System.out.println(result);
   288       System.out.println("test_rce7 FAILED");
   289       System.exit(97);
   290     }
   291     else
   292     {
   293       System.out.println("test_rce7 WORKED");
   294     }
   296     result=0;
   297     r = test_rce8(box8);
   298     if (result != 16393)
   299     {
   300       System.out.println(result);
   301       System.out.println("test_rce8 FAILED");
   302       System.exit(97);
   303     }
   304     else
   305     {
   306       System.out.println("test_rce8 WORKED");
   307     }
   308   }
   309 }

mercurial