[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:
committed by
Dmitry Petrov
parent
bd9877cc62
commit
4234fa79c0
+2
-3
@@ -1,6 +1,3 @@
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
// TODO KT-36638 Use 'java/lang/StringBuilder.append (C)Ljava/lang/StringBuilder;' when appending single character in JVM_IR
|
||||
|
||||
// KT-5016 wrong StringBuilder append method invoked
|
||||
class kt5016 {
|
||||
fun f1(name : String) : String {
|
||||
@@ -10,4 +7,6 @@ class kt5016 {
|
||||
|
||||
// 0 INVOKEVIRTUAL java/lang/StringBuilder.append \(Ljava/lang/Object;\)Ljava/lang/StringBuilder
|
||||
// 2 INVOKEVIRTUAL java/lang/StringBuilder.append \(Ljava/lang/String;\)Ljava/lang/StringBuilder
|
||||
// 1 INVOKEVIRTUAL java/lang/StringBuilder.append \(C\)Ljava/lang/StringBuilder
|
||||
// 3 INVOKEVIRTUAL java/lang/StringBuilder.append
|
||||
// 1 INVOKEVIRTUAL java/lang/StringBuilder.toString
|
||||
|
||||
+2
-3
@@ -1,6 +1,3 @@
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
// TODO KT-36638 Use 'java/lang/StringBuilder.append (C)Ljava/lang/StringBuilder;' when appending single character in JVM_IR
|
||||
|
||||
// KT-5016 wrong StringBuilder append method invoked
|
||||
class kt5016int {
|
||||
fun f1(num : Int) : String {
|
||||
@@ -11,4 +8,6 @@ class kt5016int {
|
||||
// 0 INVOKEVIRTUAL java/lang/StringBuilder.append \(Ljava/lang/Object;\)Ljava/lang/StringBuilder
|
||||
// 1 INVOKEVIRTUAL java/lang/StringBuilder.append \(Ljava/lang/String;\)Ljava/lang/StringBuilder
|
||||
// 1 INVOKEVIRTUAL java/lang/StringBuilder.append \(I\)Ljava/lang/StringBuilder
|
||||
// 1 INVOKEVIRTUAL java/lang/StringBuilder.append \(C\)Ljava/lang/StringBuilder
|
||||
// 3 INVOKEVIRTUAL java/lang/StringBuilder.append
|
||||
// 1 INVOKEVIRTUAL java/lang/StringBuilder.toString
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
// TODO KT-36638 Use 'java/lang/StringBuilder.append (C)Ljava/lang/StringBuilder;' when appending single character in JVM_IR
|
||||
|
||||
// KT-5016 wrong StringBuilder append method invoked
|
||||
class kt5016intOrNull {
|
||||
fun f1(num : Int?) : String {
|
||||
@@ -10,4 +7,6 @@ class kt5016intOrNull {
|
||||
|
||||
// 1 INVOKEVIRTUAL java/lang/StringBuilder.append \(Ljava/lang/Object;\)Ljava/lang/StringBuilder
|
||||
// 1 INVOKEVIRTUAL java/lang/StringBuilder.append \(Ljava/lang/String;\)Ljava/lang/StringBuilder
|
||||
// 1 INVOKEVIRTUAL java/lang/StringBuilder.append \(C\)Ljava/lang/StringBuilder
|
||||
// 3 INVOKEVIRTUAL java/lang/StringBuilder.append
|
||||
// 1 INVOKEVIRTUAL java/lang/StringBuilder.toString
|
||||
|
||||
Vendored
+6
@@ -0,0 +1,6 @@
|
||||
fun test(s: String, i: Int) = "${"x"}${s}${" "}${i}${"y"}"
|
||||
|
||||
// 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
|
||||
compiler/testData/codegen/bytecodeText/stringOperations/useAppendCharForOneCharStringInTemplate_2.kt
Vendored
+6
@@ -0,0 +1,6 @@
|
||||
fun test(s: String, i: Int) = "x${s} ${i}y"
|
||||
|
||||
// 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
|
||||
Vendored
+16
@@ -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
|
||||
Reference in New Issue
Block a user