[JVM IR] Use append(Char) for 1-length string literals in string

templates and plus concatenations.

This is slightly more efficient and mirrors the behavior of the non-IR
backend for templates (but not for plus concatenations).

#KT-36638 Fixed
This commit is contained in:
Mark Punzalan
2020-02-12 11:26:59 -08:00
committed by Dmitry Petrov
parent b0bd39e715
commit c19b47bc4b
9 changed files with 78 additions and 17 deletions

View File

@@ -0,0 +1,16 @@
fun test(s: String, i: Int) = "x" + s + " " + i + "y"
// The IR is equivalent for this test and "useAppendCharForOneCharStringInTemplate*.kt" because there is an optimization for 1-length
// string literals in any string concatenation, whether using templates or + operator (see JvmStringConcatenationLowering).
// However, for the non-IR backend, `append(String)` will still be used for these 1-length strings.
// JVM_TEMPLATES
// 4 INVOKEVIRTUAL java/lang/StringBuilder.append \(Ljava/lang/String;\)Ljava/lang/StringBuilder
// 1 INVOKEVIRTUAL java/lang/StringBuilder.append \(I\)Ljava/lang/StringBuilder
// 5 INVOKEVIRTUAL java/lang/StringBuilder.append
// JVM_IR_TEMPLATES
// 1 INVOKEVIRTUAL java/lang/StringBuilder.append \(Ljava/lang/String;\)Ljava/lang/StringBuilder
// 1 INVOKEVIRTUAL java/lang/StringBuilder.append \(I\)Ljava/lang/StringBuilder
// 3 INVOKEVIRTUAL java/lang/StringBuilder.append \(C\)Ljava/lang/StringBuilder
// 5 INVOKEVIRTUAL java/lang/StringBuilder.append