Limit recursive polymorphic inlining to prevent code bloat
If both NoRecursion and Wrapper implement the same method
MyMethod, NoRecursion with just `return false` and Wrapper
with `return BaseClass.MyMethod()` we would end up with
generated code similar to:
```
if (receiver == NoRecursion) {
return false;
} else if (receiver == Wrapper) {
// A polymorphic invoke which turns into:
if (unwrappedValue.receiver == NoRecursion) {
return false;
} else if (unwrappedValue.receiver == Wrapper) {
// A polymorphic invoke which turns into
// [...] you get the gist, we do this several times.
} else {
// HInvokeVirtual
}
} else {
// HInvokeVirtual
}
```
After the change we would have:
```
if (receiver == NoRecursion) {
return false;
} else {
// HInvokeVirtual
}
```
This pattern was worse when there were more than one recursive
polymorphic case, increasing exponentially in size. This was
common to see on Wrapper classes, but uncommon otherwise.
In the two wrappers plus one non-wrapper case in test/2238-,
we will now generate a .cfg which is about 6% the size versus
before this CL (12M -> 779K).
Test: art/test/testrunner/testrunner.py --host --64 --optimizing -b
Bug: 217464625
Change-Id: I3c6444193ea2f24af29d97549776a283ef177efd
diff --git a/test/2238-checker-polymorphic-recursive-inlining/src/BaseClass.java b/test/2238-checker-polymorphic-recursive-inlining/src/BaseClass.java
new file mode 100644
index 0000000..38e6f07
--- /dev/null
+++ b/test/2238-checker-polymorphic-recursive-inlining/src/BaseClass.java
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+public abstract class BaseClass {
+ abstract boolean recursiveTwoWrappers();
+}