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