FIX: JIT Loses Shift Results in ArraysID: Q214621
|
When you perform a left-shift, a right-shift, or execute code that would result in a right-shift (such as multiplication on an element of a byte or short array where the result is immediately assigned back to the array), you receive incorrect results. This problem only occurs in the Just In Time (JIT) compiler found in versions 3100 - 3158 of the Microsoft virtual machine.
This is caused by a bug in the JIT where certain shift operations are incorrectly optimized. As a result, the shift operation is not executed, effectively "commenting out" the instructions.
Create a temporary variable where the results of the operation can be
stored and then assigned back to the array element.
Another possible workaround is to turn off the JIT, although this can
cause some Java programs to run at a slower speed.
For additional information about the JIT, please see the following
article in the Microsoft Knowledge Base:
Q154580 Description of the Just-In- Time Compiler
Microsoft has confirmed this to be a bug in the Microsoft products listed
at the beginning of this article.
This problem was corrected in Microsoft virtual machine builds 3165 and greater.
public class jitbug
{
static byte b[] = new byte[1];
public static void main(String args[])
{
System.out.println("Reproduces JIT Bug");
System.out.println ();
System.out.println("Multiple by 8:");
b[0]=8;
b[0] = (byte) (b[0] * 8);
System.out.println("b[0] = b[0] * 8");
System.out.println("Results = " + b[0]);
System.out.println ();
System.out.println("Left-shift by 3:");
b[0]=8;
b[0] = (byte) (b[0] << 3);
System.out.println("b[0] = b[0] << 3");
System.out.println("Results = " + b[0]);
System.out.println ();
System.out.println("Right-shift by 3:");
b[0]=8;
b[0] = (byte) (b[0] >> 3);
System.out.println("b[0] = b[0] >> 3");
System.out.println("Results = " + b[0]);
// Remove the comment block from around the following line to
// see the workaround.
/*
System.out.println ();
System.out.println("Workaround to JIT Bug");
System.out.println ();
System.out.println("Multiple by 8:");
b[0]=8;
byte answer = (byte) (b[0] * 8);
b[0]=answer;
System.out.println("answer = (byte) (b[0] * 8)");
System.out.println("b[0] = answer");
System.out.println("Results = " + b[0]);
System.out.println ();
System.out.println("Left-shift by 3:");
b[0]=8;
byte answer2 = (byte) (b[0] << 3);
b[0]=answer2;
System.out.println("answer2 = (byte) (b[0] << 3)");
System.out.println("b[0] = answer2");
System.out.println("Results = " + b[0]);
System.out.println ();
System.out.println("Right-shift by 3:");
b[0]=8;
byte answer3 = (byte) (b[0] >> 3);
b[0]=answer3;
System.out.println("answer3 = (byte) (b[0] >> 3)");
System.out.println("b[0] = answer3");
System.out.println("Results = " + b[0]);
*/
}
}
For the latest Knowledge Base articles and other support information on Visual J++ and the SDK for Java, see the following pages on the Microsoft Technical Support site:
Support Highlights for Visual J++
Support Highlights for Java
Additional query words: Microsoft VM
Keywords : kbJIT kbGrpJava
Version : WINDOWS:
Platform : WINDOWS
Issue type : kbbug
Last Reviewed: August 8, 1999