1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker // TODO: Add more tests after we can inline functions with calls. 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker class ClassWithoutFinals { 20*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void ClassWithoutFinals.<init>() inliner (after) 21*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ConstructorFence ClassWithoutFinals()22*795d594fSAndroid Build Coastguard Worker public ClassWithoutFinals() {} 23*795d594fSAndroid Build Coastguard Worker } 24*795d594fSAndroid Build Coastguard Worker 25*795d594fSAndroid Build Coastguard Worker class ClassWithFinals { 26*795d594fSAndroid Build Coastguard Worker public final int x; 27*795d594fSAndroid Build Coastguard Worker public ClassWithFinals obj; 28*795d594fSAndroid Build Coastguard Worker public static boolean doThrow = false; 29*795d594fSAndroid Build Coastguard Worker ClassWithFinals(boolean cond)30*795d594fSAndroid Build Coastguard Worker public ClassWithFinals(boolean cond) { 31*795d594fSAndroid Build Coastguard Worker x = 1; 32*795d594fSAndroid Build Coastguard Worker throw new RuntimeException(); 33*795d594fSAndroid Build Coastguard Worker // should not inline this constructor 34*795d594fSAndroid Build Coastguard Worker } 35*795d594fSAndroid Build Coastguard Worker 36*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void ClassWithFinals.<init>() inliner (after) 37*795d594fSAndroid Build Coastguard Worker /// CHECK: ConstructorFence 38*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ConstructorFence 39*795d594fSAndroid Build Coastguard Worker 40*795d594fSAndroid Build Coastguard Worker /* 41*795d594fSAndroid Build Coastguard Worker * Check that the correct assembly instructions are selected for a Store/Store fence. 42*795d594fSAndroid Build Coastguard Worker * 43*795d594fSAndroid Build Coastguard Worker * - ARM variants: DMB ISHST (store-store fence for inner shareable domain) 44*795d594fSAndroid Build Coastguard Worker * - Intel variants: no-op (store-store does not need a fence). 45*795d594fSAndroid Build Coastguard Worker */ 46*795d594fSAndroid Build Coastguard Worker 47*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void ClassWithFinals.<init>() disassembly (after) 48*795d594fSAndroid Build Coastguard Worker /// CHECK: ConstructorFence 49*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: dmb ishst 50*795d594fSAndroid Build Coastguard Worker 51*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void ClassWithFinals.<init>() disassembly (after) 52*795d594fSAndroid Build Coastguard Worker /// CHECK: ConstructorFence 53*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: dmb ishst 54*795d594fSAndroid Build Coastguard Worker 55*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86_64: void ClassWithFinals.<init>() disassembly (after) 56*795d594fSAndroid Build Coastguard Worker /// CHECK: ConstructorFence 57*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: {{[slm]}}fence 58*795d594fSAndroid Build Coastguard Worker 59*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86: void ClassWithFinals.<init>() disassembly (after) 60*795d594fSAndroid Build Coastguard Worker /// CHECK: ConstructorFence 61*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: {{[slm]}}fence ClassWithFinals()62*795d594fSAndroid Build Coastguard Worker public ClassWithFinals() { 63*795d594fSAndroid Build Coastguard Worker // Exactly one constructor barrier. 64*795d594fSAndroid Build Coastguard Worker // Note: Do not store 0 as that can be eliminated together with the constructor 65*795d594fSAndroid Build Coastguard Worker // barrier by the code pattern substitution in the inliner. 66*795d594fSAndroid Build Coastguard Worker x = 1; 67*795d594fSAndroid Build Coastguard Worker } 68*795d594fSAndroid Build Coastguard Worker 69*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void ClassWithFinals.<init>(int) inliner (after) 70*795d594fSAndroid Build Coastguard Worker /// CHECK: <<This:l\d+>> ParameterValue 71*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NewInstance:l\d+>> NewInstance 72*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewInstance>>] 73*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewInstance>>] 74*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<This>>] 75*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ConstructorFence ClassWithFinals(int x)76*795d594fSAndroid Build Coastguard Worker public ClassWithFinals(int x) { 77*795d594fSAndroid Build Coastguard Worker // This should have exactly three barriers: 78*795d594fSAndroid Build Coastguard Worker // - one for the new-instance 79*795d594fSAndroid Build Coastguard Worker // - one for the constructor 80*795d594fSAndroid Build Coastguard Worker // - one for the `new` which should be inlined. 81*795d594fSAndroid Build Coastguard Worker obj = new ClassWithFinals(); 82*795d594fSAndroid Build Coastguard Worker this.x = x; 83*795d594fSAndroid Build Coastguard Worker } 84*795d594fSAndroid Build Coastguard Worker } 85*795d594fSAndroid Build Coastguard Worker 86*795d594fSAndroid Build Coastguard Worker class InheritFromClassWithFinals extends ClassWithFinals { 87*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void InheritFromClassWithFinals.<init>() inliner (after) 88*795d594fSAndroid Build Coastguard Worker /// CHECK: <<This:l\d+>> ParameterValue 89*795d594fSAndroid Build Coastguard Worker /// CHECK: ConstructorFence [<<This>>] 90*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ConstructorFence 91*795d594fSAndroid Build Coastguard Worker 92*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void InheritFromClassWithFinals.<init>() inliner (after) 93*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect InheritFromClassWithFinals()94*795d594fSAndroid Build Coastguard Worker public InheritFromClassWithFinals() { 95*795d594fSAndroid Build Coastguard Worker // Should inline the super constructor. 96*795d594fSAndroid Build Coastguard Worker // 97*795d594fSAndroid Build Coastguard Worker // Exactly one constructor barrier here. 98*795d594fSAndroid Build Coastguard Worker } 99*795d594fSAndroid Build Coastguard Worker 100*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void InheritFromClassWithFinals.<init>(boolean) inliner (after) 101*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeStaticOrDirect 102*795d594fSAndroid Build Coastguard Worker 103*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void InheritFromClassWithFinals.<init>(boolean) inliner (after) 104*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ConstructorFence InheritFromClassWithFinals(boolean cond)105*795d594fSAndroid Build Coastguard Worker public InheritFromClassWithFinals(boolean cond) { 106*795d594fSAndroid Build Coastguard Worker super(cond); 107*795d594fSAndroid Build Coastguard Worker // should not inline the super constructor 108*795d594fSAndroid Build Coastguard Worker } 109*795d594fSAndroid Build Coastguard Worker 110*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void InheritFromClassWithFinals.<init>(int) inliner (after) 111*795d594fSAndroid Build Coastguard Worker /// CHECK: <<This:l\d+>> ParameterValue 112*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<NewHere:l\d+>> NewInstance klass:InheritFromClassWithFinals 113*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<This>>] 114*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewHere>>] 115*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewHere>>] 116*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ConstructorFence 117*795d594fSAndroid Build Coastguard Worker 118*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void InheritFromClassWithFinals.<init>(int) inliner (after) 119*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect InheritFromClassWithFinals(int unused)120*795d594fSAndroid Build Coastguard Worker public InheritFromClassWithFinals(int unused) { 121*795d594fSAndroid Build Coastguard Worker // super(); // implicitly the first invoke in this constructor. 122*795d594fSAndroid Build Coastguard Worker // Should inline the super constructor and insert a constructor fence there. 123*795d594fSAndroid Build Coastguard Worker 124*795d594fSAndroid Build Coastguard Worker // Should inline the new instance call (barrier); and add another one 125*795d594fSAndroid Build Coastguard Worker // because the superclass has finals. 126*795d594fSAndroid Build Coastguard Worker new InheritFromClassWithFinals(); 127*795d594fSAndroid Build Coastguard Worker } 128*795d594fSAndroid Build Coastguard Worker } 129*795d594fSAndroid Build Coastguard Worker 130*795d594fSAndroid Build Coastguard Worker class HaveFinalsAndInheritFromClassWithFinals extends ClassWithFinals { 131*795d594fSAndroid Build Coastguard Worker final int y; 132*795d594fSAndroid Build Coastguard Worker 133*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>() inliner (after) 134*795d594fSAndroid Build Coastguard Worker /// CHECK: <<This:l\d+>> ParameterValue 135*795d594fSAndroid Build Coastguard Worker /// CHECK: ConstructorFence [<<This>>] 136*795d594fSAndroid Build Coastguard Worker /// CHECK: ConstructorFence [<<This>>] 137*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ConstructorFence 138*795d594fSAndroid Build Coastguard Worker 139*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>() inliner (after) 140*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect HaveFinalsAndInheritFromClassWithFinals()141*795d594fSAndroid Build Coastguard Worker public HaveFinalsAndInheritFromClassWithFinals() { 142*795d594fSAndroid Build Coastguard Worker // Should inline the super constructor and keep the memory barrier. 143*795d594fSAndroid Build Coastguard Worker y = 0; 144*795d594fSAndroid Build Coastguard Worker } 145*795d594fSAndroid Build Coastguard Worker 146*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>(boolean) inliner (after) 147*795d594fSAndroid Build Coastguard Worker /// CHECK: <<This:l\d+>> ParameterValue 148*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeStaticOrDirect 149*795d594fSAndroid Build Coastguard Worker /// CHECK: ConstructorFence [<<This>>] 150*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ConstructorFence HaveFinalsAndInheritFromClassWithFinals(boolean cond)151*795d594fSAndroid Build Coastguard Worker public HaveFinalsAndInheritFromClassWithFinals(boolean cond) { 152*795d594fSAndroid Build Coastguard Worker super(cond); 153*795d594fSAndroid Build Coastguard Worker // should not inline the super constructor 154*795d594fSAndroid Build Coastguard Worker y = 0; 155*795d594fSAndroid Build Coastguard Worker } 156*795d594fSAndroid Build Coastguard Worker 157*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>(int) inliner (after) 158*795d594fSAndroid Build Coastguard Worker /// CHECK: <<This:l\d+>> ParameterValue 159*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<NewHF:l\d+>> NewInstance klass:HaveFinalsAndInheritFromClassWithFinals 160*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<NewIF:l\d+>> NewInstance klass:InheritFromClassWithFinals 161*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<This>>] 162*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewHF>>] 163*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewHF>>] 164*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewHF>>] 165*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewIF>>] 166*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewIF>>] 167*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<This>>] 168*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ConstructorFence 169*795d594fSAndroid Build Coastguard Worker 170*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>(int) inliner (after) 171*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect HaveFinalsAndInheritFromClassWithFinals(int unused)172*795d594fSAndroid Build Coastguard Worker public HaveFinalsAndInheritFromClassWithFinals(int unused) { 173*795d594fSAndroid Build Coastguard Worker // super() 174*795d594fSAndroid Build Coastguard Worker // -- Inlined super constructor, insert memory barrier here. 175*795d594fSAndroid Build Coastguard Worker y = 0; 176*795d594fSAndroid Build Coastguard Worker 177*795d594fSAndroid Build Coastguard Worker // Should inline new instance and keep both memory barriers. 178*795d594fSAndroid Build Coastguard Worker // One more memory barrier for new-instance. 179*795d594fSAndroid Build Coastguard Worker // (3 total for this new-instance #1) 180*795d594fSAndroid Build Coastguard Worker new HaveFinalsAndInheritFromClassWithFinals(); 181*795d594fSAndroid Build Coastguard Worker // Should inline new instance and have exactly one barrier. 182*795d594fSAndroid Build Coastguard Worker // One more barrier for new-instance. 183*795d594fSAndroid Build Coastguard Worker // (2 total for this new-instance #2) 184*795d594fSAndroid Build Coastguard Worker new InheritFromClassWithFinals(); 185*795d594fSAndroid Build Coastguard Worker 186*795d594fSAndroid Build Coastguard Worker // -- End of constructor, insert memory barrier here to freeze 'y'. 187*795d594fSAndroid Build Coastguard Worker } 188*795d594fSAndroid Build Coastguard Worker } 189*795d594fSAndroid Build Coastguard Worker 190*795d594fSAndroid Build Coastguard Worker public class Main { 191*795d594fSAndroid Build Coastguard Worker 192*795d594fSAndroid Build Coastguard Worker /// CHECK-START: ClassWithFinals Main.noInlineNoConstructorBarrier() inliner (after) 193*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeStaticOrDirect 194*795d594fSAndroid Build Coastguard Worker 195*795d594fSAndroid Build Coastguard Worker /// CHECK-START: ClassWithFinals Main.noInlineNoConstructorBarrier() inliner (after) 196*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NewInstance:l\d+>> NewInstance 197*795d594fSAndroid Build Coastguard Worker /// CHECK: ConstructorFence [<<NewInstance>>] 198*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ConstructorFence noInlineNoConstructorBarrier()199*795d594fSAndroid Build Coastguard Worker public static ClassWithFinals noInlineNoConstructorBarrier() { 200*795d594fSAndroid Build Coastguard Worker // Exactly one barrier for the new-instance. 201*795d594fSAndroid Build Coastguard Worker return new ClassWithFinals(false); 202*795d594fSAndroid Build Coastguard Worker // should not inline the constructor 203*795d594fSAndroid Build Coastguard Worker } 204*795d594fSAndroid Build Coastguard Worker 205*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.inlineNew() inliner (after) 206*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NewInstance:l\d+>> NewInstance 207*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewInstance>>] 208*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewInstance>>] 209*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ConstructorFence 210*795d594fSAndroid Build Coastguard Worker 211*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.inlineNew() inliner (after) 212*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect inlineNew()213*795d594fSAndroid Build Coastguard Worker public static void inlineNew() { 214*795d594fSAndroid Build Coastguard Worker // Exactly 2 barriers. One for new-instance, one for constructor with finals. 215*795d594fSAndroid Build Coastguard Worker new ClassWithFinals(); 216*795d594fSAndroid Build Coastguard Worker } 217*795d594fSAndroid Build Coastguard Worker 218*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.inlineNew1() inliner (after) 219*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NewInstance:l\d+>> NewInstance 220*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewInstance>>] 221*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewInstance>>] 222*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ConstructorFence 223*795d594fSAndroid Build Coastguard Worker 224*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.inlineNew1() inliner (after) 225*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect inlineNew1()226*795d594fSAndroid Build Coastguard Worker public static void inlineNew1() { 227*795d594fSAndroid Build Coastguard Worker new InheritFromClassWithFinals(); 228*795d594fSAndroid Build Coastguard Worker } 229*795d594fSAndroid Build Coastguard Worker 230*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.inlineNew2() inliner (after) 231*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NewInstance:l\d+>> NewInstance 232*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewInstance>>] 233*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewInstance>>] 234*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewInstance>>] 235*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ConstructorFence 236*795d594fSAndroid Build Coastguard Worker 237*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.inlineNew2() inliner (after) 238*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect inlineNew2()239*795d594fSAndroid Build Coastguard Worker public static void inlineNew2() { 240*795d594fSAndroid Build Coastguard Worker new HaveFinalsAndInheritFromClassWithFinals(); 241*795d594fSAndroid Build Coastguard Worker } 242*795d594fSAndroid Build Coastguard Worker 243*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.inlineNew3() inliner (after) 244*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NewInstance:l\d+>> NewInstance 245*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewInstance>>] 246*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewInstance>>] 247*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewInstance>>] 248*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ConstructorFence 249*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NewInstance2:l\d+>> NewInstance 250*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewInstance2>>] 251*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewInstance2>>] 252*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ConstructorFence [<<NewInstance2>>] 253*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ConstructorFence 254*795d594fSAndroid Build Coastguard Worker 255*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.inlineNew3() inliner (after) 256*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect inlineNew3()257*795d594fSAndroid Build Coastguard Worker public static void inlineNew3() { 258*795d594fSAndroid Build Coastguard Worker new HaveFinalsAndInheritFromClassWithFinals(); 259*795d594fSAndroid Build Coastguard Worker new HaveFinalsAndInheritFromClassWithFinals(); 260*795d594fSAndroid Build Coastguard Worker } 261*795d594fSAndroid Build Coastguard Worker 262*795d594fSAndroid Build Coastguard Worker static int[] mCodePointsEmpty = new int[0]; 263*795d594fSAndroid Build Coastguard Worker 264*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.testNewString() inliner (after) 265*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ConstructorFence 266*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeStaticOrDirect method_load_kind:StringInit 267*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ConstructorFence 268*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect testNewString()269*795d594fSAndroid Build Coastguard Worker public static void testNewString() { 270*795d594fSAndroid Build Coastguard Worker // Strings are special because of StringFactory hackeries. 271*795d594fSAndroid Build Coastguard Worker // 272*795d594fSAndroid Build Coastguard Worker // Assume they handle their own fencing internally in the StringFactory. 273*795d594fSAndroid Build Coastguard Worker int[] codePoints = null; 274*795d594fSAndroid Build Coastguard Worker String some_new_string = new String(mCodePointsEmpty, 0, 0); 275*795d594fSAndroid Build Coastguard Worker } 276*795d594fSAndroid Build Coastguard Worker main(String[] args)277*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) {} 278*795d594fSAndroid Build Coastguard Worker } 279