src/share/vm/c1/c1_GraphBuilder.cpp

changeset 9961
be13f53a2a55
parent 9942
eddd586d1a4c
child 10015
eb7ce841ccec
     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));

mercurial