1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2023 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 // Note that the empty string is present in the BootImage but the other one is a BSS string. We are 18*795d594fSAndroid Build Coastguard Worker // testing both AOT LoadString kinds. 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker public class Main { main(String[] args)21*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 22*795d594fSAndroid Build Coastguard Worker $noinline$testLength(); 23*795d594fSAndroid Build Coastguard Worker $noinline$testIsEmpty(); 24*795d594fSAndroid Build Coastguard Worker } 25*795d594fSAndroid Build Coastguard Worker $noinline$testLength()26*795d594fSAndroid Build Coastguard Worker private static void $noinline$testLength() { 27*795d594fSAndroid Build Coastguard Worker assertEquals(0, $noinline$testLengthEmptyString()); 28*795d594fSAndroid Build Coastguard Worker assertEquals(0, $noinline$testLengthEmptyStringWithInline()); 29*795d594fSAndroid Build Coastguard Worker assertEquals(32, $noinline$testLengthBssString()); 30*795d594fSAndroid Build Coastguard Worker assertEquals(32, $noinline$testLengthBssStringWithInline()); 31*795d594fSAndroid Build Coastguard Worker } 32*795d594fSAndroid Build Coastguard Worker 33*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$testLengthEmptyString() constant_folding (before) 34*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadString load_kind:BootImageRelRo 35*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Length:i\d+>> ArrayLength 36*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Length>>] 37*795d594fSAndroid Build Coastguard Worker 38*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$testLengthEmptyString() constant_folding (after) 39*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const0:i\d+>> IntConstant 0 40*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Const0>>] 41*795d594fSAndroid Build Coastguard Worker 42*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$testLengthEmptyString() dead_code_elimination$initial (after) 43*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: LoadString 44*795d594fSAndroid Build Coastguard Worker 45*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$testLengthEmptyString() dead_code_elimination$initial (after) 46*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayLength $noinline$testLengthEmptyString()47*795d594fSAndroid Build Coastguard Worker private static int $noinline$testLengthEmptyString() { 48*795d594fSAndroid Build Coastguard Worker String str = ""; 49*795d594fSAndroid Build Coastguard Worker return str.length(); 50*795d594fSAndroid Build Coastguard Worker } 51*795d594fSAndroid Build Coastguard Worker 52*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$testLengthEmptyStringWithInline() constant_folding$after_inlining (before) 53*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadString load_kind:BootImageRelRo 54*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Length:i\d+>> ArrayLength 55*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Length>>] 56*795d594fSAndroid Build Coastguard Worker 57*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$testLengthEmptyStringWithInline() constant_folding$after_inlining (after) 58*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const0:i\d+>> IntConstant 0 59*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Const0>>] 60*795d594fSAndroid Build Coastguard Worker 61*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$testLengthEmptyStringWithInline() dead_code_elimination$after_inlining (after) 62*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: LoadString 63*795d594fSAndroid Build Coastguard Worker 64*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$testLengthEmptyStringWithInline() dead_code_elimination$after_inlining (after) 65*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayLength $noinline$testLengthEmptyStringWithInline()66*795d594fSAndroid Build Coastguard Worker private static int $noinline$testLengthEmptyStringWithInline() { 67*795d594fSAndroid Build Coastguard Worker String str = ""; 68*795d594fSAndroid Build Coastguard Worker return $inline$returnLength(str); 69*795d594fSAndroid Build Coastguard Worker } 70*795d594fSAndroid Build Coastguard Worker 71*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$testLengthBssString() constant_folding (before) 72*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadString load_kind:BssEntry 73*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Length:i\d+>> ArrayLength 74*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Length>>] 75*795d594fSAndroid Build Coastguard Worker 76*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$testLengthBssString() constant_folding (after) 77*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const32:i\d+>> IntConstant 32 78*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Const32>>] 79*795d594fSAndroid Build Coastguard Worker 80*795d594fSAndroid Build Coastguard Worker // We don't remove LoadString load_kind:BssEntry even if they have no uses, since IsRemovable() 81*795d594fSAndroid Build Coastguard Worker // returns false for them. 82*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$testLengthBssString() dead_code_elimination$initial (after) 83*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadString load_kind:BssEntry 84*795d594fSAndroid Build Coastguard Worker 85*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$testLengthBssString() dead_code_elimination$initial (after) 86*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayLength $noinline$testLengthBssString()87*795d594fSAndroid Build Coastguard Worker private static int $noinline$testLengthBssString() { 88*795d594fSAndroid Build Coastguard Worker String str = "2047-checker-const-string-length"; 89*795d594fSAndroid Build Coastguard Worker return str.length(); 90*795d594fSAndroid Build Coastguard Worker } 91*795d594fSAndroid Build Coastguard Worker 92*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$testLengthBssStringWithInline() constant_folding$after_inlining (before) 93*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadString load_kind:BssEntry 94*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Length:i\d+>> ArrayLength 95*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Length>>] 96*795d594fSAndroid Build Coastguard Worker 97*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$testLengthBssStringWithInline() constant_folding$after_inlining (after) 98*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const32:i\d+>> IntConstant 32 99*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Const32>>] 100*795d594fSAndroid Build Coastguard Worker 101*795d594fSAndroid Build Coastguard Worker // We don't remove LoadString load_kind:BssEntry even if they have no uses, since IsRemovable() 102*795d594fSAndroid Build Coastguard Worker // returns false for them. 103*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$testLengthBssStringWithInline() dead_code_elimination$after_inlining (after) 104*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadString load_kind:BssEntry 105*795d594fSAndroid Build Coastguard Worker 106*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$testLengthBssStringWithInline() dead_code_elimination$after_inlining (after) 107*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayLength $noinline$testLengthBssStringWithInline()108*795d594fSAndroid Build Coastguard Worker private static int $noinline$testLengthBssStringWithInline() { 109*795d594fSAndroid Build Coastguard Worker String str = "2047-checker-const-string-length"; 110*795d594fSAndroid Build Coastguard Worker return $inline$returnLength(str); 111*795d594fSAndroid Build Coastguard Worker } 112*795d594fSAndroid Build Coastguard Worker $inline$returnLength(String str)113*795d594fSAndroid Build Coastguard Worker private static int $inline$returnLength(String str) { 114*795d594fSAndroid Build Coastguard Worker return str.length(); 115*795d594fSAndroid Build Coastguard Worker } 116*795d594fSAndroid Build Coastguard Worker $noinline$testIsEmpty()117*795d594fSAndroid Build Coastguard Worker private static void $noinline$testIsEmpty() { 118*795d594fSAndroid Build Coastguard Worker assertEquals(true, $noinline$testIsEmptyEmptyString()); 119*795d594fSAndroid Build Coastguard Worker assertEquals(true, $noinline$testIsEmptyEmptyStringWithInline()); 120*795d594fSAndroid Build Coastguard Worker assertEquals(false, $noinline$testIsEmptyBssString()); 121*795d594fSAndroid Build Coastguard Worker assertEquals(false, $noinline$testIsEmptyBssStringWithInline()); 122*795d594fSAndroid Build Coastguard Worker } 123*795d594fSAndroid Build Coastguard Worker 124*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.$noinline$testIsEmptyEmptyString() constant_folding (before) 125*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const0:i\d+>> IntConstant 0 126*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadString load_kind:BootImageRelRo 127*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Length:i\d+>> ArrayLength 128*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Eq:z\d+>> Equal [<<Length>>,<<Const0>>] 129*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Eq>>] 130*795d594fSAndroid Build Coastguard Worker 131*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.$noinline$testIsEmptyEmptyString() constant_folding (after) 132*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const1:i\d+>> IntConstant 1 133*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Const1>>] 134*795d594fSAndroid Build Coastguard Worker 135*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.$noinline$testIsEmptyEmptyString() dead_code_elimination$initial (after) 136*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: LoadString 137*795d594fSAndroid Build Coastguard Worker 138*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.$noinline$testIsEmptyEmptyString() dead_code_elimination$initial (after) 139*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayLength $noinline$testIsEmptyEmptyString()140*795d594fSAndroid Build Coastguard Worker private static boolean $noinline$testIsEmptyEmptyString() { 141*795d594fSAndroid Build Coastguard Worker String str = ""; 142*795d594fSAndroid Build Coastguard Worker return str.isEmpty(); 143*795d594fSAndroid Build Coastguard Worker } 144*795d594fSAndroid Build Coastguard Worker 145*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.$noinline$testIsEmptyEmptyStringWithInline() constant_folding$after_inlining (before) 146*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const0:i\d+>> IntConstant 0 147*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadString load_kind:BootImageRelRo 148*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Length:i\d+>> ArrayLength 149*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Eq:z\d+>> Equal [<<Length>>,<<Const0>>] 150*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Eq>>] 151*795d594fSAndroid Build Coastguard Worker 152*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.$noinline$testIsEmptyEmptyStringWithInline() constant_folding$after_inlining (after) 153*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const1:i\d+>> IntConstant 1 154*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Const1>>] 155*795d594fSAndroid Build Coastguard Worker 156*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.$noinline$testIsEmptyEmptyStringWithInline() dead_code_elimination$after_inlining (after) 157*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: LoadString 158*795d594fSAndroid Build Coastguard Worker 159*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.$noinline$testIsEmptyEmptyStringWithInline() dead_code_elimination$after_inlining (after) 160*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayLength $noinline$testIsEmptyEmptyStringWithInline()161*795d594fSAndroid Build Coastguard Worker private static boolean $noinline$testIsEmptyEmptyStringWithInline() { 162*795d594fSAndroid Build Coastguard Worker String str = ""; 163*795d594fSAndroid Build Coastguard Worker return $inline$returnIsEmpty(str); 164*795d594fSAndroid Build Coastguard Worker } 165*795d594fSAndroid Build Coastguard Worker 166*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.$noinline$testIsEmptyBssString() constant_folding (before) 167*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const0:i\d+>> IntConstant 0 168*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadString load_kind:BssEntry 169*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Length:i\d+>> ArrayLength 170*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Eq:z\d+>> Equal [<<Length>>,<<Const0>>] 171*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Eq>>] 172*795d594fSAndroid Build Coastguard Worker 173*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.$noinline$testIsEmptyBssString() constant_folding (after) 174*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const0:i\d+>> IntConstant 0 175*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Const0>>] 176*795d594fSAndroid Build Coastguard Worker 177*795d594fSAndroid Build Coastguard Worker // We don't remove LoadString load_kind:BssEntry even if they have no uses, since IsRemovable() 178*795d594fSAndroid Build Coastguard Worker // returns false for them. 179*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.$noinline$testIsEmptyBssString() dead_code_elimination$initial (after) 180*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadString load_kind:BssEntry 181*795d594fSAndroid Build Coastguard Worker 182*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.$noinline$testIsEmptyBssString() dead_code_elimination$initial (after) 183*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayLength $noinline$testIsEmptyBssString()184*795d594fSAndroid Build Coastguard Worker private static boolean $noinline$testIsEmptyBssString() { 185*795d594fSAndroid Build Coastguard Worker String str = "2047-checker-const-string-length"; 186*795d594fSAndroid Build Coastguard Worker return str.isEmpty(); 187*795d594fSAndroid Build Coastguard Worker } 188*795d594fSAndroid Build Coastguard Worker 189*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.$noinline$testIsEmptyBssStringWithInline() constant_folding$after_inlining (before) 190*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const0:i\d+>> IntConstant 0 191*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadString load_kind:BssEntry 192*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Length:i\d+>> ArrayLength 193*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Eq:z\d+>> Equal [<<Length>>,<<Const0>>] 194*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Eq>>] 195*795d594fSAndroid Build Coastguard Worker 196*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.$noinline$testIsEmptyBssStringWithInline() constant_folding$after_inlining (after) 197*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const0:i\d+>> IntConstant 0 198*795d594fSAndroid Build Coastguard Worker /// CHECK: Return [<<Const0>>] 199*795d594fSAndroid Build Coastguard Worker 200*795d594fSAndroid Build Coastguard Worker // We don't remove LoadString load_kind:BssEntry even if they have no uses, since IsRemovable() 201*795d594fSAndroid Build Coastguard Worker // returns false for them. 202*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.$noinline$testIsEmptyBssStringWithInline() dead_code_elimination$after_inlining (after) 203*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadString load_kind:BssEntry 204*795d594fSAndroid Build Coastguard Worker 205*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.$noinline$testIsEmptyBssStringWithInline() dead_code_elimination$after_inlining (after) 206*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayLength $noinline$testIsEmptyBssStringWithInline()207*795d594fSAndroid Build Coastguard Worker private static boolean $noinline$testIsEmptyBssStringWithInline() { 208*795d594fSAndroid Build Coastguard Worker String str = "2047-checker-const-string-length"; 209*795d594fSAndroid Build Coastguard Worker return $inline$returnIsEmpty(str); 210*795d594fSAndroid Build Coastguard Worker } 211*795d594fSAndroid Build Coastguard Worker $inline$returnIsEmpty(String str)212*795d594fSAndroid Build Coastguard Worker private static boolean $inline$returnIsEmpty(String str) { 213*795d594fSAndroid Build Coastguard Worker return str.isEmpty(); 214*795d594fSAndroid Build Coastguard Worker } 215*795d594fSAndroid Build Coastguard Worker assertEquals(int expected, int actual)216*795d594fSAndroid Build Coastguard Worker static void assertEquals(int expected, int actual) { 217*795d594fSAndroid Build Coastguard Worker if (expected != actual) { 218*795d594fSAndroid Build Coastguard Worker throw new AssertionError("Expected " + expected + " got " + actual); 219*795d594fSAndroid Build Coastguard Worker } 220*795d594fSAndroid Build Coastguard Worker } 221*795d594fSAndroid Build Coastguard Worker assertEquals(boolean expected, boolean actual)222*795d594fSAndroid Build Coastguard Worker static void assertEquals(boolean expected, boolean actual) { 223*795d594fSAndroid Build Coastguard Worker if (expected != actual) { 224*795d594fSAndroid Build Coastguard Worker throw new AssertionError("Expected " + expected + " got " + actual); 225*795d594fSAndroid Build Coastguard Worker } 226*795d594fSAndroid Build Coastguard Worker } 227*795d594fSAndroid Build Coastguard Worker } 228