test/compiler/5091921/Test6890943.java

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

author
fzhinkin
date
Mon, 28 Jul 2014 15:06:38 -0700
changeset 6997
dbb05f6d93c4
parent 4618
514efad5e81a
child 6876
710a3c8b516e
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

kvn@2877 1 /*
drchase@4618 2 * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
kvn@2877 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
kvn@2877 4 *
kvn@2877 5 * This code is free software; you can redistribute it and/or modify it
kvn@2877 6 * under the terms of the GNU General Public License version 2 only, as
kvn@2877 7 * published by the Free Software Foundation.
kvn@2877 8 *
kvn@2877 9 * This code is distributed in the hope that it will be useful, but WITHOUT
kvn@2877 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
kvn@2877 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
kvn@2877 12 * version 2 for more details (a copy is included in the LICENSE file that
kvn@2877 13 * accompanied this code).
kvn@2877 14 *
kvn@2877 15 * You should have received a copy of the GNU General Public License version
kvn@2877 16 * 2 along with this work; if not, write to the Free Software Foundation,
kvn@2877 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
kvn@2877 18 *
kvn@2877 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
kvn@2877 20 * or visit www.oracle.com if you need additional information or have any
kvn@2877 21 * questions.
kvn@2877 22 *
kvn@2877 23 */
kvn@2877 24
kvn@2877 25 /**
kvn@2877 26 * @test
kvn@2877 27 * @bug 6890943
kvn@2877 28 * @summary JVM mysteriously gives wrong result on 64-bit 1.6 VMs in hotspot mode.
kvn@2877 29 *
drchase@4618 30 * @run shell/timeout=240 Test6890943.sh
kvn@2877 31 */
kvn@2877 32 import java.util.*;
kvn@2877 33 import java.io.*;
kvn@2877 34 import java.util.regex.*;
kvn@2877 35
kvn@2877 36 public class Test6890943 {
kvn@2877 37 public static final boolean AIR = true, ROCK = false;
kvn@2877 38 public static void main(String[] args) {
kvn@2877 39 new Test6890943().go();
kvn@2877 40 }
kvn@2877 41
kvn@2877 42 int r, c, f, t;
kvn@2877 43 boolean[][] grid;
kvn@2877 44
kvn@2877 45 public void go() {
kvn@2877 46 Scanner s = new Scanner(System.in);
kvn@2877 47 s.useDelimiter("\\s+");
kvn@2877 48 int T = s.nextInt();
kvn@2877 49 for (t = 0 ; t < T ; t++) {
kvn@2877 50 r = s.nextInt(); c = s.nextInt(); f = s.nextInt();
kvn@2877 51 grid = new boolean[r][c];
kvn@2877 52 for (int x = 0 ; x < r ; x++) {
kvn@2877 53 String line = s.next();
kvn@2877 54 for (int y = 0 ; y < c ; y++) grid[x][y] = line.charAt(y) == '.';
kvn@2877 55 }
kvn@2877 56 int digs = solve();
kvn@2877 57 String res = digs == -1 ? "No" : "Yes " + digs;
kvn@2877 58 System.out.printf("Case #%d: %s\n", t+1, res);
kvn@2877 59 }
kvn@2877 60 }
kvn@2877 61
kvn@2877 62 Map<Integer, Integer> M = new HashMap<Integer, Integer>();
kvn@2877 63
kvn@2877 64 private int solve() {
kvn@2877 65 M = new HashMap<Integer, Integer>();
kvn@2877 66 M.put(calcWalkingRange(0, 0), 0);
kvn@2877 67 for (int digDown = 0 ; digDown < r ; digDown++) {
kvn@2877 68 Map<Integer, Integer> tries = new HashMap<Integer, Integer>();
kvn@2877 69 for (Map.Entry<Integer, Integer> m : M.entrySet()) {
kvn@2877 70 int q = m.getKey();
kvn@2877 71 if (depth(q) != (digDown)) continue;
kvn@2877 72 if (stuck(q)) continue;
kvn@2877 73 tries.put(q, m.getValue());
kvn@2877 74 }
kvn@2877 75
kvn@2877 76 for (Map.Entry<Integer, Integer> m : tries.entrySet()) {
kvn@2877 77 int q = m.getKey();
kvn@2877 78 int fallLeftDelta = 0, fallRightDelta = 0;
kvn@2877 79 //fall left
kvn@2877 80 int fallLeft = fall(digDown, start(q));
kvn@2877 81 if (fallLeft > 0) {
kvn@2877 82 fallLeftDelta = 1;
kvn@2877 83 if (fallLeft <= f) addToM(calcWalkingRange(digDown+fallLeft, start(q)), m.getValue());
kvn@2877 84 }
kvn@2877 85
kvn@2877 86 //fall right
kvn@2877 87 int fallRight = fall(digDown, end(q));
kvn@2877 88 if (fallRight > 0) {
kvn@2877 89 fallRightDelta = 1;
kvn@2877 90
kvn@2877 91 if (fallRight <= f) addToM(calcWalkingRange(digDown+fallRight, end(q)), m.getValue());
kvn@2877 92 }
kvn@2877 93
kvn@2877 94 for (int p = start(q) + fallLeftDelta ; p <= end(q) - fallRightDelta ; p++) {
kvn@2877 95 //goLeft
kvn@2877 96 for (int digSpot = p ; digSpot > start(q) +fallLeftDelta ; digSpot--) {
kvn@2877 97 int fallDown = 1+fall(digDown+1, digSpot);
kvn@2877 98 if (fallDown <= f) {
kvn@2877 99 if (fallDown == 1) {
kvn@2877 100 addToM(calcWalkingRange(digDown + 1, digSpot, digSpot, p), m.getValue() + Math.abs(digSpot-p)+1);
kvn@2877 101 } else {
kvn@2877 102 addToM(calcWalkingRange(digDown + fallDown, digSpot), m.getValue() + Math.abs(digSpot-p)+1);
kvn@2877 103 }
kvn@2877 104 }
kvn@2877 105 }
kvn@2877 106
kvn@2877 107 //goRight
kvn@2877 108 for (int digSpot = p ; digSpot < end(q)-fallRightDelta ;digSpot++) {
kvn@2877 109 int fallDown = 1+fall(digDown+1, digSpot);
kvn@2877 110 if (fallDown <= f) {
kvn@2877 111 if (fallDown == 1) {
kvn@2877 112 addToM(calcWalkingRange(digDown + 1, digSpot, p, digSpot), m.getValue() + Math.abs(digSpot-p)+1);
kvn@2877 113 } else {
kvn@2877 114 addToM(calcWalkingRange(digDown + fallDown, digSpot), m.getValue() + Math.abs(digSpot-p)+1);
kvn@2877 115 }
kvn@2877 116 }
kvn@2877 117 }
kvn@2877 118 }
kvn@2877 119 }
kvn@2877 120 }
kvn@2877 121
kvn@2877 122 int result = Integer.MAX_VALUE;
kvn@2877 123 for (Map.Entry<Integer, Integer> m : M.entrySet()) {
kvn@2877 124 if (depth(m.getKey()) == r-1) result = Math.min(m.getValue(), result);
kvn@2877 125 }
kvn@2877 126
kvn@2877 127 if (result == Integer.MAX_VALUE) return -1;
kvn@2877 128 return result;
kvn@2877 129 }
kvn@2877 130
kvn@2877 131 private void addToM(int q, int i) {
kvn@2877 132 Integer original = M.get(q);
kvn@2877 133 if ( original == null ) M.put(q, i);
kvn@2877 134 else M.put(q, Math.min(original, i));
kvn@2877 135 }
kvn@2877 136
kvn@2877 137 private int fall(int row, int column) {
kvn@2877 138 int res = 0;
kvn@2877 139 for ( int p = row+1 ; p < r ; p++) {
kvn@2877 140 if (grid[p][column] == AIR) res++;
kvn@2877 141 else break;
kvn@2877 142 }
kvn@2877 143 return res;
kvn@2877 144 }
kvn@2877 145
kvn@2877 146 private boolean stuck(int q) {
kvn@2877 147 return start(q) == end(q);
kvn@2877 148 }
kvn@2877 149
kvn@2877 150 private int depth(int q) {
kvn@2877 151 return q % 50;
kvn@2877 152 }
kvn@2877 153
kvn@2877 154 private int start(int q) {
kvn@2877 155 return q / (50*50);
kvn@2877 156 }
kvn@2877 157
kvn@2877 158 private int end(int q) {
kvn@2877 159 return (q / 50) % 50;
kvn@2877 160 }
kvn@2877 161
kvn@2877 162 private int calcWalkingRange(int depth, int pos) {
kvn@2877 163 return calcWalkingRange(depth, pos, Integer.MAX_VALUE, Integer.MIN_VALUE);
kvn@2877 164 }
kvn@2877 165
kvn@2877 166 private int calcWalkingRange(int depth, int pos, int airOverrideStart, int airOverrideEnd) {
kvn@2877 167 int left = pos, right = pos;
kvn@2877 168 if (depth >= r) return (c-1)*50 + depth;
kvn@2877 169
kvn@2877 170 while (left > 0) {
kvn@2877 171 if (grid[depth][left-1] == ROCK && (left-1 < airOverrideStart || left-1 > airOverrideEnd)) break;
kvn@2877 172 if (depth < r-1 && grid[depth+1][left-1] == AIR) {
kvn@2877 173 left--;
kvn@2877 174 break;
kvn@2877 175 }
kvn@2877 176 left--;
kvn@2877 177 }
kvn@2877 178 while (right < c-1) {
kvn@2877 179 if (grid[depth][right+1] == ROCK && (right+1 < airOverrideStart || right+1 > airOverrideEnd)) break;
kvn@2877 180 if (depth < r-1 && grid[depth+1][right+1] == AIR) {
kvn@2877 181 right++;
kvn@2877 182 break;
kvn@2877 183 }
kvn@2877 184 right++;
kvn@2877 185 }
kvn@2877 186
kvn@2877 187 return left *50*50 + right*50 + depth;
kvn@2877 188 }
kvn@2877 189 }

mercurial