diff options
author | 2019-11-15 14:07:19 +0000 | |
---|---|---|
committer | 2019-11-15 17:42:51 +0000 | |
commit | 56f1332113c3b8b1844c04683b9cb9dc5a0bd346 (patch) | |
tree | 849942dca13874ef8e86f6ad9cce76ad5152b429 | |
parent | 3e20d0a7748c8810bff9fe99298758930fbe5300 (diff) |
Fix pruning invoke environment for StringBuilder append pattern.
Test: Extra test in 697-checker-string-append
Test: testrunner.py --host --optimizing
Bug: 19575890
Bug: 144300699
Change-Id: I3934eb01a62dbbed8b8f9f94ce3ba02051538bb0
-rw-r--r-- | compiler/optimizing/instruction_simplifier.cc | 10 | ||||
-rw-r--r-- | test/697-checker-string-append/src/Main.java | 19 |
2 files changed, 25 insertions, 4 deletions
diff --git a/compiler/optimizing/instruction_simplifier.cc b/compiler/optimizing/instruction_simplifier.cc index 63c5965415..d272bfaec9 100644 --- a/compiler/optimizing/instruction_simplifier.cc +++ b/compiler/optimizing/instruction_simplifier.cc @@ -2630,10 +2630,12 @@ static bool TryReplaceStringBuilderAppend(HInvoke* invoke) { block->InsertInstructionBefore(append, invoke); invoke->ReplaceWith(append); // Copy environment, except for the StringBuilder uses. - for (size_t i = 0, size = invoke->GetEnvironment()->Size(); i != size; ++i) { - if (invoke->GetEnvironment()->GetInstructionAt(i) == sb) { - invoke->GetEnvironment()->RemoveAsUserOfInput(i); - invoke->GetEnvironment()->SetRawEnvAt(i, nullptr); + for (HEnvironment* env = invoke->GetEnvironment(); env != nullptr; env = env->GetParent()) { + for (size_t i = 0, size = env->Size(); i != size; ++i) { + if (env->GetInstructionAt(i) == sb) { + env->RemoveAsUserOfInput(i); + env->SetRawEnvAt(i, /*instruction=*/ nullptr); + } } } append->CopyEnvironmentFrom(invoke->GetEnvironment()); diff --git a/test/697-checker-string-append/src/Main.java b/test/697-checker-string-append/src/Main.java index 4f2fa19bc4..9017433ce1 100644 --- a/test/697-checker-string-append/src/Main.java +++ b/test/697-checker-string-append/src/Main.java @@ -21,6 +21,7 @@ public class Main { testAppendStringAndString(); testMiscelaneous(); testNoArgs(); + testInline(); System.out.println("passed"); } @@ -233,6 +234,24 @@ public class Main { $noinline$appendSLILC("x", 1L, 7, -1L, '\u0131')); } + public static String $inline$testInlineInner(StringBuilder sb, String s, int i) { + return sb.append(s).append(i).toString(); + } + + /// CHECK-START: java.lang.String Main.$noinline$testInlineOuter(java.lang.String, int) instruction_simplifier$after_inlining (before) + /// CHECK-NOT: StringBuilderAppend + + /// CHECK-START: java.lang.String Main.$noinline$testInlineOuter(java.lang.String, int) instruction_simplifier$after_inlining (after) + /// CHECK: StringBuilderAppend + public static String $noinline$testInlineOuter(String s, int i) { + StringBuilder sb = new StringBuilder(); + return $inline$testInlineInner(sb, s, i); + } + + public static void testInline() { + assertEquals("x42", $noinline$testInlineOuter("x", 42)); + } + /// CHECK-START: java.lang.String Main.$noinline$appendNothing() instruction_simplifier (before) /// CHECK-NOT: StringBuilderAppend |