Skip to content

Commit cd29497

Browse files
Automatic merge of master into galahad
2 parents 1cd8d6e + a701086 commit cd29497

19 files changed

+113
-97
lines changed

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/AnalysisObjectScanningObserver.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public boolean forPrimitiveFieldValue(JavaConstant receiver, AnalysisField field
8383
/* Add the constant value object to the field's type flow. */
8484
FieldTypeFlow fieldTypeFlow = getFieldTypeFlow(field, receiver);
8585
/* Add the new constant to the field's flow state. */
86-
return fieldTypeFlow.addState(analysis, TypeState.forPrimitiveConstant(fieldValue.asLong()));
86+
return fieldTypeFlow.addState(analysis, TypeState.forPrimitiveConstant(analysis, fieldValue.asLong()));
8787
}
8888

8989
/**

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/BooleanCheckTypeFlow.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -46,19 +46,19 @@ protected BooleanCheckTypeFlow(BooleanCheckTypeFlow original, MethodFlowsGraph m
4646
super(original, methodFlows);
4747
}
4848

49-
protected static TypeState convertToBoolean(boolean canBeTrue, boolean canBeFalse) {
49+
protected static TypeState convertToBoolean(PointsToAnalysis bb, boolean canBeTrue, boolean canBeFalse) {
5050
if (canBeTrue && canBeFalse) {
5151
return TypeState.anyPrimitiveState();
5252
} else if (canBeTrue) {
53-
return TypeState.forBoolean(true);
53+
return TypeState.forBoolean(bb, true);
5454
} else if (canBeFalse) {
55-
return TypeState.forBoolean(false);
55+
return TypeState.forBoolean(bb, false);
5656
}
5757
return TypeState.forEmpty();
5858
}
5959

60-
protected static TypeState convertToBoolean(TypeState trueState, TypeState falseState) {
61-
return convertToBoolean(trueState.isNotEmpty(), falseState.isNotEmpty());
60+
protected static TypeState convertToBoolean(PointsToAnalysis bb, TypeState trueState, TypeState falseState) {
61+
return convertToBoolean(bb, trueState.isNotEmpty(), falseState.isNotEmpty());
6262
}
6363

6464
@Override

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/BooleanInstanceOfCheckTypeFlow.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,6 @@ public TypeState filter(PointsToAnalysis bb, TypeState update) {
6868
canBeTrue = TypeState.forIntersection(bb, update, checkedType.getAssignableTypes(includeNull));
6969
canBeFalse = TypeState.forSubtraction(bb, update, checkedType.getAssignableTypes(includeNull));
7070
}
71-
return convertToBoolean(canBeTrue, canBeFalse);
71+
return convertToBoolean(bb, canBeTrue, canBeFalse);
7272
}
7373
}

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/BooleanNullCheckTypeFlow.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,6 @@ public TypeFlow<BytecodePosition> copy(PointsToAnalysis bb, MethodFlowsGraph met
5252
public TypeState filter(PointsToAnalysis bb, TypeState newState) {
5353
var hasNull = newState.canBeNull();
5454
var hasTypes = newState.typesCount() > 0;
55-
return convertToBoolean(hasNull, hasTypes);
55+
return convertToBoolean(bb, hasNull, hasTypes);
5656
}
5757
}

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/BooleanPrimitiveCheckTypeFlow.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,6 @@ public TypeState eval(PointsToAnalysis bb) {
8686
}
8787
assert leftState.isPrimitive() : left;
8888
assert rightState.isPrimitive() : right;
89-
return convertToBoolean(TypeState.filter(leftState, comparison, rightState), TypeState.filter(leftState, comparison.negate(), rightState));
89+
return convertToBoolean(bb, TypeState.filter(leftState, comparison, rightState), TypeState.filter(leftState, comparison.negate(), rightState));
9090
}
9191
}

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/ConstantPrimitiveSourceTypeFlow.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232

3333
public class ConstantPrimitiveSourceTypeFlow extends TypeFlow<BytecodePosition> implements PrimitiveFlow {
3434

35-
public ConstantPrimitiveSourceTypeFlow(BytecodePosition source, AnalysisType type, long value) {
36-
super(source, type, TypeState.forPrimitiveConstant(value));
35+
public ConstantPrimitiveSourceTypeFlow(BytecodePosition source, AnalysisType type, TypeState state) {
36+
super(source, type, state);
3737
}
3838

3939
public ConstantPrimitiveSourceTypeFlow(ConstantPrimitiveSourceTypeFlow original, MethodFlowsGraph methodFlows) {

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/MethodTypeFlowBuilder.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ public static void registerUsedElements(PointsToAnalysis bb, StructuredGraph gra
294294
type.registerAsInstantiated(AbstractAnalysisEngine.sourcePosition(node));
295295
for (var f : type.getInstanceFields(true)) {
296296
var field = (AnalysisField) f;
297-
field.getInitialFlow().addState(bb, TypeState.defaultValueForKind(field.getStorageKind()));
297+
field.getInitialFlow().addState(bb, TypeState.defaultValueForKind(bb, field.getStorageKind()));
298298
}
299299
}
300300

@@ -845,7 +845,7 @@ protected TypeFlowBuilder<?> handleIntegerStamp(IntegerStamp stamp, ValueNode no
845845
long hi = stamp.upperBound();
846846
if (lo == hi) {
847847
return TypeFlowBuilder.create(bb, method, getPredicate(), node, ConstantPrimitiveSourceTypeFlow.class, () -> {
848-
var flow = new ConstantPrimitiveSourceTypeFlow(AbstractAnalysisEngine.sourcePosition(node), type, lo);
848+
var flow = new ConstantPrimitiveSourceTypeFlow(AbstractAnalysisEngine.sourcePosition(node), type, TypeState.forPrimitiveConstant(bb, lo));
849849
flowsGraph.addMiscEntryFlow(flow);
850850
return flow;
851851
});
@@ -1963,7 +1963,7 @@ protected void processCommitAllocation(CommitAllocationNode commitAllocationNode
19631963
} else {
19641964
if (!type.isArray()) {
19651965
AnalysisField field = (AnalysisField) ((VirtualInstanceNode) virtualObject).field(i);
1966-
field.getInitialFlow().addState(bb, TypeState.defaultValueForKind(field.getStorageKind()));
1966+
field.getInitialFlow().addState(bb, TypeState.defaultValueForKind(bb, field.getStorageKind()));
19671967
}
19681968
}
19691969
}

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/NewInstanceTypeFlow.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ protected void onFlowEnabled(PointsToAnalysis bb) {
7777
if (insertDefaultFieldValues) {
7878
for (var f : declaredType.getInstanceFields(true)) {
7979
var field = (AnalysisField) f;
80-
field.getInitialFlow().addState(bb, TypeState.defaultValueForKind(field.getStorageKind()));
80+
field.getInitialFlow().addState(bb, TypeState.defaultValueForKind(bb, field.getStorageKind()));
8181
}
8282
}
8383
}

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/context/bytecode/BytecodeSensitiveAnalysisPolicy.java

+23-23
Original file line numberDiff line numberDiff line change
@@ -430,12 +430,12 @@ public TypeState forContextInsensitiveTypeState(PointsToAnalysis bb, TypeState s
430430

431431
@Override
432432
public SingleTypeState singleTypeState(PointsToAnalysis bb, boolean canBeNull, AnalysisType type, AnalysisObject... objects) {
433-
return new ContextSensitiveSingleTypeState(bb, canBeNull, type, objects);
433+
return PointsToStats.registerTypeState(bb, new ContextSensitiveSingleTypeState(canBeNull, type, objects));
434434
}
435435

436436
@Override
437437
public MultiTypeState multiTypeState(PointsToAnalysis bb, boolean canBeNull, BitSet typesBitSet, int typesCount, AnalysisObject... objects) {
438-
return new ContextSensitiveMultiTypeState(bb, canBeNull, typesBitSet, typesCount, objects);
438+
return PointsToStats.registerTypeState(bb, new ContextSensitiveMultiTypeState(canBeNull, typesBitSet, typesCount, objects));
439439
}
440440

441441
@Override
@@ -466,7 +466,7 @@ public TypeState doUnion(PointsToAnalysis bb, SingleTypeState state1, SingleType
466466
assert !Arrays.equals(resultObjects, s1.objects) && !Arrays.equals(resultObjects, s2.objects) : resultObjects;
467467

468468
/* Create the resulting exact type state. */
469-
SingleTypeState result = new ContextSensitiveSingleTypeState(bb, resultCanBeNull, s1.exactType(), resultObjects);
469+
SingleTypeState result = singleTypeState(bb, resultCanBeNull, s1.exactType(), resultObjects);
470470
assert !s1.equals(result) && !s2.equals(result) : result;
471471
PointsToStats.registerUnionOperation(bb, s1, s2, result);
472472
return result;
@@ -482,7 +482,7 @@ public TypeState doUnion(PointsToAnalysis bb, SingleTypeState state1, SingleType
482482
/* We know the types, construct the types bit set without walking the objects. */
483483
BitSet typesBitSet = TypeStateUtils.newBitSet(s1.exactType().getId(), s2.exactType().getId());
484484
assert typesBitSet.cardinality() == 2 : typesBitSet;
485-
TypeState result = new ContextSensitiveMultiTypeState(bb, resultCanBeNull, typesBitSet, 2, resultObjects);
485+
TypeState result = multiTypeState(bb, resultCanBeNull, typesBitSet, 2, resultObjects);
486486
PointsToStats.registerUnionOperation(bb, s1, s2, result);
487487
return result;
488488
}
@@ -542,7 +542,7 @@ public TypeState doUnion(PointsToAnalysis bb, MultiTypeState state1, SingleTypeS
542542
System.arraycopy(so1, typeRange.right(), resultObjects, typeRange.left() + unionObjects.length, so1.length - typeRange.right());
543543

544544
/* The types bit set of the result and s1 are the same. */
545-
MultiTypeState result = new ContextSensitiveMultiTypeState(bb, resultCanBeNull, s1.bitSet(), s1.typesCount(), resultObjects);
545+
MultiTypeState result = multiTypeState(bb, resultCanBeNull, s1.bitSet(), s1.typesCount(), resultObjects);
546546
assert !result.equals(s1) : result;
547547
/*
548548
* No need to check the result size against the all-instantiated since the type count
@@ -576,7 +576,7 @@ public TypeState doUnion(PointsToAnalysis bb, MultiTypeState state1, SingleTypeS
576576
BitSet typesBitSet = TypeStateUtils.set(s1.bitSet(), s2.exactType().getId());
577577
int typesCount = s1.typesCount() + 1;
578578
assert typesCount == typesBitSet.cardinality() : typesCount;
579-
MultiTypeState result = new ContextSensitiveMultiTypeState(bb, resultCanBeNull, typesBitSet, typesCount, resultObjects);
579+
MultiTypeState result = multiTypeState(bb, resultCanBeNull, typesBitSet, typesCount, resultObjects);
580580
PointsToStats.registerUnionOperation(bb, s1, s2, result);
581581
return result;
582582
}
@@ -621,7 +621,7 @@ private TypeState doUnion0(PointsToAnalysis bb, ContextSensitiveMultiTypeState s
621621
BitSet resultTypesBitSet = TypeStateUtils.or(s1.bitSet(), s2.bitSet());
622622
int typesCount = s1.typesCount() + s2.typesCount();
623623
assert typesCount == resultTypesBitSet.cardinality() : typesCount;
624-
MultiTypeState result = new ContextSensitiveMultiTypeState(bb, resultCanBeNull, resultTypesBitSet, typesCount, resultObjects);
624+
MultiTypeState result = multiTypeState(bb, resultCanBeNull, resultTypesBitSet, typesCount, resultObjects);
625625
PointsToStats.registerUnionOperation(bb, s1, s2, result);
626626
return result;
627627

@@ -635,7 +635,7 @@ private TypeState doUnion0(PointsToAnalysis bb, ContextSensitiveMultiTypeState s
635635
BitSet resultTypesBitSet = TypeStateUtils.or(s1.bitSet(), s2.bitSet());
636636
int typesCount = s1.typesCount() + s2.typesCount();
637637
assert typesCount == resultTypesBitSet.cardinality() : typesCount;
638-
MultiTypeState result = new ContextSensitiveMultiTypeState(bb, resultCanBeNull, resultTypesBitSet, typesCount, resultObjects);
638+
MultiTypeState result = multiTypeState(bb, resultCanBeNull, resultTypesBitSet, typesCount, resultObjects);
639639
PointsToStats.registerUnionOperation(bb, s1, s2, result);
640640
return result;
641641
}
@@ -824,7 +824,7 @@ private TypeState doUnion2(PointsToAnalysis bb, ContextSensitiveMultiTypeState s
824824

825825
/* Logical OR the type bit sets. */
826826
BitSet resultTypesBitSet = TypeStateUtils.or(s1.bitSet(), s2.bitSet());
827-
MultiTypeState result = new ContextSensitiveMultiTypeState(bb, resultCanBeNull, resultTypesBitSet, resultTypesBitSet.cardinality(),
827+
MultiTypeState result = multiTypeState(bb, resultCanBeNull, resultTypesBitSet, resultTypesBitSet.cardinality(),
828828
resultObjects.copyToArray(new AnalysisObject[resultObjects.size()]));
829829
assert !result.equals(s1) : "speculation code should prevent this case";
830830

@@ -874,7 +874,7 @@ public TypeState doIntersection(PointsToAnalysis bb, MultiTypeState s1, SingleTy
874874
AnalysisObject[] resultObjects = ((ContextSensitiveMultiTypeState) s1).objectsArray(s2.exactType());
875875
/* All objects must have the same type. */
876876
assert TypeStateUtils.holdsSingleTypeState(resultObjects);
877-
return new ContextSensitiveSingleTypeState(bb, resultCanBeNull, s2.exactType(), resultObjects);
877+
return singleTypeState(bb, resultCanBeNull, s2.exactType(), resultObjects);
878878
} else {
879879
return TypeState.forEmpty().forCanBeNull(bb, resultCanBeNull);
880880
}
@@ -900,7 +900,7 @@ public TypeState doIntersection(PointsToAnalysis bb, MultiTypeState state1, Mult
900900
return doIntersection0(bb, s1, s2, resultCanBeNull);
901901
}
902902

903-
private static TypeState doIntersection0(PointsToAnalysis bb, ContextSensitiveMultiTypeState s1, ContextSensitiveMultiTypeState s2, boolean resultCanBeNull) {
903+
private TypeState doIntersection0(PointsToAnalysis bb, ContextSensitiveMultiTypeState s1, ContextSensitiveMultiTypeState s2, boolean resultCanBeNull) {
904904
/* Speculate that s1 and s2 have either the same types, or no types in common. */
905905

906906
if (s1.bitSet().equals(s2.bitSet())) {
@@ -916,7 +916,7 @@ private static TypeState doIntersection0(PointsToAnalysis bb, ContextSensitiveMu
916916
return doIntersection1(bb, s1, s2, resultCanBeNull);
917917
}
918918

919-
private static TypeState doIntersection1(PointsToAnalysis bb, ContextSensitiveMultiTypeState s1, ContextSensitiveMultiTypeState s2, boolean resultCanBeNull) {
919+
private TypeState doIntersection1(PointsToAnalysis bb, ContextSensitiveMultiTypeState s1, ContextSensitiveMultiTypeState s2, boolean resultCanBeNull) {
920920
/*
921921
* Speculate that s2 contains all types of s1, i.e., the filter is broader than s1, thus the
922922
* result is s1.
@@ -964,7 +964,7 @@ private static TypeState doIntersection1(PointsToAnalysis bb, ContextSensitiveMu
964964

965965
private static ThreadLocal<ListUtils.UnsafeArrayListClosable<AnalysisObject>> intersectionArrayListTL = new ThreadLocal<>();
966966

967-
private static TypeState doIntersection2(PointsToAnalysis bb, ContextSensitiveMultiTypeState s1, ContextSensitiveMultiTypeState s2, boolean resultCanBeNull, int idx1Param, int idx2Param) {
967+
private TypeState doIntersection2(PointsToAnalysis bb, ContextSensitiveMultiTypeState s1, ContextSensitiveMultiTypeState s2, boolean resultCanBeNull, int idx1Param, int idx2Param) {
968968

969969
try (ListUtils.UnsafeArrayListClosable<AnalysisObject> tlArrayClosable = ListUtils.getTLArrayList(intersectionArrayListTL, 256)) {
970970
ListUtils.UnsafeArrayList<AnalysisObject> resultObjects = tlArrayClosable.list();
@@ -1007,11 +1007,11 @@ private static TypeState doIntersection2(PointsToAnalysis bb, ContextSensitiveMu
10071007

10081008
if (TypeStateUtils.holdsSingleTypeState(objects, objects.length)) {
10091009
/* Multiple objects of the same type. */
1010-
return new ContextSensitiveSingleTypeState(bb, resultCanBeNull, objects[0].type(), objects);
1010+
return singleTypeState(bb, resultCanBeNull, objects[0].type(), objects);
10111011
} else {
10121012
/* Logical AND the type bit sets. */
10131013
BitSet resultTypesBitSet = TypeStateUtils.and(s1.bitSet(), s2.bitSet());
1014-
MultiTypeState result = new ContextSensitiveMultiTypeState(bb, resultCanBeNull, resultTypesBitSet, resultTypesBitSet.cardinality(), objects);
1014+
MultiTypeState result = multiTypeState(bb, resultCanBeNull, resultTypesBitSet, resultTypesBitSet.cardinality(), objects);
10151015

10161016
/*
10171017
* The result can be equal to s1 if and only if s1 and s2 have the same type
@@ -1077,15 +1077,15 @@ public TypeState doSubtraction(PointsToAnalysis bb, MultiTypeState state1, Singl
10771077
System.arraycopy(s1.objects, typeRange.right(), resultObjects, typeRange.left(), s1.objects.length - typeRange.right());
10781078

10791079
if (resultObjects.length == 1) {
1080-
return new ContextSensitiveSingleTypeState(bb, resultCanBeNull, resultObjects[0].type(), resultObjects[0]);
1080+
return singleTypeState(bb, resultCanBeNull, resultObjects[0].type(), resultObjects[0]);
10811081
} else if (TypeStateUtils.holdsSingleTypeState(resultObjects)) {
10821082
/* Multiple objects of the same type. */
1083-
return new ContextSensitiveSingleTypeState(bb, resultCanBeNull, resultObjects[0].type(), resultObjects);
1083+
return singleTypeState(bb, resultCanBeNull, resultObjects[0].type(), resultObjects);
10841084
} else {
10851085
BitSet resultTypesBitSet = TypeStateUtils.clear(s1.bitSet(), s2.exactType().getId());
10861086
int typesCount = s1.typesCount() - 1;
10871087
assert typesCount == resultTypesBitSet.cardinality() : typesCount;
1088-
return new ContextSensitiveMultiTypeState(bb, resultCanBeNull, resultTypesBitSet, typesCount, resultObjects);
1088+
return multiTypeState(bb, resultCanBeNull, resultTypesBitSet, typesCount, resultObjects);
10891089
}
10901090

10911091
} else {
@@ -1110,7 +1110,7 @@ public TypeState doSubtraction(PointsToAnalysis bb, MultiTypeState state1, Multi
11101110
return doSubtraction0(bb, s1, s2, resultCanBeNull);
11111111
}
11121112

1113-
private static TypeState doSubtraction0(PointsToAnalysis bb, ContextSensitiveMultiTypeState s1, ContextSensitiveMultiTypeState s2, boolean resultCanBeNull) {
1113+
private TypeState doSubtraction0(PointsToAnalysis bb, ContextSensitiveMultiTypeState s1, ContextSensitiveMultiTypeState s2, boolean resultCanBeNull) {
11141114
/* Speculate that s1 and s2 have either the same types, or no types in common. */
11151115

11161116
if (s1.bitSet().equals(s2.bitSet())) {
@@ -1126,7 +1126,7 @@ private static TypeState doSubtraction0(PointsToAnalysis bb, ContextSensitiveMul
11261126
return doSubtraction1(bb, s1, s2, resultCanBeNull);
11271127
}
11281128

1129-
private static TypeState doSubtraction1(PointsToAnalysis bb, ContextSensitiveMultiTypeState s1, ContextSensitiveMultiTypeState s2, boolean resultCanBeNull) {
1129+
private TypeState doSubtraction1(PointsToAnalysis bb, ContextSensitiveMultiTypeState s1, ContextSensitiveMultiTypeState s2, boolean resultCanBeNull) {
11301130
/*
11311131
* Speculate that s1 and s2 have no overlap, i.e., they don't have any objects in common. In
11321132
* that case, the result is just s1.
@@ -1162,7 +1162,7 @@ private static TypeState doSubtraction1(PointsToAnalysis bb, ContextSensitiveMul
11621162
return doSubtraction2(bb, s1, s2, resultCanBeNull, idx1, idx2);
11631163
}
11641164

1165-
private static TypeState doSubtraction2(PointsToAnalysis bb, ContextSensitiveMultiTypeState s1, ContextSensitiveMultiTypeState s2, boolean resultCanBeNull, int idx1Param, int idx2Param) {
1165+
private TypeState doSubtraction2(PointsToAnalysis bb, ContextSensitiveMultiTypeState s1, ContextSensitiveMultiTypeState s2, boolean resultCanBeNull, int idx1Param, int idx2Param) {
11661166
try (ListUtils.UnsafeArrayListClosable<AnalysisObject> tlArrayClosable = ListUtils.getTLArrayList(intersectionArrayListTL, 256)) {
11671167
ListUtils.UnsafeArrayList<AnalysisObject> resultObjects = tlArrayClosable.list();
11681168

@@ -1207,14 +1207,14 @@ private static TypeState doSubtraction2(PointsToAnalysis bb, ContextSensitiveMul
12071207

12081208
if (TypeStateUtils.holdsSingleTypeState(objects, totalLength)) {
12091209
/* Multiple objects of the same type. */
1210-
return new ContextSensitiveSingleTypeState(bb, resultCanBeNull, objects[0].type(), objects);
1210+
return singleTypeState(bb, resultCanBeNull, objects[0].type(), objects);
12111211
} else {
12121212
BitSet resultTypesBitSet = TypeStateUtils.andNot(s1.bitSet(), s2.bitSet());
12131213
/*
12141214
* Don't need to check if the result is close-to-all-instantiated since result
12151215
* <= s1.
12161216
*/
1217-
return new ContextSensitiveMultiTypeState(bb, resultCanBeNull, resultTypesBitSet, resultTypesBitSet.cardinality(), objects);
1217+
return multiTypeState(bb, resultCanBeNull, resultTypesBitSet, resultTypesBitSet.cardinality(), objects);
12181218
}
12191219
}
12201220
}

0 commit comments

Comments
 (0)