xref: /aosp_15_r20/art/test/2238-checker-polymorphic-recursive-inlining/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2022 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 // Check that we have only one call before the inliner.
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean BaseClassWrapper.recursiveTwoWrappers() inliner (before)
20*795d594fSAndroid Build Coastguard Worker /// CHECK:       InvokeVirtual method_name:BaseClass.recursiveTwoWrappers
21*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT:   InvokeVirtual method_name:BaseClass.recursiveTwoWrappers
22*795d594fSAndroid Build Coastguard Worker 
23*795d594fSAndroid Build Coastguard Worker // After the inliner we will have:
24*795d594fSAndroid Build Coastguard Worker // if (receiver == BaseClassAnotherWrapper) {
25*795d594fSAndroid Build Coastguard Worker //  // At this point we have no way to know that the Invoke was going
26*795d594fSAndroid Build Coastguard Worker //  // to be a recursive one, but it cuts at the first iteration.
27*795d594fSAndroid Build Coastguard Worker //   if (receiver == BaseClassNoRecursion) {
28*795d594fSAndroid Build Coastguard Worker //     return false;
29*795d594fSAndroid Build Coastguard Worker //   } else {
30*795d594fSAndroid Build Coastguard Worker //     HInvokeVirtual
31*795d594fSAndroid Build Coastguard Worker //   }
32*795d594fSAndroid Build Coastguard Worker // } else if (receiver == BaseClassNoRecursion) {
33*795d594fSAndroid Build Coastguard Worker //   return false;
34*795d594fSAndroid Build Coastguard Worker // } else {
35*795d594fSAndroid Build Coastguard Worker //   HInvokeVirtual
36*795d594fSAndroid Build Coastguard Worker // }
37*795d594fSAndroid Build Coastguard Worker 
38*795d594fSAndroid Build Coastguard Worker // We should see LoadClasses for BaseClassNoRecursion, and BaseClassAnotherWrapper<BaseClassNoRecursion>, in some order.
39*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean BaseClassWrapper.recursiveTwoWrappers() inliner (after)
40*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG:   LoadClass load_kind:BssEntry class_name:BaseClassAnotherWrapper
41*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG:   LoadClass load_kind:BssEntry class_name:BaseClassNoRecursion
42*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG:   LoadClass load_kind:BssEntry class_name:BaseClassNoRecursion
43*795d594fSAndroid Build Coastguard Worker 
44*795d594fSAndroid Build Coastguard Worker // We should see the two HInvokeVirtual that appear in the above comment.
45*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean BaseClassWrapper.recursiveTwoWrappers() inliner (after)
46*795d594fSAndroid Build Coastguard Worker /// CHECK:       InvokeVirtual method_name:BaseClass.recursiveTwoWrappers
47*795d594fSAndroid Build Coastguard Worker /// CHECK:       InvokeVirtual method_name:BaseClass.recursiveTwoWrappers
48*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT:   InvokeVirtual method_name:BaseClass.recursiveTwoWrappers
49*795d594fSAndroid Build Coastguard Worker class BaseClassWrapper extends BaseClass {
50*795d594fSAndroid Build Coastguard Worker   protected final BaseClass mBaseClass;
51*795d594fSAndroid Build Coastguard Worker 
BaseClassWrapper(BaseClass BaseClass)52*795d594fSAndroid Build Coastguard Worker   public BaseClassWrapper(BaseClass BaseClass) {
53*795d594fSAndroid Build Coastguard Worker     mBaseClass = BaseClass;
54*795d594fSAndroid Build Coastguard Worker   }
55*795d594fSAndroid Build Coastguard Worker 
recursiveTwoWrappers()56*795d594fSAndroid Build Coastguard Worker   boolean recursiveTwoWrappers() {
57*795d594fSAndroid Build Coastguard Worker     return mBaseClass.recursiveTwoWrappers();
58*795d594fSAndroid Build Coastguard Worker   }
59*795d594fSAndroid Build Coastguard Worker }
60*795d594fSAndroid Build Coastguard Worker 
61*795d594fSAndroid Build Coastguard Worker // Same thing here as above but swapping BaseClassWrapper and BaseClassAnotherWrapper.
62*795d594fSAndroid Build Coastguard Worker 
63*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean BaseClassAnotherWrapper.recursiveTwoWrappers() inliner (after)
64*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG:   LoadClass load_kind:BssEntry class_name:BaseClassWrapper
65*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG:   LoadClass load_kind:BssEntry class_name:BaseClassNoRecursion
66*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG:   LoadClass load_kind:BssEntry class_name:BaseClassNoRecursion
67*795d594fSAndroid Build Coastguard Worker 
68*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean BaseClassAnotherWrapper.recursiveTwoWrappers() inliner (after)
69*795d594fSAndroid Build Coastguard Worker /// CHECK:       InvokeVirtual method_name:BaseClass.recursiveTwoWrappers
70*795d594fSAndroid Build Coastguard Worker /// CHECK:       InvokeVirtual method_name:BaseClass.recursiveTwoWrappers
71*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT:   InvokeVirtual method_name:BaseClass.recursiveTwoWrappers
72*795d594fSAndroid Build Coastguard Worker class BaseClassAnotherWrapper extends BaseClass {
73*795d594fSAndroid Build Coastguard Worker   protected final BaseClass mBaseClass;
74*795d594fSAndroid Build Coastguard Worker 
BaseClassAnotherWrapper(BaseClass BaseClass)75*795d594fSAndroid Build Coastguard Worker   public BaseClassAnotherWrapper(BaseClass BaseClass) {
76*795d594fSAndroid Build Coastguard Worker     mBaseClass = BaseClass;
77*795d594fSAndroid Build Coastguard Worker   }
78*795d594fSAndroid Build Coastguard Worker 
recursiveTwoWrappers()79*795d594fSAndroid Build Coastguard Worker   boolean recursiveTwoWrappers() {
80*795d594fSAndroid Build Coastguard Worker     return mBaseClass.recursiveTwoWrappers();
81*795d594fSAndroid Build Coastguard Worker   }
82*795d594fSAndroid Build Coastguard Worker }
83*795d594fSAndroid Build Coastguard Worker 
84*795d594fSAndroid Build Coastguard Worker class BaseClassNoRecursion extends BaseClass {
recursiveTwoWrappers()85*795d594fSAndroid Build Coastguard Worker   boolean recursiveTwoWrappers() {
86*795d594fSAndroid Build Coastguard Worker     return false;
87*795d594fSAndroid Build Coastguard Worker   }
88*795d594fSAndroid Build Coastguard Worker }
89*795d594fSAndroid Build Coastguard Worker 
90*795d594fSAndroid Build Coastguard Worker // Check that we have only one call before the inliner.
91*795d594fSAndroid Build Coastguard Worker 
92*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean BaseClassShallowWrapper.recursiveShallow() inliner (before)
93*795d594fSAndroid Build Coastguard Worker /// CHECK:       InvokeVirtual method_name:BaseClassShallow.recursiveShallow
94*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT:   InvokeVirtual method_name:BaseClassShallow.recursiveShallow
95*795d594fSAndroid Build Coastguard Worker 
96*795d594fSAndroid Build Coastguard Worker // After the inliner we will have
97*795d594fSAndroid Build Coastguard Worker // if (receiver == BaseClassShallowNoRecursion) {
98*795d594fSAndroid Build Coastguard Worker //  return false;
99*795d594fSAndroid Build Coastguard Worker // } else {
100*795d594fSAndroid Build Coastguard Worker //   HInvokeVirtual
101*795d594fSAndroid Build Coastguard Worker // }
102*795d594fSAndroid Build Coastguard Worker 
103*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean BaseClassShallowWrapper.recursiveShallow() inliner (after)
104*795d594fSAndroid Build Coastguard Worker /// CHECK:       LoadClass load_kind:BssEntry class_name:BaseClassShallowNoRecursion
105*795d594fSAndroid Build Coastguard Worker /// CHECK:       InvokeVirtual method_name:BaseClassShallow.recursiveShallow
106*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT:   InvokeVirtual method_name:BaseClassShallow.recursiveShallow
107*795d594fSAndroid Build Coastguard Worker class BaseClassShallowWrapper extends BaseClassShallow {
108*795d594fSAndroid Build Coastguard Worker   protected final BaseClassShallow mBaseClassShallow;
109*795d594fSAndroid Build Coastguard Worker 
BaseClassShallowWrapper(BaseClassShallow BaseClassShallow)110*795d594fSAndroid Build Coastguard Worker   public BaseClassShallowWrapper(BaseClassShallow BaseClassShallow) {
111*795d594fSAndroid Build Coastguard Worker     mBaseClassShallow = BaseClassShallow;
112*795d594fSAndroid Build Coastguard Worker   }
113*795d594fSAndroid Build Coastguard Worker 
recursiveShallow()114*795d594fSAndroid Build Coastguard Worker   boolean recursiveShallow() {
115*795d594fSAndroid Build Coastguard Worker     return mBaseClassShallow.recursiveShallow();
116*795d594fSAndroid Build Coastguard Worker   }
117*795d594fSAndroid Build Coastguard Worker }
118*795d594fSAndroid Build Coastguard Worker 
119*795d594fSAndroid Build Coastguard Worker class BaseClassShallowNoRecursion extends BaseClassShallow {
recursiveShallow()120*795d594fSAndroid Build Coastguard Worker   boolean recursiveShallow() {
121*795d594fSAndroid Build Coastguard Worker     return false;
122*795d594fSAndroid Build Coastguard Worker   }
123*795d594fSAndroid Build Coastguard Worker }
124*795d594fSAndroid Build Coastguard Worker 
125*795d594fSAndroid Build Coastguard Worker public class Main {
main(String[] args)126*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) {}
127*795d594fSAndroid Build Coastguard Worker }