1# Copyright (C) 2018 The Android Open Source Project
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#      http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15.class public LMain2;
16.super Ljava/lang/Object;
17.source "Main.java"
18
19# direct methods
20
21## CHECK-START: int Main2.test4(TestClass, boolean) load_store_elimination (before)
22## CHECK: InstanceFieldSet
23## CHECK: InstanceFieldGet
24## CHECK: Return
25## CHECK: InstanceFieldSet
26
27## CHECK-START: int Main2.test4(TestClass, boolean) load_store_elimination (after)
28## CHECK: InstanceFieldSet
29## CHECK-NOT: NullCheck
30## CHECK-NOT: InstanceFieldGet
31## CHECK: Return
32## CHECK: InstanceFieldSet
33
34# Set and merge the same value in two branches.
35
36# Original java source:
37#
38#     static int test4(TestClass obj, boolean b) {
39#       if (b) {
40#         obj.i = 1;
41#       } else {
42#         obj.i = 1;
43#       }
44#       return obj.i;
45#     }
46
47.method public static test4(LTestClass;Z)I
48    .registers 3
49    .param p0, "obj"    # LTestClass;
50    .param p1, "b"    # Z
51
52    .prologue
53    const/4 v0, 0x1
54
55    .line 185
56    if-eqz p1, :cond_8
57
58    .line 186
59    iput v0, p0, LTestClass;->i:I
60
61    .line 190
62    :goto_5
63    iget v0, p0, LTestClass;->i:I
64
65    return v0
66
67    .line 188
68    :cond_8
69    iput v0, p0, LTestClass;->i:I
70
71    goto :goto_5
72.end method
73
74## CHECK-START: int Main2.test5(TestClass, boolean) load_store_elimination (before)
75## CHECK: InstanceFieldSet
76## CHECK: InstanceFieldGet
77## CHECK: Return
78## CHECK: InstanceFieldSet
79
80## CHECK-START: int Main2.test5(TestClass, boolean) load_store_elimination (after)
81## CHECK: InstanceFieldSet
82## CHECK: InstanceFieldGet
83## CHECK: Return
84## CHECK: InstanceFieldSet
85
86# Set and merge different values in two branches.
87# Original java source:
88#
89#     static int test5(TestClass obj, boolean b) {
90#       if (b) {
91#         obj.i = 1;
92#       } else {
93#         obj.i = 2;
94#       }
95#       return obj.i;
96#     }
97
98.method public static test5(LTestClass;Z)I
99    .registers 3
100    .param p0, "obj"    # LTestClass;
101    .param p1, "b"    # Z
102
103    .prologue
104    .line 207
105    if-eqz p1, :cond_8
106
107    .line 208
108    const/4 v0, 0x1
109
110    iput v0, p0, LTestClass;->i:I
111
112    .line 212
113    :goto_5
114    iget v0, p0, LTestClass;->i:I
115
116    return v0
117
118    .line 210
119    :cond_8
120    const/4 v0, 0x2
121
122    iput v0, p0, LTestClass;->i:I
123
124    goto :goto_5
125.end method
126
127## CHECK-START: int Main2.test10(TestClass) load_store_elimination (before)
128## CHECK: StaticFieldGet
129## CHECK: InstanceFieldGet
130## CHECK: StaticFieldSet
131## CHECK: InstanceFieldGet
132
133## CHECK-START: int Main2.test10(TestClass) load_store_elimination (after)
134## CHECK: StaticFieldGet
135## CHECK: InstanceFieldGet
136## CHECK: StaticFieldSet
137## CHECK-NOT: NullCheck
138## CHECK-NOT: InstanceFieldGet
139
140# Original java source:
141#
142#  // Static fields shouldn't alias with instance fields.
143#  static int test10(TestClass obj) {
144#    TestClass.si += obj.i;
145#    return obj.i;
146#  }
147
148.method public static test10(LTestClass;)I
149    .registers 3
150    .param p0, "obj"    # LTestClass;
151    sget                v0, LTestClass;->si:I
152    iget                v1, p0, LTestClass;->i:I
153    add-int/2addr       v0, v1
154    sput                v0, LTestClass;->si:I
155    iget                p0, p0, LTestClass;->i:I
156    return              p0
157.end method
158
159## CHECK-START: int Main2.test23(boolean) load_store_elimination (before)
160## CHECK: NewInstance
161## CHECK: InstanceFieldSet
162## CHECK: InstanceFieldGet
163## CHECK: InstanceFieldSet
164## CHECK: InstanceFieldGet
165## CHECK: Return
166## CHECK: InstanceFieldGet
167## CHECK: InstanceFieldSet
168
169## CHECK-START: int Main2.test23(boolean) load_store_elimination (after)
170## CHECK: NewInstance
171## CHECK-NOT: InstanceFieldSet
172## CHECK-NOT: InstanceFieldGet
173## CHECK: InstanceFieldSet
174## CHECK: InstanceFieldGet
175## CHECK: Return
176## CHECK-NOT: InstanceFieldGet
177## CHECK: InstanceFieldSet
178
179# Test store elimination on merging.
180
181# Original java source:
182#
183#     static int test23(boolean b) {
184#       TestClass obj = new TestClass();
185#       obj.i = 3;      // This store can be eliminated since the value flows into each branch.
186#       if (b) {
187#         obj.i += 1;   // This store cannot be eliminated due to the merge later.
188#       } else {
189#         obj.i += 2;   // This store cannot be eliminated due to the merge later.
190#       }
191#       return obj.i;
192#     }
193
194.method public static test23(Z)I
195    .registers 3
196    .param p0, "b"    # Z
197
198    .prologue
199    .line 582
200    new-instance v0, LTestClass;
201
202    invoke-direct {v0}, LTestClass;-><init>()V
203
204    .line 583
205    .local v0, "obj":LTestClass;
206    const/4 v1, 0x3
207
208    iput v1, v0, LTestClass;->i:I
209
210    .line 584
211    if-eqz p0, :cond_13
212
213    .line 585
214    iget v1, v0, LTestClass;->i:I
215
216    add-int/lit8 v1, v1, 0x1
217
218    iput v1, v0, LTestClass;->i:I
219
220    .line 589
221    :goto_10
222    iget v1, v0, LTestClass;->i:I
223
224    return v1
225
226    .line 587
227    :cond_13
228    iget v1, v0, LTestClass;->i:I
229
230    add-int/lit8 v1, v1, 0x2
231
232    iput v1, v0, LTestClass;->i:I
233
234    goto :goto_10
235.end method
236
237## CHECK-START: float Main2.test24() load_store_elimination (before)
238## CHECK-DAG:     <<True:i\d+>>     IntConstant 1
239## CHECK-DAG:     <<Float8:f\d+>>   FloatConstant 8
240## CHECK-DAG:     <<Float42:f\d+>>  FloatConstant 42
241## CHECK-DAG:     <<Obj:l\d+>>      NewInstance
242## CHECK-DAG:                       InstanceFieldSet [<<Obj>>,<<True>>]
243## CHECK-DAG:                       InstanceFieldSet [<<Obj>>,<<Float8>>]
244## CHECK-DAG:     <<GetTest:z\d+>>  InstanceFieldGet [<<Obj>>]
245## CHECK-DAG:     <<GetField:f\d+>> InstanceFieldGet [<<Obj>>]
246## CHECK-DAG:     <<Select:f\d+>>   Select [<<Float42>>,<<GetField>>,<<GetTest>>]
247## CHECK-DAG:                       Return [<<Select>>]
248
249## CHECK-START: float Main2.test24() load_store_elimination (after)
250## CHECK-DAG:     <<True:i\d+>>     IntConstant 1
251## CHECK-DAG:     <<Float8:f\d+>>   FloatConstant 8
252## CHECK-DAG:     <<Float42:f\d+>>  FloatConstant 42
253## CHECK-DAG:     <<Select:f\d+>>   Select [<<Float42>>,<<Float8>>,<<True>>]
254## CHECK-DAG:                       Return [<<Select>>]
255
256# Original java source:
257#
258#     static float test24() {
259#       float a = 42.0f;
260#       TestClass3 obj = new TestClass3();
261#       if (obj.test1) {
262#         a = obj.floatField;
263#       }
264#       return a;
265#     }
266
267.method public static test24()F
268    .registers 3
269
270    .prologue
271    .line 612
272    const/high16 v0, 0x42280000    # 42.0f
273
274    .line 613
275    .local v0, "a":F
276    new-instance v1, LTestClass3;
277
278    invoke-direct {v1}, LTestClass3;-><init>()V
279
280    .line 614
281    .local v1, "obj":LTestClass3;
282    iget-boolean v2, v1, LTestClass3;->test1:Z
283
284    if-eqz v2, :cond_d
285
286    .line 615
287    iget v0, v1, LTestClass3;->floatField:F
288
289    .line 617
290    :cond_d
291    return v0
292.end method
293