xref: /aosp_15_r20/art/test/530-checker-lse3/smali/StoreLoad.smali (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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