summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Vladimir Marko <vmarko@google.com> 2022-03-08 13:46:59 +0000
committer Vladimir Marko <vmarko@google.com> 2022-03-08 16:20:39 +0000
commit103e56a3d08034b8377e31e9c9fd11ef6ca4228f (patch)
treee239e2dfdf6d32bbd604b379b22a50422d72116f
parent0bd1bb317c6d278b956461abfc8e5fe0a0cfc35e (diff)
Fix pattern replacement for float constant.
Test: New test in run-test 569-checker-pattern-replacement. Test: testrunner.py --host --optimizing -t 569 Change-Id: I71dc8d2e07d42284f60528c33965186c2fd6e237
-rw-r--r--compiler/optimizing/inliner.cc9
-rw-r--r--test/569-checker-pattern-replacement/src-multidex/Second.java4
-rw-r--r--test/569-checker-pattern-replacement/src/Main.java24
3 files changed, 35 insertions, 2 deletions
diff --git a/compiler/optimizing/inliner.cc b/compiler/optimizing/inliner.cc
index 1df313d7fc..39f684b895 100644
--- a/compiler/optimizing/inliner.cc
+++ b/compiler/optimizing/inliner.cc
@@ -1551,14 +1551,19 @@ bool HInliner::TryPatternSubstitution(HInvoke* invoke_instruction,
*return_replacement = GetInvokeInputForArgVRegIndex(invoke_instruction,
inline_method.d.return_data.arg);
break;
- case kInlineOpNonWideConst:
- if (method->GetShorty()[0] == 'L') {
+ case kInlineOpNonWideConst: {
+ char shorty0 = method->GetShorty()[0];
+ if (shorty0 == 'L') {
DCHECK_EQ(inline_method.d.data, 0u);
*return_replacement = graph_->GetNullConstant();
+ } else if (shorty0 == 'F') {
+ *return_replacement = graph_->GetFloatConstant(
+ bit_cast<float, int32_t>(static_cast<int32_t>(inline_method.d.data)));
} else {
*return_replacement = graph_->GetIntConstant(static_cast<int32_t>(inline_method.d.data));
}
break;
+ }
case kInlineOpIGet: {
const InlineIGetIPutData& data = inline_method.d.ifield_data;
if (data.method_is_static || data.object_arg != 0u) {
diff --git a/test/569-checker-pattern-replacement/src-multidex/Second.java b/test/569-checker-pattern-replacement/src-multidex/Second.java
index 7a209de956..89835c6f22 100644
--- a/test/569-checker-pattern-replacement/src-multidex/Second.java
+++ b/test/569-checker-pattern-replacement/src-multidex/Second.java
@@ -35,6 +35,10 @@ public final class Second {
return 7;
}
+ public float return42f() {
+ return 42.0f;
+ }
+
public static String staticReturnNull() {
return null;
}
diff --git a/test/569-checker-pattern-replacement/src/Main.java b/test/569-checker-pattern-replacement/src/Main.java
index e2658a404b..8951d3058b 100644
--- a/test/569-checker-pattern-replacement/src/Main.java
+++ b/test/569-checker-pattern-replacement/src/Main.java
@@ -106,6 +106,23 @@ public class Main {
return s.return7(null);
}
+ /// CHECK-START: float Main.return42f(Second) inliner (before)
+ /// CHECK: {{f\d+}} InvokeVirtual
+
+ /// CHECK-START: float Main.return42f(Second) inliner (before)
+ /// CHECK-NOT: FloatConstant 42
+
+ /// CHECK-START: float Main.return42f(Second) inliner (after)
+ /// CHECK-DAG: <<Const42f:f\d+>> FloatConstant 42
+ /// CHECK-DAG: Return [<<Const42f>>]
+
+ /// CHECK-START: float Main.return42f(Second) inliner (after)
+ /// CHECK-NOT: InvokeVirtual
+
+ public static float return42f(Second s) {
+ return s.return42f();
+ }
+
/// CHECK-START: java.lang.String Main.staticReturnNull() inliner (before)
/// CHECK: {{l\d+}} InvokeStaticOrDirect
@@ -1166,6 +1183,7 @@ public class Main {
// Replaced "return const" pattern.
assertEquals(9, staticReturn9());
assertEquals(7, return7(s));
+ assertEquals(42.0f, return42f(s));
assertEquals(null, staticReturnNull());
assertEquals(null, returnNull(s));
// Replaced IGET pattern.
@@ -1249,6 +1267,12 @@ public class Main {
}
}
+ private static void assertEquals(float expected, float actual) {
+ if (expected != actual) {
+ throw new AssertionError("Wrong result: " + expected + " != " + actual);
+ }
+ }
+
private static void assertEquals(double expected, double actual) {
if (expected != actual) {
throw new AssertionError("Wrong result: " + expected + " != " + actual);