<div dir="ltr">Hi guys,<div><br></div><div>Looking at generated asm (x86-64 SandyBridge, 1.7u60) for a switch statement on an enum from C2 compiler, I'm wondering whether there's some missing profile information that could be incorporated into the generated code.</div><div><br></div><div><div>private enum E {</div><div><span class="" style="white-space:pre">      </span>ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE</div><div>    }</div></div><div><br></div><div><div>private static int getInt(E e) {</div><div><span class="" style="white-space:pre">    </span>switch (e) {</div><div><span class="" style="white-space:pre">       </span>case ZERO: return 0;</div><div><span class="" style="white-space:pre">       </span>case ONE: return 1;</div><div><span class="" style="white-space:pre">        </span>case TWO: return 2;</div><div><span class="" style="white-space:pre">        </span>case THREE: return 3;</div><div><span class="" style="white-space:pre">      </span>case FOUR: return 4;</div><div><span class="" style="white-space:pre">       </span>case FIVE: return 5;</div><div><span class="" style="white-space:pre">       </span>case SIX: return 6;</div><div><span class="" style="white-space:pre">        </span>case SEVEN: return 7;</div><div><span class="" style="white-space:pre">      </span>case EIGHT: return 8;</div><div><span class="" style="white-space:pre">      </span>case NINE: return 9;<span class="" style="white-space:pre">      </span></div><div><span class="" style="white-space:pre">   </span></div><div><span class="" style="white-space:pre">   </span>default: throw new Error();</div><div><span class="" style="white-space:pre">        </span>}</div><div>    }</div></div><div><br></div><div><div>public void foo() {</div><div><span class="" style="white-space:pre">  </span>int sum = 0;</div><div><span class="" style="white-space:pre">       </span>for (int i = 0; i < 100000; ++i) {</div><div><span class="" style="white-space:pre">      </span>    sum += getInt(E.FOUR);<span class="" style="white-space:pre">      </span>    </div><div><span class="" style="white-space:pre">     </span>}</div><div><span class="" style="white-space:pre">  </span>System.out.println(sum);</div><div>    }</div></div><div><br></div><div>The generated code for getInt() appears to proceed through a binary search of the enum ordinal range, trying to match the incoming argument.  But, as can be seen above, the incoming argument is always E.FOUR.  I tried to restrict E to have only 4 members, but the strategy used by the JIT didn't change.  Why isn't it doing a quick test against FOUR before proceeding with the search through the value range?</div><div><br></div><div>Also, what's the reason this isn't generating a direct lookup into a switch table? If I change getInt() above to do the ordinal switching myself:</div><div><br></div><div><div>switch (e.ordinal()) {</div><div><span class="" style="white-space:pre">    </span>case 0: return 0;</div><div><span class="" style="white-space:pre">  </span>case 1: return 1;</div><div><span class="" style="white-space:pre">  </span>case 2: return 2;</div><div><span class="" style="white-space:pre">  </span>case 3: return 3;</div><div><span class="" style="white-space:pre">  </span>case 4: return 4;</div><div><span class="" style="white-space:pre">  </span>case 5: return 5;</div><div><span class="" style="white-space:pre">  </span>case 6: return 6;</div><div><span class="" style="white-space:pre">  </span>case 7: return 7;</div><div><span class="" style="white-space:pre">  </span>case 8: return 8;</div><div><span class="" style="white-space:pre">  </span>case 9: return 9;<span class="" style="white-space:pre"> </span></div><div><span class="" style="white-space:pre">   </span></div><div><span class="" style="white-space:pre">   </span>default: throw new Error();</div></div><div><br></div><div>It still generates the same type of code.  For comparison, gcc 4.9 and clang 3.4.1 generate a lookup into a switch table after checking that the argument isn't going to go into the default case.</div><div><br></div><div>I can paste the generated asm if that helps, but it should be easy to reproduce given the above code.</div><div><br></div><div>Thanks</div></div>