1 /*
   2  * Copyright (c) 2019, 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 
  24 /*
  25  * @test
  26  * @bug 8223502
  27  * @summary Node estimate for loop unswitching is not correct:
  28  *          assert(delta <= 2 * required) failed: Bad node estimate
  29  *
  30  * @run main/othervm -XX:-TieredCompilation -XX:-BackgroundCompilation
  31  *      -XX:-UseOnStackReplacement -XX:CompileOnly=LoopUnswitchingBadNodeBudget::test
  32  *      -XX:CompileCommand=dontinline,LoopUnswitchingBadNodeBudget::helper
  33  *      -XX:+UnlockExperimentalVMOptions -XX:-UseSwitchProfiling LoopUnswitchingBadNodeBudget
  34  *
  35  */
  36 
  37 public class LoopUnswitchingBadNodeBudget {
  38 
  39     public static void main(String[] args) {
  40         for (int i = 0; i < 20_000; i++) {
  41             for (int j = 0; j < 100; j++) {
  42                 test(j, true, 0, 0, 0);
  43                 test(j, false, 0, 0, 0);
  44             }
  45         }
  46     }
  47 
  48     private static int test(int j, boolean flag, int k, int l, int m) {
  49         int res = 0;
  50         for (int i = 0; i < 24; i++) {
  51             if (flag) {
  52                 k = k / 2;
  53                 l = l * 2;
  54                 m = m + 2;
  55             }
  56             switch(j) {
  57                 case  0: break; 
  58                 case  1: return helper(j, k, l, m);
  59                 case  2: return helper(j, k, l, m);
  60                 case  3: return helper(j, k, l, m);
  61                 case  4: return helper(j, k, l, m);
  62                 case  5: return helper(j, k, l, m);
  63                 case  6: return helper(j, k, l, m);
  64                 case  7: return helper(j, k, l, m);
  65                 case  8: return helper(j, k, l, m);
  66                 case  9: return helper(j, k, l, m);
  67                 case 10: return helper(j, k, l, m);
  68                 case 11: return helper(j, k, l, m);
  69                 case 12: return helper(j, k, l, m);
  70                 case 13: return helper(j, k, l, m);
  71                 case 14: return helper(j, k, l, m);
  72                 case 15: return helper(j, k, l, m);
  73                 case 16: return helper(j, k, l, m);
  74                 case 17: return helper(j, k, l, m);
  75                 case 18: return helper(j, k, l, m);
  76                 case 19: return helper(j, k, l, m);
  77                 case 20: return helper(j, k, l, m);
  78                 case 21: return helper(j, k, l, m);
  79                 case 22: return helper(j, k, l, m);
  80                 case 23: return helper(j, k, l, m);
  81                 case 24: return helper(j, k, l, m);
  82                 case 25: return helper(j, k, l, m);
  83                 case 26: return helper(j, k, l, m);
  84                 case 27: return helper(j, k, l, m);
  85                 case 28: return helper(j, k, l, m);
  86                 case 29: return helper(j, k, l, m);
  87                 case 30: return helper(j, k, l, m);
  88                 case 31: return helper(j, k, l, m);
  89                 case 32: return helper(j, k, l, m);
  90                 case 33: return helper(j, k, l, m);
  91                 case 34: return helper(j, k, l, m);
  92                 case 35: return helper(j, k, l, m);
  93                 case 36: return helper(j, k, l, m);
  94                 case 37: return helper(j, k, l, m);
  95                 case 38: return helper(j, k, l, m);
  96                 case 39: return helper(j, k, l, m);
  97                 case 40: return helper(j, k, l, m);
  98                 case 41: return helper(j, k, l, m);
  99                 case 42: return helper(j, k, l, m);
 100                 case 43: return helper(j, k, l, m);
 101                 case 44: return helper(j, k, l, m);
 102                 case 45: return helper(j, k, l, m);
 103                 case 46: return helper(j, k, l, m);
 104                 case 47: return helper(j, k, l, m);
 105                 case 48: return helper(j, k, l, m);
 106                 case 49: return helper(j, k, l, m);
 107                 case 50: return helper(j, k, l, m);
 108                 case 51: return helper(j, k, l, m);
 109                 case 52: return helper(j, k, l, m);
 110                 case 53: return helper(j, k, l, m);
 111                 case 54: return helper(j, k, l, m);
 112                 case 55: return helper(j, k, l, m);
 113                 case 56: return helper(j, k, l, m);
 114                 case 57: return helper(j, k, l, m);
 115                 case 58: return helper(j, k, l, m);
 116                 case 59: return helper(j, k, l, m);
 117                 case 60: return helper(j, k, l, m);
 118                 case 61: return helper(j, k, l, m);
 119                 case 62: return helper(j, k, l, m);
 120                 case 63: return helper(j, k, l, m);
 121                 case 64: return helper(j, k, l, m);
 122                 case 65: return helper(j, k, l, m);
 123                 case 66: return helper(j, k, l, m);
 124                 case 67: return helper(j, k, l, m);
 125                 case 68: return helper(j, k, l, m);
 126                 case 69: return helper(j, k, l, m);
 127                 case 70: return helper(j, k, l, m);
 128                 case 71: return helper(j, k, l, m);
 129                 case 72: return helper(j, k, l, m);
 130                 case 73: return helper(j, k, l, m);
 131                 case 74: return helper(j, k, l, m);
 132                 case 75: return helper(j, k, l, m);
 133                 case 76: return helper(j, k, l, m);
 134                 case 77: return helper(j, k, l, m);
 135                 case 78: return helper(j, k, l, m);
 136                 case 79: return helper(j, k, l, m);
 137                 case 80: return helper(j, k, l, m);
 138                 case 81: return helper(j, k, l, m);
 139                 case 82: return helper(j, k, l, m);
 140                 case 83: return helper(j, k, l, m);
 141                 case 84: return helper(j, k, l, m);
 142                 case 85: return helper(j, k, l, m);
 143                 case 86: return helper(j, k, l, m);
 144                 case 87: return helper(j, k, l, m);
 145                 case 88: return helper(j, k, l, m);
 146                 case 89: return helper(j, k, l, m);
 147                 case 90: return helper(j, k, l, m);
 148                 case 91: return helper(j, k, l, m);
 149                 case 92: return helper(j, k, l, m);
 150                 case 93: return helper(j, k, l, m);
 151                 case 94: return helper(j, k, l, m);
 152                 case 95: return helper(j, k, l, m);
 153                 case 96: return helper(j, k, l, m);
 154                 case 97: return helper(j, k, l, m);
 155                 case 98: return helper(j, k, l, m);
 156                 case 99: return helper(j, k, l, m);
 157             }
 158             res += helper(j, k, l, m);
 159         }
 160         return res;
 161     }
 162 
 163     private static int helper(int j, int k, int l, int m) {
 164         return j+k;
 165     }
 166 }