@@ -818,8 +818,10 @@ class SsaInstrReducer(context: SsaContext) extends SsaInstrMatcher {
818818 if (field.isConst()) {
819819 if (SsaConst.?(receiver)) {
820820 // ClassGetField(#K) => #K
821- return graph.valConst(getFieldType(i.op, field),
822- asRecord(receiver).values[field.index]);
821+ var record = asRecord(receiver);
822+ var ftype = field.fieldType;
823+ if (ftype.open()) ftype = IrSpec.new(record.rtype, TypeUtil.NO_TYPES, field).getFieldType();
824+ return graph.valConst(ftype, record.values[field.index]);
823825 }
824826 i.setFactIf(Fact.O_NO_NULL_CHECK, Fact.O_PURE);
825827 i.facts |= Fact.F_VALUE;
@@ -868,10 +870,9 @@ class SsaInstrReducer(context: SsaContext) extends SsaInstrMatcher {
868870 if (SsaConst.?(receiver)) {
869871 // VariantGetField(#K) => #K
870872 var record = asRecord(receiver);
871- var val = if(record != null, record.values[field.index]);
872- //TODO: variants should not have null records, but this can currently happen in folding during normalization
873- //TODO if (record == null) context.fail1("VariantGetField @%d has null input record", i.uid);
874- return graph.valConst(getFieldType(i.op, field), val);
873+ var ftype = field.fieldType;
874+ if (ftype.open()) ftype = IrSpec.new(record.rtype, TypeUtil.NO_TYPES, field).getFieldType();
875+ return graph.valConst(ftype, if(record != null, record.values[field.index]));
875876 }
876877 if (!i.facts.F_POINTED_AT) i.facts |= Fact.F_VALUE;
877878 if (optimize_loads) return state.load(receiver, field, i);
0 commit comments