| // Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| // @dart = 2.9 |
| |
| // VMOptions=--deterministic --optimization_counter_threshold=10 |
| |
| // Test on specialized vs non-specialized inlining. |
| |
| import 'dart:core'; |
| import "package:expect/expect.dart"; |
| |
| // To inline or not to inline, that is the question? |
| int foo(int k) { |
| switch (k) { |
| case 0: |
| return 1; |
| case 1: |
| return 2; |
| case 2: |
| return 3; |
| case 3: |
| return 4; |
| case 4: |
| return 5; |
| case 5: |
| return 6; |
| case 6: |
| return 7; |
| case 7: |
| return 8; |
| case 8: |
| return 9; |
| case 9: |
| return 10; |
| case 10: |
| return 11; |
| case 11: |
| return 12; |
| case 12: |
| return 13; |
| case 13: |
| return 14; |
| case 14: |
| return 15; |
| case 15: |
| return 16; |
| case 16: |
| return 17; |
| case 17: |
| return 18; |
| case 18: |
| return 19; |
| case 19: |
| return 20; |
| case 20: |
| return 21; |
| case 21: |
| return 22; |
| case 22: |
| return 23; |
| case 23: |
| return 24; |
| case 24: |
| return 25; |
| case 25: |
| return 26; |
| case 26: |
| return 27; |
| case 27: |
| return 28; |
| case 28: |
| return 29; |
| case 29: |
| return 30; |
| case 30: |
| return 31; |
| case 31: |
| return 32; |
| case 32: |
| return 33; |
| case 33: |
| return 34; |
| case 34: |
| return 35; |
| case 35: |
| return 36; |
| case 36: |
| return 37; |
| case 37: |
| return 38; |
| case 38: |
| return 39; |
| case 39: |
| return 40; |
| case 40: |
| return 41; |
| case 41: |
| return 42; |
| case 42: |
| return 43; |
| case 43: |
| return 44; |
| case 44: |
| return 45; |
| case 45: |
| return 46; |
| case 46: |
| return 47; |
| case 47: |
| return 48; |
| case 48: |
| return 49; |
| case 49: |
| return 50; |
| case 50: |
| return 51; |
| case 51: |
| return 52; |
| case 52: |
| return 53; |
| case 53: |
| return 54; |
| case 54: |
| return 55; |
| case 55: |
| return 56; |
| case 56: |
| return 57; |
| case 57: |
| return 58; |
| case 58: |
| return 59; |
| case 59: |
| return 60; |
| case 60: |
| return 61; |
| case 61: |
| return 62; |
| case 62: |
| return 63; |
| case 63: |
| return 64; |
| case 64: |
| return 65; |
| case 65: |
| return 66; |
| case 66: |
| return 67; |
| case 67: |
| return 68; |
| case 68: |
| return 69; |
| case 69: |
| return 70; |
| case 70: |
| return 71; |
| case 71: |
| return 72; |
| case 72: |
| return 73; |
| case 73: |
| return 74; |
| case 74: |
| return 75; |
| case 75: |
| return 76; |
| case 76: |
| return 77; |
| case 77: |
| return 78; |
| case 78: |
| return 79; |
| case 79: |
| return 80; |
| case 80: |
| return 81; |
| case 81: |
| return 82; |
| case 82: |
| return 83; |
| case 83: |
| return 84; |
| case 84: |
| return 85; |
| case 85: |
| return 86; |
| case 86: |
| return 87; |
| case 87: |
| return 88; |
| case 88: |
| return 89; |
| case 89: |
| return 90; |
| case 90: |
| return 91; |
| case 91: |
| return 92; |
| case 92: |
| return 93; |
| case 93: |
| return 94; |
| case 94: |
| return 95; |
| case 95: |
| return 96; |
| case 96: |
| return 97; |
| case 97: |
| return 98; |
| case 98: |
| return 99; |
| case 99: |
| return 100; |
| case 100: |
| return 101; |
| case 101: |
| return 102; |
| case 102: |
| return 103; |
| case 103: |
| return 104; |
| case 104: |
| return 105; |
| case 105: |
| return 106; |
| case 106: |
| return 107; |
| case 107: |
| return 108; |
| case 108: |
| return 109; |
| case 109: |
| return 110; |
| case 110: |
| return 111; |
| case 111: |
| return 112; |
| case 112: |
| return 113; |
| case 113: |
| return 114; |
| case 114: |
| return 115; |
| case 115: |
| return 116; |
| case 116: |
| return 117; |
| case 117: |
| return 118; |
| case 118: |
| return 119; |
| case 119: |
| return 120; |
| case 120: |
| return 121; |
| case 121: |
| return 122; |
| case 122: |
| return 123; |
| case 123: |
| return 124; |
| case 124: |
| return 125; |
| case 125: |
| return 126; |
| case 126: |
| return 127; |
| case 127: |
| return 128; |
| default: |
| return -1; |
| } |
| } |
| |
| @pragma('vm:never-inline') |
| int bar() { |
| // Here we should inline! The inlined size is very small |
| // after specialization for the constant arguments. |
| return foo(1) + foo(12); |
| } |
| |
| @pragma('vm:never-inline') |
| int baz(int i) { |
| // Here we should not inline! The inlined size is too large, |
| // just keep the original method. In fact, we can use the cached |
| // estimate of foo()'s size from the previous compilation at this |
| // point, which enables the "early" bail heuristic! |
| return foo(i); |
| } |
| |
| main() { |
| // Repeat tests to enter JIT (when applicable). |
| for (int i = 0; i < 20; i++) { |
| Expect.equals(15, bar()); |
| for (int i = -150; i <= 150; i++) { |
| int e = (i < 0 || i > 127) ? -1 : i + 1; |
| Expect.equals(e, baz(i)); |
| } |
| } |
| } |