----- Original Message ----- > From: "Claes Redestad" <redes...@openjdk.java.net> > To: "core-libs-dev" <core-libs-dev@openjdk.java.net> > Sent: Friday, June 3, 2022 2:19:34 PM > Subject: Re: RFR: 8287522: StringConcatFactory: Add in prependers and mixers > in batches [v7]
> On Fri, 3 Jun 2022 11:19:04 GMT, ExE Boss <d...@openjdk.java.net> wrote: > >>> You would think that, but javac doesn't do anything fancy once you store to >>> a >>> local >>> >>> javap output for lines 108 through 111: >>> >>> 449: ldc #148 // float 0.1f >>> 451: fstore 31 >>> 453: fload 31 >>> 455: invokedynamic #149, 0 // InvokeDynamic >>> #4:makeConcatWithConstants:(F)Ljava/lang/String; >>> 460: astore 32 >>> 462: fload 31 >>> 464: aload 4 >>> 466: invokedynamic #152, 0 // InvokeDynamic >>> #7:makeConcatWithConstants:(FLjava/lang/String;)Ljava/lang/String; >>> 471: astore 33 >>> 473: aload 4 >>> 475: fload 31 >>> 477: invokedynamic #155, 0 // InvokeDynamic >>> #10:makeConcatWithConstants:(Ljava/lang/String;F)Ljava/lang/String; >> >> I guess it only happens for `final` locals. > > Yes, looks like javac does constant fold when the local is explicitly final: > > final float f = 0.1f; > System.out.println("const folding? " + f); > > javap: > > 0: getstatic #2 // Field > java/lang/System.out:Ljava/io/PrintStream; > 3: ldc #3 // String const folding? 0.1 > 5: invokevirtual #4 // Method > java/io/PrintStream.println:(Ljava/lang/String;)V > > > Maybe this constant folding is something javac could be enhanced to do on > effectively final locals, though I think we can defer adjusting > `HelloClasslist` to break that optimization when that time comes. The JLS defines final variables (and effectively final) here https://docs.oracle.com/javase/specs/jls/se18/html/jls-4.html#jls-4.12.4 Constant expressions does not list effectively final variables as constant, only final variables https://docs.oracle.com/javase/specs/jls/se18/html/jls-15.html#jls-15.29 > > ------------- > > PR: https://git.openjdk.java.net/jdk/pull/8855 regards, Rémi