--- old/src/share/vm/opto/memnode.cpp 2014-10-23 22:11:38.000000000 +0400 +++ new/src/share/vm/opto/memnode.cpp 2014-10-23 22:11:38.000000000 +0400 @@ -1257,6 +1257,16 @@ result = new ConvI2LNode(phase->transform(result)); } #endif + // Boxing/unboxing can be done from signed & unsigned loads (e.g. LoadUB -> ... -> LoadB pair). + // Need to preserve unboxing load type if it is unsigned. + switch(this->Opcode()) { + case Op_LoadUB: + result = new AndINode(phase->transform(result), phase->intcon(0xFF)); + break; + case Op_LoadUS: + result = new AndINode(phase->transform(result), phase->intcon(0xFFFF)); + break; + } return result; } }