diff options
author | 2022-03-08 13:46:59 +0000 | |
---|---|---|
committer | 2022-03-08 16:20:39 +0000 | |
commit | 103e56a3d08034b8377e31e9c9fd11ef6ca4228f (patch) | |
tree | e239e2dfdf6d32bbd604b379b22a50422d72116f | |
parent | 0bd1bb317c6d278b956461abfc8e5fe0a0cfc35e (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.cc | 9 | ||||
-rw-r--r-- | test/569-checker-pattern-replacement/src-multidex/Second.java | 4 | ||||
-rw-r--r-- | test/569-checker-pattern-replacement/src/Main.java | 24 |
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); |