127df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle/*
26a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain * Copyright (C) 2015 The Android Open Source Project
36a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain *
46a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain * Licensed under the Apache License, Version 2.0 (the "License");
56a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain * you may not use this file except in compliance with the License.
66a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain * You may obtain a copy of the License at
76a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain *
86a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain *      http://www.apache.org/licenses/LICENSE-2.0
96a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain *
106a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain * Unless required by applicable law or agreed to in writing, software
116a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain * distributed under the License is distributed on an "AS IS" BASIS,
126a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain * See the License for the specific language governing permissions and
146a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain * limitations under the License.
156a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain */
1627df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
173cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle// TODO: Add more tests after we can inline functions with calls.
1827df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
1927df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravleclass ClassWithoutFinals {
20a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void ClassWithoutFinals.<init>() register (after)
21a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: MemoryBarrier kind:StoreStore
2227df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  public ClassWithoutFinals() {}
2327df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle}
2427df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
2527df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravleclass ClassWithFinals {
2627df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  public final int x;
2727df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  public ClassWithFinals obj;
285949fa0cb9a8d26ac20b9b02065a63b4b20443beNicolas Geoffray  public static boolean doThrow = false;
2927df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
30a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void ClassWithFinals.<init>(boolean) register (after)
31a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK:      MemoryBarrier kind:StoreStore
32a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NEXT: ReturnVoid
3327df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  public ClassWithFinals(boolean cond) {
3427df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle    x = 0;
355949fa0cb9a8d26ac20b9b02065a63b4b20443beNicolas Geoffray    if (doThrow) {
3627df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle      // avoid inlining
3727df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle      throw new RuntimeException();
3827df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle    }
3927df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  }
4027df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
41a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void ClassWithFinals.<init>() register (after)
42a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK:      MemoryBarrier kind:StoreStore
43a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NEXT: ReturnVoid
4427df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  public ClassWithFinals() {
4527df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle    x = 0;
4627df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  }
4727df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
48a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void ClassWithFinals.<init>(int) register (after)
49a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK:      MemoryBarrier kind:StoreStore
50a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK:      MemoryBarrier kind:StoreStore
51a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NEXT: ReturnVoid
5227df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  public ClassWithFinals(int x) {
5327df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle    // This should have two barriers:
5427df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle    //   - one for the constructor
5527df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle    //   - one for the `new` which should be inlined.
5627df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle    obj = new ClassWithFinals();
5727df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle    this.x = x;
5827df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  }
5927df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle}
6027df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
6127df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravleclass InheritFromClassWithFinals extends ClassWithFinals {
62a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void InheritFromClassWithFinals.<init>() register (after)
63a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK:      MemoryBarrier kind:StoreStore
64a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NEXT: ReturnVoid
6527df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
66a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void InheritFromClassWithFinals.<init>() register (after)
67a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT:  InvokeStaticOrDirect
6827df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  public InheritFromClassWithFinals() {
6927df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle    // Should inline the super constructor.
7027df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  }
7127df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
72a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void InheritFromClassWithFinals.<init>(boolean) register (after)
73a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK:      InvokeStaticOrDirect
7427df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
75a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void InheritFromClassWithFinals.<init>(boolean) register (after)
76a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT:  MemoryBarrier kind:StoreStore
7727df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  public InheritFromClassWithFinals(boolean cond) {
7827df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle    super(cond);
7927df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle    // should not inline the super constructor
8027df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  }
813cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle
82a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void InheritFromClassWithFinals.<init>(int) register (after)
83a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK:      MemoryBarrier kind:StoreStore
84a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK:      MemoryBarrier kind:StoreStore
85a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK:      ReturnVoid
863cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle
87a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void InheritFromClassWithFinals.<init>(int) register (after)
88a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT:  InvokeStaticOrDirect
893cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle  public InheritFromClassWithFinals(int unused) {
903cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle    // Should inline the super constructor and insert a memory barrier.
913cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle
923cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle    // Should inline the new instance call and insert another memory barrier.
933cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle    new InheritFromClassWithFinals();
943cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle  }
9527df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle}
9627df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
9727df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravleclass HaveFinalsAndInheritFromClassWithFinals extends ClassWithFinals {
9827df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  final int y;
9927df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
100a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>() register (after)
101a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK:      MemoryBarrier kind:StoreStore
102a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NEXT: ReturnVoid
10327df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
104a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>() register (after)
105a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: InvokeStaticOrDirect
10627df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  public HaveFinalsAndInheritFromClassWithFinals() {
1073cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle    // Should inline the super constructor and remove the memory barrier.
10827df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle    y = 0;
10927df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  }
11027df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
111a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>(boolean) register (after)
112a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK:      InvokeStaticOrDirect
113a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK:      MemoryBarrier kind:StoreStore
114a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NEXT: ReturnVoid
11527df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  public HaveFinalsAndInheritFromClassWithFinals(boolean cond) {
11627df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle    super(cond);
11727df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle    // should not inline the super constructor
11827df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle    y = 0;
11927df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  }
1203cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle
121a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>(int) register (after)
122a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK:      MemoryBarrier kind:StoreStore
123a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK:      MemoryBarrier kind:StoreStore
124a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK:      MemoryBarrier kind:StoreStore
125a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NEXT: ReturnVoid
1263cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle
127a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>(int) register (after)
128a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT:  InvokeStaticOrDirect
1293cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle  public HaveFinalsAndInheritFromClassWithFinals(int unused) {
1303cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle    // Should inline the super constructor and keep just one memory barrier.
1313cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle    y = 0;
1323cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle
1333cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle    // Should inline new instance and keep one barrier.
1343cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle    new HaveFinalsAndInheritFromClassWithFinals();
1353cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle    // Should inline new instance and keep one barrier.
1363cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle    new InheritFromClassWithFinals();
1373cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle  }
13827df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle}
13927df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
14027df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravlepublic class Main {
14127df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
142a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: ClassWithFinals Main.noInlineNoConstructorBarrier() register (after)
143a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK:      InvokeStaticOrDirect
14427df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
145a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: ClassWithFinals Main.noInlineNoConstructorBarrier() register (after)
146a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT:  MemoryBarrier kind:StoreStore
14727df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  public static ClassWithFinals noInlineNoConstructorBarrier() {
14827df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle    return new ClassWithFinals(false);
14927df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  }
15027df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
151a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.inlineNew() register (after)
152a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK:      MemoryBarrier kind:StoreStore
153a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NEXT: ReturnVoid
1543cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle
155a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.inlineNew() register (after)
156a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT:  InvokeStaticOrDirect
1573cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle  public static void inlineNew() {
1583cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle    new ClassWithFinals();
1593cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle  }
1603cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle
161a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.inlineNew1() register (after)
162a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK:      MemoryBarrier kind:StoreStore
163a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NEXT: ReturnVoid
16427df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
165a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.inlineNew1() register (after)
166a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT:  InvokeStaticOrDirect
1673cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle  public static void inlineNew1() {
1683cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle    new InheritFromClassWithFinals();
16927df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  }
17027df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
171a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.inlineNew2() register (after)
172a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK:      MemoryBarrier kind:StoreStore
173a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NEXT: ReturnVoid
1743cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle
175a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.inlineNew2() register (after)
176a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT:  InvokeStaticOrDirect
1773cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle  public static void inlineNew2() {
1783cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle    new HaveFinalsAndInheritFromClassWithFinals();
1793cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle  }
1803cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle
181a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.inlineNew3() register (after)
182a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK:      MemoryBarrier kind:StoreStore
183a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK:      MemoryBarrier kind:StoreStore
184a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NEXT: ReturnVoid
18527df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
186a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.inlineNew3() register (after)
187a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT:  InvokeStaticOrDirect
1883cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle  public static void inlineNew3() {
1893cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle    new HaveFinalsAndInheritFromClassWithFinals();
1903cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle    new HaveFinalsAndInheritFromClassWithFinals();
19127df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle  }
19227df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle
1933cd4fc8bbb40a57d2ffde85f543c124f53237c1dCalin Juravle  public static void main(String[] args) {}
19427df758e2e7baebb6e3f393f9732fd0d064420c8Calin Juravle}
195