----- 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

Reply via email to