ART: Mark StringBuilder.append()s as intrinsics.

We do not actually emit intrinsic implementations for these
methods but we use this designation to simplify their use
knowing that they "return this". This also prepares for
recognizing and optimizing the StringBuilder append pattern.

Note that intrinsics are never inlined but these methods are
defined in core-oj and therefore the rest of the boot image
and prebuilts are not allowed to inline them anyway.

Boot image sizes for aosp_taimen-userdebug:
 - before:
   arm/boot*.oat: 19756400
   arm64/boot*.oat: 23415656
 - after:
   arm/boot*.oat: 19653872 (-100KiB)
   arm64/boot*.oat: 23292784 (-120KiB)

Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Test: aosp_taimen-userdebug boots
Test: run-gtests.sh
Test: testrunner.py --target --optimizing
Bug: 19575890
Change-Id: I2f3bac17830ac1c51287b090a96facddd3d09f5c
diff --git a/compiler/optimizing/instruction_simplifier.cc b/compiler/optimizing/instruction_simplifier.cc
index a433d7e..e829576 100644
--- a/compiler/optimizing/instruction_simplifier.cc
+++ b/compiler/optimizing/instruction_simplifier.cc
@@ -2581,7 +2581,16 @@
       SimplifyNPEOnArgN(instruction, 1);  // 0th has own NullCheck
       break;
     case Intrinsics::kStringBufferAppend:
-    case Intrinsics::kStringBuilderAppend:
+    case Intrinsics::kStringBuilderAppendObject:
+    case Intrinsics::kStringBuilderAppendString:
+    case Intrinsics::kStringBuilderAppendCharSequence:
+    case Intrinsics::kStringBuilderAppendCharArray:
+    case Intrinsics::kStringBuilderAppendBoolean:
+    case Intrinsics::kStringBuilderAppendChar:
+    case Intrinsics::kStringBuilderAppendInt:
+    case Intrinsics::kStringBuilderAppendLong:
+    case Intrinsics::kStringBuilderAppendFloat:
+    case Intrinsics::kStringBuilderAppendDouble:
       SimplifyReturnThis(instruction);
       break;
     case Intrinsics::kStringBufferToString:
diff --git a/compiler/optimizing/intrinsics_arm64.cc b/compiler/optimizing/intrinsics_arm64.cc
index ec5d17a..da1874e 100644
--- a/compiler/optimizing/intrinsics_arm64.cc
+++ b/compiler/optimizing/intrinsics_arm64.cc
@@ -3176,7 +3176,16 @@
 UNIMPLEMENTED_INTRINSIC(ARM64, StringBufferAppend);
 UNIMPLEMENTED_INTRINSIC(ARM64, StringBufferLength);
 UNIMPLEMENTED_INTRINSIC(ARM64, StringBufferToString);
-UNIMPLEMENTED_INTRINSIC(ARM64, StringBuilderAppend);
+UNIMPLEMENTED_INTRINSIC(ARM64, StringBuilderAppendObject);
+UNIMPLEMENTED_INTRINSIC(ARM64, StringBuilderAppendString);
+UNIMPLEMENTED_INTRINSIC(ARM64, StringBuilderAppendCharSequence);
+UNIMPLEMENTED_INTRINSIC(ARM64, StringBuilderAppendCharArray);
+UNIMPLEMENTED_INTRINSIC(ARM64, StringBuilderAppendBoolean);
+UNIMPLEMENTED_INTRINSIC(ARM64, StringBuilderAppendChar);
+UNIMPLEMENTED_INTRINSIC(ARM64, StringBuilderAppendInt);
+UNIMPLEMENTED_INTRINSIC(ARM64, StringBuilderAppendLong);
+UNIMPLEMENTED_INTRINSIC(ARM64, StringBuilderAppendFloat);
+UNIMPLEMENTED_INTRINSIC(ARM64, StringBuilderAppendDouble);
 UNIMPLEMENTED_INTRINSIC(ARM64, StringBuilderLength);
 UNIMPLEMENTED_INTRINSIC(ARM64, StringBuilderToString);
 
diff --git a/compiler/optimizing/intrinsics_arm_vixl.cc b/compiler/optimizing/intrinsics_arm_vixl.cc
index f0aa92e..a497cca 100644
--- a/compiler/optimizing/intrinsics_arm_vixl.cc
+++ b/compiler/optimizing/intrinsics_arm_vixl.cc
@@ -3076,7 +3076,16 @@
 UNIMPLEMENTED_INTRINSIC(ARMVIXL, StringBufferAppend);
 UNIMPLEMENTED_INTRINSIC(ARMVIXL, StringBufferLength);
 UNIMPLEMENTED_INTRINSIC(ARMVIXL, StringBufferToString);
