test/compiler/loopopts/TestLogSum.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

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation.
aoqi@0 8 *
aoqi@0 9 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 12 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 13 * accompanied this code).
aoqi@0 14 *
aoqi@0 15 * You should have received a copy of the GNU General Public License version
aoqi@0 16 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 18 *
aoqi@0 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 20 * or visit www.oracle.com if you need additional information or have any
aoqi@0 21 * questions.
aoqi@0 22 */
aoqi@0 23
aoqi@0 24 /*
aoqi@0 25 * @test
aoqi@0 26 * @bug 8046516
aoqi@0 27 * @summary Segmentation fault in JVM (easily reproducible)
aoqi@0 28 * @run main/othervm -XX:-TieredCompilation -Xbatch TestLogSum
aoqi@0 29 * @author jackkamm@gmail.com
aoqi@0 30 */
aoqi@0 31
aoqi@0 32 import java.util.Arrays;
aoqi@0 33 import java.util.HashMap;
aoqi@0 34 import java.util.List;
aoqi@0 35 import java.util.Map;
aoqi@0 36 public class TestLogSum {
aoqi@0 37 public static void main(String[] args) {
aoqi@0 38 double sum;
aoqi@0 39
aoqi@0 40 for (int i = 0; i < 6; i++) {
aoqi@0 41 for (int n = 2; n < 30; n++) {
aoqi@0 42 for (int j = 1; j <= n; j++) {
aoqi@0 43 for (int k = 1; k <= j; k++) {
aoqi@0 44 // System.out.println(computeSum(k, j));
aoqi@0 45 sum = computeSum(k, j);
aoqi@0 46 }
aoqi@0 47 }
aoqi@0 48 }
aoqi@0 49 }
aoqi@0 50 }
aoqi@0 51
aoqi@0 52 private static Map<List<Integer>, Double> cache = new HashMap<List<Integer>, Double>();
aoqi@0 53 public static double computeSum(int x, int y) {
aoqi@0 54 List<Integer> key = Arrays.asList(new Integer[] {x, y});
aoqi@0 55
aoqi@0 56 if (!cache.containsKey(key)) {
aoqi@0 57
aoqi@0 58 // explicitly creating/updating a double[] array, instead of using the LogSumArray wrapper object, will prevent the error
aoqi@0 59 LogSumArray toReturn = new LogSumArray(x);
aoqi@0 60
aoqi@0 61 // changing loop indices will prevent the error
aoqi@0 62 // in particular, for(z=0; z<x-1; z++), and then using z+1 in place of z, will not produce error
aoqi@0 63 for (int z = 1; z < x+1; z++) {
aoqi@0 64 double logSummand = Math.log(z + x + y);
aoqi@0 65 toReturn.addLogSummand(logSummand);
aoqi@0 66 }
aoqi@0 67
aoqi@0 68 // returning the value here without cacheing it will prevent the segfault
aoqi@0 69 cache.put(key, toReturn.retrieveLogSum());
aoqi@0 70 }
aoqi@0 71 return cache.get(key);
aoqi@0 72 }
aoqi@0 73
aoqi@0 74 /*
aoqi@0 75 * Given a bunch of logarithms log(X),log(Y),log(Z),...
aoqi@0 76 * This class is used to compute the log of the sum, log(X+Y+Z+...)
aoqi@0 77 */
aoqi@0 78 private static class LogSumArray {
aoqi@0 79 private double[] logSummandArray;
aoqi@0 80 private int currSize;
aoqi@0 81
aoqi@0 82 private double maxLogSummand;
aoqi@0 83
aoqi@0 84 public LogSumArray(int maxEntries) {
aoqi@0 85 this.logSummandArray = new double[maxEntries];
aoqi@0 86
aoqi@0 87 this.currSize = 0;
aoqi@0 88 this.maxLogSummand = Double.NEGATIVE_INFINITY;
aoqi@0 89 }
aoqi@0 90
aoqi@0 91 public void addLogSummand(double logSummand) {
aoqi@0 92 logSummandArray[currSize] = logSummand;
aoqi@0 93 currSize++;
aoqi@0 94 // removing this line will prevent the error
aoqi@0 95 maxLogSummand = Math.max(maxLogSummand, logSummand);
aoqi@0 96 }
aoqi@0 97
aoqi@0 98 public double retrieveLogSum() {
aoqi@0 99 if (maxLogSummand == Double.NEGATIVE_INFINITY) return Double.NEGATIVE_INFINITY;
aoqi@0 100
aoqi@0 101 assert currSize <= logSummandArray.length;
aoqi@0 102
aoqi@0 103 double factorSum = 0;
aoqi@0 104 for (int i = 0; i < currSize; i++) {
aoqi@0 105 factorSum += Math.exp(logSummandArray[i] - maxLogSummand);
aoqi@0 106 }
aoqi@0 107
aoqi@0 108 return Math.log(factorSum) + maxLogSummand;
aoqi@0 109 }
aoqi@0 110 }
aoqi@0 111 }

mercurial