Skip to content

Commit ce68ae4

Browse files
authored
[unboxing] Use List<IrField> in Pointer.atUnboxedField instead of IrSpec (#365)
1 parent 511056f commit ce68ae4

File tree

7 files changed

+43
-14
lines changed

7 files changed

+43
-14
lines changed

aeneas/src/core/Opcode.v3

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,8 @@ type Opcode {
161161
case PtrAtComponentField(field: IrField);
162162
case PtrAtObjectField(field: IrField);
163163
case PtrAtRefLayoutField(offset: int);
164-
case PtrAtUnboxedObjectField(fields: List<IrSpec>);
165-
case PtrAtUnboxedComponentField(fields: List<IrSpec>);
164+
case PtrAtUnboxedObjectField(fields: List<IrField>);
165+
case PtrAtUnboxedComponentField(fields: List<IrField>);
166166
case PtrCmpSwp;
167167
case PtrLoad;
168168
case PtrStore;

aeneas/src/core/Operator.v3

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -479,11 +479,11 @@ component V3Op {
479479
}
480480
def newPtrAtUnboxedObjectField(specs: List<IrSpec>, ptrType: Type) -> Operator {
481481
var ta = [specs.head.receiver];
482-
return newOp0(Opcode.PtrAtUnboxedObjectField(specs), ta, ta, ptrType);
482+
return newOp0(Opcode.PtrAtUnboxedObjectField(Lists.map(specs, IrSpec.asField)), ta, ta, ptrType);
483483
}
484484
def newPtrAtUnboxedComponentField(specs: List<IrSpec>, ptrType: Type) -> Operator {
485485
var ta = [specs.head.receiver];
486-
return newOp0(Opcode.PtrAtUnboxedComponentField(specs), ta, ta, ptrType);
486+
return newOp0(Opcode.PtrAtUnboxedComponentField(Lists.map(specs, IrSpec.asField)), ta, ta, ptrType);
487487
}
488488
def newPtrCmpSwp(ptrType: Type, valueType: Type) -> Operator {
489489
return newOp0(Opcode.PtrCmpSwp, [ptrType, valueType], [ptrType, valueType, valueType], type_z);
@@ -630,8 +630,8 @@ def renderOp(op: Operator, buf: StringBuilder) -> StringBuilder {
630630
PtrAtComponentField(field) => rfunc = field.render;
631631
PtrAtObjectField(field) => rfunc = field.render;
632632
PtrAtRefLayoutField(field) => rfunc = StringBuilder.put1(_, "%d", field);
633-
PtrAtUnboxedObjectField(specs) => rfunc = renderList<IrSpec>(_, specs, IrSpec.render, ",");
634-
PtrAtUnboxedComponentField(specs) => rfunc = renderList<IrSpec>(_, specs, IrSpec.render, ",");
633+
PtrAtUnboxedObjectField(specs) => rfunc = renderList<IrField>(_, specs, IrField.renderLong, ",");
634+
PtrAtUnboxedComponentField(specs) => rfunc = renderList<IrField>(_, specs, IrField.renderLong, ",");
635635
ClassAlloc(method) => if(method != null) rfunc = method.render;
636636
ClassGetMethod(method) => rfunc = method.render;
637637
ClassGetVirtual(method) => rfunc = method.render;

aeneas/src/ir/Reachability.v3

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -443,12 +443,11 @@ class ReachabilityAnalyzer(compilation: Compilation) {
443443
rf.writeFacts = none;
444444
rf.setFact(RaFact.RF_VAL_MANY);
445445
}
446-
def getPointerAtUnboxedField(op: SsaApplyOp, specs: List<IrSpec>, context: IrSpec) {
446+
def getPointerAtUnboxedField(op: SsaApplyOp, specs: List<IrField>, context: IrSpec) {
447447
var prevType: Type;
448-
prevType = if(specs != null, specs.head.receiver);
448+
prevType = if(specs != null, mono(op.op.typeArgs[0], context));
449449
for (l = specs; l != null; l = l.tail) {
450-
var spec = l.head;
451-
var fld = spec.asField();
450+
var fld = l.head;
452451
var rf = makeField3(prevType, fld, context);
453452
prevType = rf.fieldType;
454453
if (prevType == null) prevType = rf.orig.fieldType;

aeneas/src/ir/SsaNormalizer.v3

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1337,7 +1337,7 @@ class SsaRaNormalizer extends SsaRebuilder {
13371337
}
13381338
return mapN(i_old, vals);
13391339
}
1340-
def normPtrAtUnboxedField(i_old: SsaApplyOp, specs: List<IrSpec>, op: Operator, boxKind: BoxKind) {
1340+
def normPtrAtUnboxedField(i_old: SsaApplyOp, specs: List<IrField>, op: Operator, boxKind: BoxKind) {
13411341
// XXX: propagate O_NO_NULL_CHECK and O_PURE
13421342
var ai_new = genRefs(i_old.inputs);
13431343
if (i_old.useList == null) {
@@ -1346,7 +1346,7 @@ class SsaRaNormalizer extends SsaRebuilder {
13461346
return map1(i_old, result);
13471347
}
13481348
// Need to start with outermost field access to get initial set of fields
1349-
var raField = extractFieldRef(i_old, specs.head.asField());
1349+
var raField = extractFieldRef(i_old, specs.head);
13501350
var rc = norm.ra.getClass(raField.receiver);
13511351
var nf = raField.normOf(rc.liveFields);
13521352
normType(raField.receiver); // XXX: normType() side-effect of flattening
@@ -1355,7 +1355,7 @@ class SsaRaNormalizer extends SsaRebuilder {
13551355
for (elt = specs.tail; elt != null && nf.length != 0; elt = elt.tail) {
13561356
var spec = elt.head;
13571357
var ctxt = if (specSet != null, specSet.first(), context.spec);
1358-
raField = norm.ra.makeField3(prevType, spec.asField(), ctxt);
1358+
raField = norm.ra.makeField3(prevType, spec, ctxt);
13591359
prevType = raField.getClosedType();
13601360
nf = raField.normOf(nf);
13611361
}

aeneas/src/main/Version.v3

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33

44
// Updated by VCS scripts. DO NOT EDIT.
55
component Version {
6-
def version: string = "III-9.1805";
6+
def version: string = "III-9.1806";
77
var buildData: string;
88
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//@execute 0=0; -99=-99
2+
3+
type A<T>(x: B<T>) #unboxed;
4+
type B<U>(y: C<U>) #unboxed;
5+
type C<V>(z: V) #unboxed;
6+
7+
var f: A<int>;
8+
9+
def main(a: int) -> int {
10+
f = A<int>(B<int>(C<int>(a)));
11+
var p = Pointer.atField(f.x.y.z);
12+
return p.load<int>();
13+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//@execute 0=0; -99=-99
2+
3+
type A<T>(x: B<T>) #unboxed;
4+
type B<U>(y: C<U>) #unboxed;
5+
type C<V>(z: V) #unboxed;
6+
7+
class X<W>(f: A<W>) { }
8+
9+
def main(a: int) -> int {
10+
var v = A<int>(B<int>(C<int>(a)));
11+
var p = get(X<int>.new(v));
12+
return p.load<int>();
13+
}
14+
15+
def get<Z>(o: X<Z>) -> Pointer {
16+
return Pointer.atField(o.f.x.y.z);
17+
}

0 commit comments

Comments
 (0)