107
107
import jdk .graal .compiler .nodes .calc .ConditionalNode ;
108
108
import jdk .graal .compiler .nodes .calc .FloatEqualsNode ;
109
109
import jdk .graal .compiler .nodes .calc .FloatLessThanNode ;
110
+ import jdk .graal .compiler .nodes .calc .IntegerBelowNode ;
110
111
import jdk .graal .compiler .nodes .calc .IntegerEqualsNode ;
111
112
import jdk .graal .compiler .nodes .calc .IntegerLowerThanNode ;
112
113
import jdk .graal .compiler .nodes .calc .IntegerTestNode ;
@@ -1028,7 +1029,7 @@ public TypeFlowBuilder<?> lookup(ValueNode n) {
1028
1029
var y = lookup (equalsNode .getY ());
1029
1030
var type = getNodeType (equalsNode );
1030
1031
result = TypeFlowBuilder .create (bb , method , getPredicate (), node , BooleanPrimitiveCheckTypeFlow .class , () -> {
1031
- var flow = new BooleanPrimitiveCheckTypeFlow (AbstractAnalysisEngine .sourcePosition (node ), type , x .get (), y .get (), PrimitiveComparison .EQ );
1032
+ var flow = new BooleanPrimitiveCheckTypeFlow (AbstractAnalysisEngine .sourcePosition (node ), type , x .get (), y .get (), PrimitiveComparison .EQ , false );
1032
1033
flowsGraph .addMiscEntryFlow (flow );
1033
1034
return flow ;
1034
1035
});
@@ -1037,9 +1038,10 @@ public TypeFlowBuilder<?> lookup(ValueNode n) {
1037
1038
} else if (node instanceof IntegerLowerThanNode lowerThan ) {
1038
1039
var x = lookup (lowerThan .getX ());
1039
1040
var y = lookup (lowerThan .getY ());
1041
+ var isUnsigned = lowerThan instanceof IntegerBelowNode ;
1040
1042
var type = getNodeType (lowerThan );
1041
1043
result = TypeFlowBuilder .create (bb , method , getPredicate (), node , BooleanPrimitiveCheckTypeFlow .class , () -> {
1042
- var flow = new BooleanPrimitiveCheckTypeFlow (AbstractAnalysisEngine .sourcePosition (node ), type , x .get (), y .get (), PrimitiveComparison .LT );
1044
+ var flow = new BooleanPrimitiveCheckTypeFlow (AbstractAnalysisEngine .sourcePosition (node ), type , x .get (), y .get (), PrimitiveComparison .LT , isUnsigned );
1043
1045
flowsGraph .addMiscEntryFlow (flow );
1044
1046
return flow ;
1045
1047
});
@@ -1311,7 +1313,7 @@ private TypeFlowBuilder<?> uniqueReturnFlowBuilder(ReturnNode node) {
1311
1313
return returnBuilder ;
1312
1314
}
1313
1315
1314
- private void handleCompareNode (ValueNode source , CompareNode condition , PrimitiveComparison comparison ) {
1316
+ private void handleCompareNode (ValueNode source , CompareNode condition , PrimitiveComparison comparison , boolean isUnsigned ) {
1315
1317
var xNode = typeFlowUnproxify (condition .getX ());
1316
1318
var yNode = typeFlowUnproxify (condition .getY ());
1317
1319
var xConstant = xNode .isConstant ();
@@ -1320,7 +1322,7 @@ private void handleCompareNode(ValueNode source, CompareNode condition, Primitiv
1320
1322
var yFlow = state .lookup (yNode );
1321
1323
if (!xConstant ) {
1322
1324
var leftFlowBuilder = TypeFlowBuilder .create (bb , method , state .getPredicate (), source , PrimitiveFilterTypeFlow .class , () -> {
1323
- var flow = new PrimitiveFilterTypeFlow (AbstractAnalysisEngine .sourcePosition (source ), xFlow .get ().declaredType , xFlow .get (), yFlow .get (), comparison );
1325
+ var flow = new PrimitiveFilterTypeFlow (AbstractAnalysisEngine .sourcePosition (source ), xFlow .get ().declaredType , xFlow .get (), yFlow .get (), comparison , isUnsigned );
1324
1326
if (yConstant ) {
1325
1327
flowsGraph .addNodeFlow (source , flow );
1326
1328
}
@@ -1334,7 +1336,7 @@ private void handleCompareNode(ValueNode source, CompareNode condition, Primitiv
1334
1336
}
1335
1337
if (!yConstant ) {
1336
1338
var rightFlowBuilder = TypeFlowBuilder .create (bb , method , state .getPredicate (), source , PrimitiveFilterTypeFlow .class , () -> {
1337
- var flow = new PrimitiveFilterTypeFlow (AbstractAnalysisEngine .sourcePosition (source ), yFlow .get ().declaredType , yFlow .get (), xFlow .get (), comparison .flip ());
1339
+ var flow = new PrimitiveFilterTypeFlow (AbstractAnalysisEngine .sourcePosition (source ), yFlow .get ().declaredType , yFlow .get (), xFlow .get (), comparison .flip (), isUnsigned );
1338
1340
flowsGraph .addNodeFlow (source , flow );
1339
1341
return flow ;
1340
1342
@@ -1359,9 +1361,10 @@ private void handleUnaryOpLogicNode(UnaryOpLogicNode condition, TypeFlowBuilder<
1359
1361
private void handleCondition (ValueNode source , LogicNode condition , boolean isTrue ) {
1360
1362
if (state .usePredicates ()) {
1361
1363
if (condition instanceof IntegerLowerThanNode lowerThan ) {
1362
- handleCompareNode (source , lowerThan , isTrue ? PrimitiveComparison .LT : PrimitiveComparison .GE );
1364
+ var isUnsigned = lowerThan instanceof IntegerBelowNode ;
1365
+ handleCompareNode (source , lowerThan , isTrue ? PrimitiveComparison .LT : PrimitiveComparison .GE , isUnsigned );
1363
1366
} else if (condition instanceof IntegerEqualsNode equalsNode ) {
1364
- handleCompareNode (source , equalsNode , isTrue ? PrimitiveComparison .EQ : PrimitiveComparison .NEQ );
1367
+ handleCompareNode (source , equalsNode , isTrue ? PrimitiveComparison .EQ : PrimitiveComparison .NEQ , false );
1365
1368
}
1366
1369
}
1367
1370
if (condition instanceof IsNullNode nullCheck ) {
0 commit comments