1.1 --- a/src/share/vm/c1/c1_GraphBuilder.cpp Wed Jul 29 05:41:50 2020 +0100 1.2 +++ b/src/share/vm/c1/c1_GraphBuilder.cpp Tue Dec 03 08:29:04 2019 +0100 1.3 @@ -1705,6 +1705,23 @@ 1.4 Value replacement = !needs_patching ? _memory->load(load) : load; 1.5 if (replacement != load) { 1.6 assert(replacement->is_linked() || !replacement->can_be_linked(), "should already by linked"); 1.7 + // Writing an (integer) value to a boolean, byte, char or short field includes an implicit narrowing 1.8 + // conversion. Emit an explicit conversion here to get the correct field value after the write. 1.9 + BasicType bt = field->type()->basic_type(); 1.10 + switch (bt) { 1.11 + case T_BOOLEAN: 1.12 + case T_BYTE: 1.13 + replacement = append(new Convert(Bytecodes::_i2b, replacement, as_ValueType(bt))); 1.14 + break; 1.15 + case T_CHAR: 1.16 + replacement = append(new Convert(Bytecodes::_i2c, replacement, as_ValueType(bt))); 1.17 + break; 1.18 + case T_SHORT: 1.19 + replacement = append(new Convert(Bytecodes::_i2s, replacement, as_ValueType(bt))); 1.20 + break; 1.21 + default: 1.22 + break; 1.23 + } 1.24 push(type, replacement); 1.25 } else { 1.26 push(type, append(load));