-UNIMPLEMENTED_INTRINSIC(ARMVIXL, StringBuilderAppend);
+UNIMPLEMENTED_INTRINSIC(ARMVIXL, StringBuilderAppendObject);
+UNIMPLEMENTED_INTRINSIC(ARMVIXL, StringBuilderAppendString);
+UNIMPLEMENTED_INTRINSIC(ARMVIXL, StringBuilderAppendCharSequence);
+UNIMPLEMENTED_INTRINSIC(ARMVIXL, StringBuilderAppendCharArray);
+UNIMPLEMENTED_INTRINSIC(ARMVIXL, StringBuilderAppendBoolean);
+UNIMPLEMENTED_INTRINSIC(ARMVIXL, StringBuilderAppendChar);
+UNIMPLEMENTED_INTRINSIC(ARMVIXL, StringBuilderAppendInt);
+UNIMPLEMENTED_INTRINSIC(ARMVIXL, StringBuilderAppendLong);
+UNIMPLEMENTED_INTRINSIC(ARMVIXL, StringBuilderAppendFloat);
+UNIMPLEMENTED_INTRINSIC(ARMVIXL, StringBuilderAppendDouble);
 UNIMPLEMENTED_INTRINSIC(ARMVIXL, StringBuilderLength);
 UNIMPLEMENTED_INTRINSIC(ARMVIXL, StringBuilderToString);
 
diff --git a/compiler/optimizing/intrinsics_mips.cc b/compiler/optimizing/intrinsics_mips.cc
index 3da0e57..9e5316d 100644
--- a/compiler/optimizing/intrinsics_mips.cc
+++ b/compiler/optimizing/intrinsics_mips.cc
@@ -2713,7 +2713,16 @@
 UNIMPLEMENTED_INTRINSIC(MIPS, StringBufferAppend);
 UNIMPLEMENTED_INTRINSIC(MIPS, StringBufferLength);
 UNIMPLEMENTED_INTRINSIC(MIPS, StringBufferToString);
-UNIMPLEMENTED_INTRINSIC(MIPS, StringBuilderAppend);
+UNIMPLEMENTED_INTRINSIC(MIPS, StringBuilderAppendObject);
+UNIMPLEMENTED_INTRINSIC(MIPS, StringBuilderAppendString);
+UNIMPLEMENTED_INTRINSIC(MIPS, StringBuilderAppendCharSequence);
+UNIMPLEMENTED_INTRINSIC(MIPS, StringBuilderAppendCharArray);
+UNIMPLEMENTED_INTRINSIC(MIPS, StringBuilderAppendBoolean);
+UNIMPLEMENTED_INTRINSIC(MIPS, StringBuilderAppendChar);
+UNIMPLEMENTED_INTRINSIC(MIPS, StringBuilderAppendInt);
+UNIMPLEMENTED_INTRINSIC(MIPS, StringBuilderAppendLong);
+UNIMPLEMENTED_INTRINSIC(MIPS, StringBuilderAppendFloat);
+UNIMPLEMENTED_INTRINSIC(MIPS, StringBuilderAppendDouble);
 UNIMPLEMENTED_INTRINSIC(MIPS, StringBuilderLength);
 UNIMPLEMENTED_INTRINSIC(MIPS, StringBuilderToString);
 
diff --git a/compiler/optimizing/intrinsics_mips64.cc b/compiler/optimizing/intrinsics_mips64.cc
index 3e68765..d8ec892 100644
--- a/compiler/optimizing/intrinsics_mips64.cc
+++ b/compiler/optimizing/intrinsics_mips64.cc
@@ -2363,7 +2363,16 @@
 UNIMPLEMENTED_INTRINSIC(MIPS64, StringBufferAppend);
 UNIMPLEMENTED_INTRINSIC(MIPS64, StringBufferLength);
 UNIMPLEMENTED_INTRINSIC(MIPS64, StringBufferToString);
