1*795d594fSAndroid Build Coastguard Worker# Copyright (C) 2017 The Android Open Source Project 2*795d594fSAndroid Build Coastguard Worker# 3*795d594fSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*795d594fSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*795d594fSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*795d594fSAndroid Build Coastguard Worker# 7*795d594fSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*795d594fSAndroid Build Coastguard Worker# 9*795d594fSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*795d594fSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*795d594fSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*795d594fSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*795d594fSAndroid Build Coastguard Worker# limitations under the License. 14*795d594fSAndroid Build Coastguard Worker 15*795d594fSAndroid Build Coastguard Worker.class public LStoreLoad; 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker.super Ljava/lang/Object; 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker## CHECK-START: int StoreLoad.test(int) load_store_elimination (before) 20*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Arg:i\d+>> ParameterValue 21*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: StaticFieldSet [{{l\d+}},<<Arg>>] field_name:StoreLoad.byteField 22*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: StaticFieldSet [{{l\d+}},<<Arg>>] field_name:StoreLoad.byteField2 23*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Val:b\d+>> StaticFieldGet [{{l\d+}}] field_name:StoreLoad.byteField 24*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Val2:b\d+>> StaticFieldGet [{{l\d+}}] field_name:StoreLoad.byteField2 25*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Val3:i\d+>> Add [<<Val>>,<<Val2>>] 26*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<Val3>>] 27*795d594fSAndroid Build Coastguard Worker 28*795d594fSAndroid Build Coastguard Worker## CHECK-START: int StoreLoad.test(int) load_store_elimination (after) 29*795d594fSAndroid Build Coastguard Worker## CHECK-NOT: StaticFieldGet 30*795d594fSAndroid Build Coastguard Worker 31*795d594fSAndroid Build Coastguard Worker## CHECK-START: int StoreLoad.test(int) load_store_elimination (after) 32*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Arg:i\d+>> ParameterValue 33*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: StaticFieldSet [{{l\d+}},<<Arg>>] field_name:StoreLoad.byteField 34*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: StaticFieldSet [{{l\d+}},<<Arg>>] field_name:StoreLoad.byteField2 35*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Conv:b\d+>> TypeConversion [<<Arg>>] 36*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Val3:i\d+>> Add [<<Conv>>,<<Conv>>] 37*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<Val3>>] 38*795d594fSAndroid Build Coastguard Worker.method public static test(I)I 39*795d594fSAndroid Build Coastguard Worker .registers 2 40*795d594fSAndroid Build Coastguard Worker sput-byte v1, LStoreLoad;->byteField:B 41*795d594fSAndroid Build Coastguard Worker sput-byte v1, LStoreLoad;->byteField2:B 42*795d594fSAndroid Build Coastguard Worker sget-byte v0, LStoreLoad;->byteField:B 43*795d594fSAndroid Build Coastguard Worker sget-byte v1, LStoreLoad;->byteField2:B 44*795d594fSAndroid Build Coastguard Worker add-int/2addr v0, v1 45*795d594fSAndroid Build Coastguard Worker return v0 46*795d594fSAndroid Build Coastguard Worker.end method 47*795d594fSAndroid Build Coastguard Worker 48*795d594fSAndroid Build Coastguard Worker## CHECK-START: int StoreLoad.test2(int) load_store_elimination (before) 49*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Arg:i\d+>> ParameterValue 50*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: StaticFieldSet [{{l\d+}},<<Arg>>] field_name:StoreLoad.byteField 51*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<Arg>>] 52*795d594fSAndroid Build Coastguard Worker 53*795d594fSAndroid Build Coastguard Worker## CHECK-START: int StoreLoad.test2(int) load_store_elimination (after) 54*795d594fSAndroid Build Coastguard Worker## CHECK-NOT: TypeConversion 55*795d594fSAndroid Build Coastguard Worker.method public static test2(I)I 56*795d594fSAndroid Build Coastguard Worker .registers 1 57*795d594fSAndroid Build Coastguard Worker sput-byte v0, LStoreLoad;->byteField:B 58*795d594fSAndroid Build Coastguard Worker return v0 59*795d594fSAndroid Build Coastguard Worker.end method 60*795d594fSAndroid Build Coastguard Worker 61*795d594fSAndroid Build Coastguard Worker## CHECK-START: int StoreLoad.test3(int) load_store_elimination (before) 62*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: StaticFieldSet 63*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: StaticFieldSet 64*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: StaticFieldGet 65*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: StaticFieldSet 66*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: TypeConversion 67*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Phi 68*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: StaticFieldGet 69*795d594fSAndroid Build Coastguard Worker 70*795d594fSAndroid Build Coastguard Worker## CHECK-START: int StoreLoad.test3(int) load_store_elimination (after) 71*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: StaticFieldSet 72*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: StaticFieldSet 73*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: TypeConversion 74*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: StaticFieldSet 75*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Phi 76*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Phi 77*795d594fSAndroid Build Coastguard Worker 78*795d594fSAndroid Build Coastguard Worker## CHECK-START: int StoreLoad.test3(int) load_store_elimination (after) 79*795d594fSAndroid Build Coastguard Worker## CHECK: Phi 80*795d594fSAndroid Build Coastguard Worker## CHECK: Phi 81*795d594fSAndroid Build Coastguard Worker## CHECK-NOT: Phi 82*795d594fSAndroid Build Coastguard Worker 83*795d594fSAndroid Build Coastguard Worker## CHECK-START: int StoreLoad.test3(int) load_store_elimination (after) 84*795d594fSAndroid Build Coastguard Worker## CHECK: TypeConversion 85*795d594fSAndroid Build Coastguard Worker## CHECK-NOT: TypeConversion 86*795d594fSAndroid Build Coastguard Worker 87*795d594fSAndroid Build Coastguard Worker## CHECK-START: int StoreLoad.test3(int) load_store_elimination (after) 88*795d594fSAndroid Build Coastguard Worker## CHECK-NOT: StaticFieldGet 89*795d594fSAndroid Build Coastguard Worker.method public static test3(I)I 90*795d594fSAndroid Build Coastguard Worker .registers 3 91*795d594fSAndroid Build Coastguard Worker const/4 v0, 0 92*795d594fSAndroid Build Coastguard Worker sput p0, LStoreLoad;->intField:I 93*795d594fSAndroid Build Coastguard Worker and-int/lit8 v1, p0, 1 94*795d594fSAndroid Build Coastguard Worker if-eqz v1, :skip 95*795d594fSAndroid Build Coastguard Worker 96*795d594fSAndroid Build Coastguard Worker sput-byte p0, LStoreLoad;->byteField:B 97*795d594fSAndroid Build Coastguard Worker sget-byte v1, LStoreLoad;->byteField:B 98*795d594fSAndroid Build Coastguard Worker sput v1, LStoreLoad;->intField:I 99*795d594fSAndroid Build Coastguard Worker # Test that this TypeConversion is moved and used for the 100*795d594fSAndroid Build Coastguard Worker # sget-byte above instead of creating a new one. 101*795d594fSAndroid Build Coastguard Worker int-to-byte v0, p0 102*795d594fSAndroid Build Coastguard Worker 103*795d594fSAndroid Build Coastguard Worker :skip 104*795d594fSAndroid Build Coastguard Worker sget v1, LStoreLoad;->intField:I 105*795d594fSAndroid Build Coastguard Worker add-int v0, v1, v0 106*795d594fSAndroid Build Coastguard Worker return v0 107*795d594fSAndroid Build Coastguard Worker.end method 108*795d594fSAndroid Build Coastguard Worker 109*795d594fSAndroid Build Coastguard Worker## CHECK-START: int StoreLoad.test4(int) load_store_elimination (before) 110*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: StaticFieldSet 111*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: StaticFieldSet 112*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: StaticFieldSet 113*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: StaticFieldSet 114*795d594fSAndroid Build Coastguard Worker 115*795d594fSAndroid Build Coastguard Worker## CHECK-START: int StoreLoad.test4(int) load_store_elimination (after) 116*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: StaticFieldSet 117*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: StaticFieldSet 118*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: StaticFieldSet 119*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: StaticFieldSet 120*795d594fSAndroid Build Coastguard Worker.method public static test4(I)I 121*795d594fSAndroid Build Coastguard Worker # Test that stores are kept properly for an irreducible loop. 122*795d594fSAndroid Build Coastguard Worker .registers 3 123*795d594fSAndroid Build Coastguard Worker const/4 v0, 0 124*795d594fSAndroid Build Coastguard Worker const/4 v1, 7 125*795d594fSAndroid Build Coastguard Worker if-gt p0, v1, :skip1 126*795d594fSAndroid Build Coastguard Worker 127*795d594fSAndroid Build Coastguard Worker const/4 v1, 1 128*795d594fSAndroid Build Coastguard Worker sput v1, LStoreLoad;->intField:I 129*795d594fSAndroid Build Coastguard Worker goto :irreducible_loop_middle 130*795d594fSAndroid Build Coastguard Worker 131*795d594fSAndroid Build Coastguard Worker :skip1 132*795d594fSAndroid Build Coastguard Worker const/4 v1, 2 133*795d594fSAndroid Build Coastguard Worker sput v1, LStoreLoad;->intField:I 134*795d594fSAndroid Build Coastguard Worker # Fall through to the irreducible loop 135*795d594fSAndroid Build Coastguard Worker 136*795d594fSAndroid Build Coastguard Worker :irreducible_loop 137*795d594fSAndroid Build Coastguard Worker const/4 v1, 3 138*795d594fSAndroid Build Coastguard Worker sput v1, LStoreLoad;->intField:I 139*795d594fSAndroid Build Coastguard Worker if-eq v0, p0, :end 140*795d594fSAndroid Build Coastguard Worker 141*795d594fSAndroid Build Coastguard Worker :irreducible_loop_middle 142*795d594fSAndroid Build Coastguard Worker const/4 v1, 4 143*795d594fSAndroid Build Coastguard Worker sput v1, LStoreLoad;->intField:I 144*795d594fSAndroid Build Coastguard Worker add-int/lit8 v0, v0, 1 145*795d594fSAndroid Build Coastguard Worker goto :irreducible_loop 146*795d594fSAndroid Build Coastguard Worker 147*795d594fSAndroid Build Coastguard Worker :end 148*795d594fSAndroid Build Coastguard Worker return p0 149*795d594fSAndroid Build Coastguard Worker.end method 150*795d594fSAndroid Build Coastguard Worker 151*795d594fSAndroid Build Coastguard Worker.field public static intField:I 152*795d594fSAndroid Build Coastguard Worker.field public static byteField:B 153*795d594fSAndroid Build Coastguard Worker.field public static byteField2:B 154