private double allocateConditionally( final ThreadLocalRandom rnd ) { final Vector2D v; if( rnd.nextBoolean() ) { v = new Vector2D( 1, rnd.nextDouble() ); } else { v = new Vector2D( rnd.nextDouble(), 1 ); } return v.length(); }не скаляризуется — хотя интуитивно кажется, что скаляризация здесь должна быть тривиальной.
А что если немного добавить аллокаций?
private double allocateConditionally2( final ThreadLocalRandom rnd ) { final Vector2D result = new Vector2D(); if( rnd.nextBoolean() ) { final Vector2D v = new Vector2D( 1, rnd.nextDouble() ); result.copyFrom(v); } else { final Vector2D v = new Vector2D( rnd.nextDouble(), 1 ); result.copyFrom(v); } return result.length(); }В этом коде на одну точку аллокации больше — но все эти аллокации успешно скаляризуются. В общем-то, ничего особо удивительного: здесь каждая ссылочная переменная в любых сценариях исполнения всегда адресует один-единственный объект, поэтому никаких сложностей у скаляризации не возникает :)