src/share/vm/c1/c1_GraphBuilder.cpp

changeset 9961
be13f53a2a55
parent 9942
eddd586d1a4c
child 10015
eb7ce841ccec
equal deleted inserted replaced
9960:8c3972a290c0 9961:be13f53a2a55
1703 } 1703 }
1704 LoadField* load = new LoadField(obj, offset, field, false, state_before, needs_patching); 1704 LoadField* load = new LoadField(obj, offset, field, false, state_before, needs_patching);
1705 Value replacement = !needs_patching ? _memory->load(load) : load; 1705 Value replacement = !needs_patching ? _memory->load(load) : load;
1706 if (replacement != load) { 1706 if (replacement != load) {
1707 assert(replacement->is_linked() || !replacement->can_be_linked(), "should already by linked"); 1707 assert(replacement->is_linked() || !replacement->can_be_linked(), "should already by linked");
1708 // Writing an (integer) value to a boolean, byte, char or short field includes an implicit narrowing
1709 // conversion. Emit an explicit conversion here to get the correct field value after the write.
1710 BasicType bt = field->type()->basic_type();
1711 switch (bt) {
1712 case T_BOOLEAN:
1713 case T_BYTE:
1714 replacement = append(new Convert(Bytecodes::_i2b, replacement, as_ValueType(bt)));
1715 break;
1716 case T_CHAR:
1717 replacement = append(new Convert(Bytecodes::_i2c, replacement, as_ValueType(bt)));
1718 break;
1719 case T_SHORT:
1720 replacement = append(new Convert(Bytecodes::_i2s, replacement, as_ValueType(bt)));
1721 break;
1722 default:
1723 break;
1724 }
1708 push(type, replacement); 1725 push(type, replacement);
1709 } else { 1726 } else {
1710 push(type, append(load)); 1727 push(type, append(load));
1711 } 1728 }
1712 } 1729 }

mercurial