-UNIMPLEMENTED_INTRINSIC(MIPS64, StringBuilderAppend);
+UNIMPLEMENTED_INTRINSIC(MIPS64, StringBuilderAppendObject);
+UNIMPLEMENTED_INTRINSIC(MIPS64, StringBuilderAppendString);
+UNIMPLEMENTED_INTRINSIC(MIPS64, StringBuilderAppendCharSequence);
+UNIMPLEMENTED_INTRINSIC(MIPS64, StringBuilderAppendCharArray);
+UNIMPLEMENTED_INTRINSIC(MIPS64, StringBuilderAppendBoolean);
+UNIMPLEMENTED_INTRINSIC(MIPS64, StringBuilderAppendChar);
+UNIMPLEMENTED_INTRINSIC(MIPS64, StringBuilderAppendInt);
+UNIMPLEMENTED_INTRINSIC(MIPS64, StringBuilderAppendLong);
+UNIMPLEMENTED_INTRINSIC(MIPS64, StringBuilderAppendFloat);
+UNIMPLEMENTED_INTRINSIC(MIPS64, StringBuilderAppendDouble);
 UNIMPLEMENTED_INTRINSIC(MIPS64, StringBuilderLength);
 UNIMPLEMENTED_INTRINSIC(MIPS64, StringBuilderToString);
 
diff --git a/compiler/optimizing/intrinsics_x86.cc b/compiler/optimizing/intrinsics_x86.cc
index de697f0..f8d3bf5 100644
--- a/compiler/optimizing/intrinsics_x86.cc
+++ b/compiler/optimizing/intrinsics_x86.cc
@@ -3087,7 +3087,16 @@
 UNIMPLEMENTED_INTRINSIC(X86, StringBufferAppend);
 UNIMPLEMENTED_INTRINSIC(X86, StringBufferLength);
 UNIMPLEMENTED_INTRINSIC(X86, StringBufferToString);
-UNIMPLEMENTED_INTRINSIC(X86, StringBuilderAppend);
+UNIMPLEMENTED_INTRINSIC(X86, StringBuilderAppendObject);
+UNIMPLEMENTED_INTRINSIC(X86, StringBuilderAppendString);
+UNIMPLEMENTED_INTRINSIC(X86, StringBuilderAppendCharSequence);
+UNIMPLEMENTED_INTRINSIC(X86, StringBuilderAppendCharArray);
+UNIMPLEMENTED_INTRINSIC(X86, StringBuilderAppendBoolean);
+UNIMPLEMENTED_INTRINSIC(X86, StringBuilderAppendChar);
+UNIMPLEMENTED_INTRINSIC(X86, StringBuilderAppendInt);
+UNIMPLEMENTED_INTRINSIC(X86, StringBuilderAppendLong);
+UNIMPLEMENTED_INTRINSIC(X86, StringBuilderAppendFloat);
+UNIMPLEMENTED_INTRINSIC(X86, StringBuilderAppendDouble);
 UNIMPLEMENTED_INTRINSIC(X86, StringBuilderLength);
 UNIMPLEMENTED_INTRINSIC(X86, StringBuilderToString);
 
diff --git a/compiler/optimizing/intrinsics_x86_64.cc b/compiler/optimizing/intrinsics_x86_64.cc
index e79c0c9..f2a6c53 100644
--- a/compiler/optimizing/intrinsics_x86_64.cc
+++ b/compiler/optimizing/intrinsics_x86_64.cc
@@ -2754,7 +2754,16 @@
 UNIMPLEMENTED_INTRINSIC(X86_64, StringBufferAppend);
 UNIMPLEMENTED_INTRINSIC(X86_64, StringBufferLength);
 UNIMPLEMENTED_INTRINSIC(X86_64, StringBufferToString);
-UNIMPLEMENTED_INTRINSIC(X86_64, StringBuilderAppend);
+UNIMPLEMENTED_INTRINSIC(X86_64, StringBuilderAppendObject);
+UNIMPLEMENTED_INTRINSIC(X86_64, StringBuilderAppendString);
+UNIMPLEMENTED_INTRINSIC(X86_64, StringBuilderAppendCharSequence);
+UNIMPLEMENTED_INTRINSIC(X86_64, StringBuilderAppendCharArray);
+UNIMPLEMENTED_INTRINSIC(X86_64, StringBuilderAppendBoolean);
+UNIMPLEMENTED_INTRINSIC(X86_64, StringBuilderAppendChar);
+UNIMPLEMENTED_INTRINSIC(X86_64, StringBuilderAppendInt);
+UNIMPLEMENTED_INTRINSIC(X86_64, StringBuilderAppendLong);
+UNIMPLEMENTED_INTRINSIC(X86_64, StringBuilderAppendFloat);
+UNIMPLEMENTED_INTRINSIC(X86_64, StringBuilderAppendDouble);
 UNIMPLEMENTED_INTRINSIC(X86_64, StringBuilderLength);
 UNIMPLEMENTED_INTRINSIC(X86_64, StringBuilderToString);
 
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h
index fedad0c..8a8b371 100644
--- a/compiler/optimizing/nodes.h
+++ b/compiler/optimizing/nodes.h
@@ -4775,7 +4775,16 @@
       case Intrinsics::kThreadCurrentThread:
       case Intrinsics::kStringBufferAppend:
       case Intrinsics::kStringBufferToString:
