< prev index next >
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/CompareNode.java
Print this page
rev 52509 : [mq]: graal2
*** 1,7 ****
/*
! * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,7 ----
/*
! * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 134,153 ****
ConvertNode convertY = (ConvertNode) forY;
if (convertX.preservesOrder(condition) && convertY.preservesOrder(condition) && convertX.getValue().stamp(view).isCompatible(convertY.getValue().stamp(view))) {
boolean supported = true;
if (convertX.getValue().stamp(view) instanceof IntegerStamp) {
IntegerStamp intStamp = (IntegerStamp) convertX.getValue().stamp(view);
! supported = smallestCompareWidth != null && intStamp.getBits() >= smallestCompareWidth;
}
if (supported) {
! boolean multiUsage = (convertX.asNode().hasMoreThanOneUsage() || convertY.asNode().hasMoreThanOneUsage());
! if ((forX instanceof ZeroExtendNode || forX instanceof SignExtendNode) && multiUsage) {
! // Do not perform for zero or sign extend if there are multiple usages
! // of the value.
return null;
}
return duplicateModified(convertX.getValue(), convertY.getValue(), unorderedIsTrue, view);
}
}
}
return null;
--- 134,176 ----
ConvertNode convertY = (ConvertNode) forY;
if (convertX.preservesOrder(condition) && convertY.preservesOrder(condition) && convertX.getValue().stamp(view).isCompatible(convertY.getValue().stamp(view))) {
boolean supported = true;
if (convertX.getValue().stamp(view) instanceof IntegerStamp) {
IntegerStamp intStamp = (IntegerStamp) convertX.getValue().stamp(view);
! boolean isConversionCompatible = convertX.getClass() == convertY.getClass();
! supported = smallestCompareWidth != null && intStamp.getBits() >= smallestCompareWidth && isConversionCompatible;
}
if (supported) {
!
! ValueNode xValue = convertX.getValue();
! ValueNode yValue = convertY.getValue();
!
! if (forX instanceof ZeroExtendNode || forX instanceof SignExtendNode) {
!
! int introducedUsages = 0;
! int eliminatedNodes = 0;
!
! if (convertX.asNode().hasExactlyOneUsage()) {
! eliminatedNodes++;
! } else if (xValue.hasExactlyOneUsage()) {
! introducedUsages++;
! }
!
! if (convertY.asNode().hasExactlyOneUsage()) {
! eliminatedNodes++;
! } else if (yValue.hasExactlyOneUsage()) {
! introducedUsages++;
! }
!
! if (introducedUsages > eliminatedNodes) {
! // Only perform the optimization if there is
! // a good trade-off between introduced new usages and
! // eliminated nodes.
return null;
}
+ }
return duplicateModified(convertX.getValue(), convertY.getValue(), unorderedIsTrue, view);
}
}
}
return null;
*** 173,183 ****
}
boolean supported = true;
if (convert.getValue().stamp(view) instanceof IntegerStamp) {
IntegerStamp intStamp = (IntegerStamp) convert.getValue().stamp(view);
! supported = smallestCompareWidth != null && intStamp.getBits() > smallestCompareWidth;
}
if (supported) {
ConstantNode newConstant = canonicalConvertConstant(constantReflection, metaAccess, options, condition, convert, constant, view);
if (newConstant != null) {
--- 196,206 ----
}
boolean supported = true;
if (convert.getValue().stamp(view) instanceof IntegerStamp) {
IntegerStamp intStamp = (IntegerStamp) convert.getValue().stamp(view);
! supported = smallestCompareWidth != null && intStamp.getBits() >= smallestCompareWidth;
}
if (supported) {
ConstantNode newConstant = canonicalConvertConstant(constantReflection, metaAccess, options, condition, convert, constant, view);
if (newConstant != null) {
< prev index next >