-      case Intrinsics::kStringBuilderAppend:
+      case Intrinsics::kStringBuilderAppendObject:
+      case Intrinsics::kStringBuilderAppendString:
+      case Intrinsics::kStringBuilderAppendCharSequence:
+      case Intrinsics::kStringBuilderAppendCharArray:
+      case Intrinsics::kStringBuilderAppendBoolean:
+      case Intrinsics::kStringBuilderAppendChar:
+      case Intrinsics::kStringBuilderAppendInt:
+      case Intrinsics::kStringBuilderAppendLong:
+      case Intrinsics::kStringBuilderAppendFloat:
+      case Intrinsics::kStringBuilderAppendDouble:
       case Intrinsics::kStringBuilderToString:
         return false;
       default:
diff --git a/runtime/image.cc b/runtime/image.cc
index b6bb0b1..0c99852 100644
--- a/runtime/image.cc
+++ b/runtime/image.cc
@@ -29,7 +29,7 @@
 namespace art {
 
 const uint8_t ImageHeader::kImageMagic[] = { 'a', 'r', 't', '\n' };
-const uint8_t ImageHeader::kImageVersion[] = { '0', '7', '4', '\0' };  // CRC32UpdateBB intrinsic
+const uint8_t ImageHeader::kImageVersion[] = { '0', '7', '5', '\0' };  // SB.append() intrinsics
 
 ImageHeader::ImageHeader(uint32_t image_reservation_size,
                          uint32_t component_count,
diff --git a/runtime/interpreter/interpreter_intrinsics.cc b/runtime/interpreter/interpreter_intrinsics.cc
index c8878e1..81c06bc 100644
--- a/runtime/interpreter/interpreter_intrinsics.cc
+++ b/runtime/interpreter/interpreter_intrinsics.cc
@@ -526,7 +526,19 @@
     UNIMPLEMENTED_CASE(StringBufferAppend /* (Ljava/lang/String;)Ljava/lang/StringBuffer; */)
     UNIMPLEMENTED_CASE(StringBufferLength /* ()I */)
     UNIMPLEMENTED_CASE(StringBufferToString /* ()Ljava/lang/String; */)
-    UNIMPLEMENTED_CASE(StringBuilderAppend /* (Ljava/lang/String;)Ljava/lang/StringBuilder; */)
+    UNIMPLEMENTED_CASE(
+        StringBuilderAppendObject /* (Ljava/lang/Object;)Ljava/lang/StringBuilder; */)
+    UNIMPLEMENTED_CASE(
+        StringBuilderAppendString /* (Ljava/lang/String;)Ljava/lang/StringBuilder; */)
+    UNIMPLEMENTED_CASE(
+        StringBuilderAppendCharSequence /* (Ljava/lang/CharSequence;)Ljava/lang/StringBuilder; */)
+    UNIMPLEMENTED_CASE(StringBuilderAppendCharArray /* ([C)Ljava/lang/StringBuilder; */)
+    UNIMPLEMENTED_CASE(StringBuilderAppendBoolean /* (Z)Ljava/lang/StringBuilder; */)
+    UNIMPLEMENTED_CASE(StringBuilderAppendChar /* (C)Ljava/lang/StringBuilder; */)
+    UNIMPLEMENTED_CASE(StringBuilderAppendInt /* (I)Ljava/lang/StringBuilder; */)
+    UNIMPLEMENTED_CASE(StringBuilderAppendLong /* (J)Ljava/lang/StringBuilder; */)
+    UNIMPLEMENTED_CASE(StringBuilderAppendFloat /* (F)Ljava/lang/StringBuilder; */)
+    UNIMPLEMENTED_CASE(StringBuilderAppendDouble /* (D)Ljava/lang/StringBuilder; */)
     UNIMPLEMENTED_CASE(StringBuilderLength /* ()I */)
     UNIMPLEMENTED_CASE(StringBuilderToString /* ()Ljava/lang/String; */)
     UNIMPLEMENTED_CASE(UnsafeCASInt /* (Ljava/lang/Object;JII)Z */)
diff --git a/runtime/intrinsics_list.h b/runtime/intrinsics_list.h
index 57e81a7..7cd8b0b 100644
--- a/runtime/intrinsics_list.h
+++ b/runtime/intrinsics_list.h
@@ -181,7 +181,16 @@
   V(StringBufferAppend, kVirtual, kNeedsEnvironmentOrCache, kAllSideEffects, kCanThrow, "Ljava/lang/StringBuffer;", "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;") \
   V(StringBufferLength, kVirtual, kNeedsEnvironmentOrCache, kAllSideEffects, kNoThrow, "Ljava/lang/StringBuffer;", "length", "()I") \
   V(StringBufferToString, kVirtual, kNeedsEnvironmentOrCache, kAllSideEffects, kCanThrow, "Ljava/lang/StringBuffer;", "toString", "()Ljava/lang/String;") \
-  V(StringBuilderAppend, kVirtual, kNeedsEnvironmentOrCache, kAllSideEffects, kCanThrow, "Ljava/lang/StringBuilder;", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;") \
+  V(StringBuilderAppendObject, kVirtual, kNeedsEnvironmentOrCache, kAllSideEffects, kCanThrow, "Ljava/lang/StringBuilder;", "append", "(Ljava/lang/Object;)Ljava/lang/StringBuilder;") \
+  V(StringBuilderAppendString, kVirtual, kNeedsEnvironmentOrCache, kAllSideEffects, kCanThrow, "Ljava/lang/StringBuilder;", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;") \
+  V(StringBuilderAppendCharSequence, kVirtual, kNeedsEnvironmentOrCache, kAllSideEffects, kCanThrow, "Ljava/lang/StringBuilder;", "append", "(Ljava/lang/CharSequence;)Ljava/lang/StringBuilder;") \
+  V(StringBuilderAppendCharArray, kVirtual, kNeedsEnvironmentOrCache, kAllSideEffects, kCanThrow, "Ljava/lang/StringBuilder;", "append", "([C)Ljava/lang/StringBuilder;") \
+  V(StringBuilderAppendBoolean, kVirtual, kNeedsEnvironmentOrCache, kAllSideEffects, kCanThrow, "Ljava/lang/StringBuilder;", "append", "(Z)Ljava/lang/StringBuilder;") \
+  V(StringBuilderAppendChar, kVirtual, kNeedsEnvironmentOrCache, kAllSideEffects, kCanThrow, "Ljava/lang/StringBuilder;", "append", "(C)Ljava/lang/StringBuilder;") \
+  V(StringBuilderAppendInt, kVirtual, kNeedsEnvironmentOrCache, kAllSideEffects, kCanThrow, "Ljava/lang/StringBuilder;", "append", "(I)Ljava/lang/StringBuilder;") \
+  V(StringBuilderAppendLong, kVirtual, kNeedsEnvironmentOrCache, kAllSideEffects, kCanThrow, "Ljava/lang/StringBuilder;", "append", "(J)Ljava/lang/StringBuilder;") \
+  V(StringBuilderAppendFloat, kVirtual, kNeedsEnvironmentOrCache, kAllSideEffects, kCanThrow, "Ljava/lang/StringBuilder;", "append", "(F)Ljava/lang/StringBuilder;") \
+  V(StringBuilderAppendDouble, kVirtual, kNeedsEnvironmentOrCache, kAllSideEffects, kCanThrow, "Ljava/lang/StringBuilder;", "append", "(D)Ljava/lang/StringBuilder;") \
   V(StringBuilderLength, kVirtual, kNeedsEnvironmentOrCache, kReadSideEffects, kNoThrow, "Ljava/lang/StringBuilder;", "length", "()I") \
   V(StringBuilderToString, kVirtual, kNeedsEnvironmentOrCache, kAllSideEffects, kCanThrow, "Ljava/lang/StringBuilder;", "toString", "()Ljava/lang/String;") \
   V(UnsafeCASInt, kVirtual, kNeedsEnvironmentOrCache, kAllSideEffects, kCanThrow, "Lsun/misc/Unsafe;", "compareAndSwapInt", "(Ljava/lang/Object;JII)Z") \
diff --git a/test/624-checker-stringops/smali/Smali.smali b/test/624-checker-stringops/smali/Smali.smali
index f8b9275..3252cde 100644
--- a/test/624-checker-stringops/smali/Smali.smali
+++ b/test/624-checker-stringops/smali/Smali.smali
@@ -47,17 +47,17 @@
 ## CHECK-START: int Smali.builderLen2() instruction_simplifier (before)
 ## CHECK-DAG: <<New:l\d+>>     NewInstance
 ## CHECK-DAG: <<String1:l\d+>> LoadString
-## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>]     intrinsic:StringBuilderAppend
+## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>]     intrinsic:StringBuilderAppendString
 ## CHECK-DAG: <<String2:l\d+>> LoadString
-## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<Append1>>,<<String2>>] intrinsic:StringBuilderAppend
+## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<Append1>>,<<String2>>] intrinsic:StringBuilderAppendString
 ## CHECK-DAG:                  InvokeVirtual [<<Append2>>]             intrinsic:StringBuilderLength
 
 ## CHECK-START: int Smali.builderLen2() instruction_simplifier (after)
 ## CHECK-DAG: <<New:l\d+>>     NewInstance
 ## CHECK-DAG: <<String1:l\d+>> LoadString
-## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBuilderAppend
+## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBuilderAppendString
 ## CHECK-DAG: <<String2:l\d+>> LoadString
-## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<New>>,<<String2>>] intrinsic:StringBuilderAppend
+## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<New>>,<<String2>>] intrinsic:StringBuilderAppendString
 ## CHECK-DAG:                  InvokeVirtual [<<New>>]             intrinsic:StringBuilderLength
 .method public static builderLen2()I
     .registers 3
@@ -84,13 +84,13 @@
 ## CHECK-DAG: <<New:l\d+>>     NewInstance                                                           loop:none
 ## CHECK-DAG: <<String1:l\d+>> LoadString                                                            loop:<<Loop:B\d+>>
 ## CHECK-DAG: <<Null1:l\d+>>   NullCheck     [<<New>>]                                               loop:<<Loop>>
-## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<Null1>>,<<String1>>] intrinsic:StringBufferAppend    loop:<<Loop>>
+## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<Null1>>,<<String1>>]   intrinsic:StringBufferAppend  loop:<<Loop>>
 ## CHECK-DAG: <<String2:l\d+>> LoadString                                                            loop:<<Loop>>
 ## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<Append1>>,<<String2>>] intrinsic:StringBufferAppend  loop:<<Loop>>
 ## CHECK-DAG: <<String3:l\d+>> LoadString                                                            loop:<<Loop>>
 ## CHECK-DAG: <<Append3:l\d+>> InvokeVirtual [<<Append2>>,<<String3>>] intrinsic:StringBufferAppend  loop:<<Loop>>
 ## CHECK-DAG: <<Null4:l\d+>>   NullCheck     [<<New>>]                                               loop:none
-## CHECK-DAG:                  InvokeVirtual [<<Null4>>]             intrinsic:StringBufferLength    loop:none
+## CHECK-DAG:                  InvokeVirtual [<<Null4>>]               intrinsic:StringBufferLength  loop:none
 
 ## CHECK-START: int Smali.bufferLoopAppender() instruction_simplifier (after)
 ## CHECK-DAG: <<New:l\d+>>     NewInstance                                                       loop:none
@@ -138,26 +138,26 @@
 .end method
 
 ## CHECK-START: int Smali.builderLoopAppender() instruction_simplifier (before)
-## CHECK-DAG: <<New:l\d+>>     NewInstance                                                           loop:none
-## CHECK-DAG: <<String1:l\d+>> LoadString                                                            loop:<<Loop:B\d+>>
-## CHECK-DAG: <<Null1:l\d+>>   NullCheck     [<<New>>]                                               loop:<<Loop>>
-## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<Null1>>,<<String1>>]   intrinsic:StringBuilderAppend loop:<<Loop>>
-## CHECK-DAG: <<String2:l\d+>> LoadString                                                            loop:<<Loop>>
-## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<Append1>>,<<String2>>] intrinsic:StringBuilderAppend loop:<<Loop>>
-## CHECK-DAG: <<String3:l\d+>> LoadString                                                            loop:<<Loop>>
-## CHECK-DAG: <<Append3:l\d+>> InvokeVirtual [<<Append2>>,<<String3>>] intrinsic:StringBuilderAppend loop:<<Loop>>
-## CHECK-DAG: <<Null4:l\d+>>   NullCheck     [<<New>>]                                               loop:none
-## CHECK-DAG:                  InvokeVirtual [<<Null4>>]               intrinsic:StringBuilderLength loop:none
+## CHECK-DAG: <<New:l\d+>>     NewInstance                                                                 loop:none
+## CHECK-DAG: <<String1:l\d+>> LoadString                                                                  loop:<<Loop:B\d+>>
+## CHECK-DAG: <<Null1:l\d+>>   NullCheck     [<<New>>]                                                     loop:<<Loop>>
+## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<Null1>>,<<String1>>]   intrinsic:StringBuilderAppendString loop:<<Loop>>
+## CHECK-DAG: <<String2:l\d+>> LoadString                                                                  loop:<<Loop>>
+## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<Append1>>,<<String2>>] intrinsic:StringBuilderAppendString loop:<<Loop>>
+## CHECK-DAG: <<String3:l\d+>> LoadString                                                                  loop:<<Loop>>
+## CHECK-DAG: <<Append3:l\d+>> InvokeVirtual [<<Append2>>,<<String3>>] intrinsic:StringBuilderAppendString loop:<<Loop>>
+## CHECK-DAG: <<Null4:l\d+>>   NullCheck     [<<New>>]                                                     loop:none
+## CHECK-DAG:                  InvokeVirtual [<<Null4>>]               intrinsic:StringBuilderLength       loop:none
 
 ## CHECK-START: int Smali.builderLoopAppender() instruction_simplifier (after)
-## CHECK-DAG: <<New:l\d+>>     NewInstance                                                       loop:none
-## CHECK-DAG: <<String1:l\d+>> LoadString                                                        loop:<<Loop:B\d+>>
-## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBuilderAppend loop:<<Loop>>
-## CHECK-DAG: <<String2:l\d+>> LoadString                                                        loop:<<Loop>>
-## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<New>>,<<String2>>] intrinsic:StringBuilderAppend loop:<<Loop>>
-## CHECK-DAG: <<String3:l\d+>> LoadString                                                        loop:<<Loop>>
-## CHECK-DAG: <<Append3:l\d+>> InvokeVirtual [<<New>>,<<String3>>] intrinsic:StringBuilderAppend loop:<<Loop>>
-## CHECK-DAG:                  InvokeVirtual [<<New>>]             intrinsic:StringBuilderLength loop:none
+## CHECK-DAG: <<New:l\d+>>     NewInstance                                                             loop:none
+## CHECK-DAG: <<String1:l\d+>> LoadString                                                              loop:<<Loop:B\d+>>
+## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBuilderAppendString loop:<<Loop>>
+## CHECK-DAG: <<String2:l\d+>> LoadString                                                              loop:<<Loop>>
+## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<New>>,<<String2>>] intrinsic:StringBuilderAppendString loop:<<Loop>>
+## CHECK-DAG: <<String3:l\d+>> LoadString                                                              loop:<<Loop>>
+## CHECK-DAG: <<Append3:l\d+>> InvokeVirtual [<<New>>,<<String3>>] intrinsic:StringBuilderAppendString loop:<<Loop>>
+## CHECK-DAG:                  InvokeVirtual [<<New>>]             intrinsic:StringBuilderLength       loop:none
 .method public static builderLoopAppender()I
     .registers 4
 
diff --git a/test/624-checker-stringops/src/Main.java b/test/624-checker-stringops/src/Main.java
index f52d81a..055a4d7 100644
--- a/test/624-checker-stringops/src/Main.java
+++ b/test/624-checker-stringops/src/Main.java
@@ -136,17 +136,17 @@
   /// CHECK-START: int Main.builderLen2() instruction_simplifier (before)
   /// CHECK-DAG: <<New:l\d+>>     NewInstance
   /// CHECK-DAG: <<String1:l\d+>> LoadString
-  /// CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>]  intrinsic:StringBuilderAppend
+  /// CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>]  intrinsic:StringBuilderAppendString
   /// CHECK-DAG: <<String2:l\d+>> LoadString
-  /// CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [{{l\d+}},<<String2>>] intrinsic:StringBuilderAppend
+  /// CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [{{l\d+}},<<String2>>] intrinsic:StringBuilderAppendString
   /// CHECK-DAG:                  InvokeVirtual [{{l\d+}}]             intrinsic:StringBuilderLength
   //
   /// CHECK-START: int Main.builderLen2() instruction_simplifier (after)
   /// CHECK-DAG: <<New:l\d+>>     NewInstance
   /// CHECK-DAG: <<String1:l\d+>> LoadString
-  /// CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBuilderAppend
+  /// CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBuilderAppendString
   /// CHECK-DAG: <<String2:l\d+>> LoadString
-  /// CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<New>>,<<String2>>] intrinsic:StringBuilderAppend
+  /// CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<New>>,<<String2>>] intrinsic:StringBuilderAppendString
   /// CHECK-DAG:                  InvokeVirtual [<<New>>]             intrinsic:StringBuilderLength
   static int builderLen2() {
     StringBuilder s = new StringBuilder();
@@ -200,25 +200,25 @@
   // Similar situation in a loop.
   //
   /// CHECK-START: int Main.builderLoopAppender() instruction_simplifier (before)
-  /// CHECK-DAG: <<New:l\d+>>     NewInstance                                                         loop:none
-  /// CHECK-DAG: <<String1:l\d+>> LoadString                                                          loop:<<Loop:B\d+>>
-  /// CHECK-DAG: <<Null1:l\d+>>   NullCheck     [<<New>>]                                             loop:<<Loop>>
-  /// CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<Null1>>,<<String1>>] intrinsic:StringBuilderAppend loop:<<Loop>>
-  /// CHECK-DAG: <<String2:l\d+>> LoadString                                                          loop:<<Loop>>
-  /// CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [{{l\d+}},<<String2>>]  intrinsic:StringBuilderAppend loop:<<Loop>>
-  /// CHECK-DAG: <<String3:l\d+>> LoadString                                                          loop:<<Loop>>
-  /// CHECK-DAG: <<Append3:l\d+>> InvokeVirtual [{{l\d+}},<<String3>>]  intrinsic:StringBuilderAppend loop:<<Loop>>
-  /// CHECK-DAG:                  InvokeVirtual [{{l\d+}}]              intrinsic:StringBuilderLength loop:none
+  /// CHECK-DAG: <<New:l\d+>>     NewInstance                                                               loop:none
+  /// CHECK-DAG: <<String1:l\d+>> LoadString                                                                loop:<<Loop:B\d+>>
+  /// CHECK-DAG: <<Null1:l\d+>>   NullCheck     [<<New>>]                                                   loop:<<Loop>>
+  /// CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<Null1>>,<<String1>>] intrinsic:StringBuilderAppendString loop:<<Loop>>
+  /// CHECK-DAG: <<String2:l\d+>> LoadString                                                                loop:<<Loop>>
+  /// CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [{{l\d+}},<<String2>>]  intrinsic:StringBuilderAppendString loop:<<Loop>>
+  /// CHECK-DAG: <<String3:l\d+>> LoadString                                                                loop:<<Loop>>
+  /// CHECK-DAG: <<Append3:l\d+>> InvokeVirtual [{{l\d+}},<<String3>>]  intrinsic:StringBuilderAppendString loop:<<Loop>>
+  /// CHECK-DAG:                  InvokeVirtual [{{l\d+}}]              intrinsic:StringBuilderLength       loop:none
   //
   /// CHECK-START: int Main.builderLoopAppender() instruction_simplifier (after)
-  /// CHECK-DAG: <<New:l\d+>>     NewInstance                                                       loop:none
-  /// CHECK-DAG: <<String1:l\d+>> LoadString                                                        loop:<<Loop:B\d+>>
-  /// CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBuilderAppend loop:<<Loop>>
-  /// CHECK-DAG: <<String2:l\d+>> LoadString                                                        loop:<<Loop>>
-  /// CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<New>>,<<String2>>] intrinsic:StringBuilderAppend loop:<<Loop>>
-  /// CHECK-DAG: <<String3:l\d+>> LoadString                                                        loop:<<Loop>>
-  /// CHECK-DAG: <<Append3:l\d+>> InvokeVirtual [<<New>>,<<String3>>] intrinsic:StringBuilderAppend loop:<<Loop>>
-  /// CHECK-DAG:                  InvokeVirtual [<<New>>]             intrinsic:StringBuilderLength loop:none
+  /// CHECK-DAG: <<New:l\d+>>     NewInstance                                                             loop:none
+  /// CHECK-DAG: <<String1:l\d+>> LoadString                                                              loop:<<Loop:B\d+>>
+  /// CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBuilderAppendString loop:<<Loop>>
+  /// CHECK-DAG: <<String2:l\d+>> LoadString                                                              loop:<<Loop>>
+  /// CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<New>>,<<String2>>] intrinsic:StringBuilderAppendString loop:<<Loop>>
+  /// CHECK-DAG: <<String3:l\d+>> LoadString                                                              loop:<<Loop>>
+  /// CHECK-DAG: <<Append3:l\d+>> InvokeVirtual [<<New>>,<<String3>>] intrinsic:StringBuilderAppendString loop:<<Loop>>
+  /// CHECK-DAG:                  InvokeVirtual [<<New>>]             intrinsic:StringBuilderLength       loop:none
   static int builderLoopAppender() {
     StringBuilder b = new StringBuilder();
     for (int i = 0; i < 10; i++) {