51 } 52 53 @Override 54 public ValueNode canonical(CanonicalizerTool tool, ValueNode forX, ValueNode forY) { 55 if (forX.isConstant() && forY.isConstant()) { 56 return LogicConstantNode.forBoolean((forX.asJavaConstant().asLong() & forY.asJavaConstant().asLong()) == 0); 57 } 58 if (forX.stamp() instanceof IntegerStamp && forY.stamp() instanceof IntegerStamp) { 59 IntegerStamp xStamp = (IntegerStamp) forX.stamp(); 60 IntegerStamp yStamp = (IntegerStamp) forY.stamp(); 61 if ((xStamp.upMask() & yStamp.upMask()) == 0) { 62 return LogicConstantNode.tautology(); 63 } else if ((xStamp.downMask() & yStamp.downMask()) != 0) { 64 return LogicConstantNode.contradiction(); 65 } 66 } 67 return this; 68 } 69 70 @Override 71 public Stamp getSucceedingStampForX(boolean negated) { 72 Stamp xStampGeneric = this.getX().stamp(); 73 Stamp yStampGeneric = this.getY().stamp(); 74 return getSucceedingStamp(negated, xStampGeneric, yStampGeneric); 75 } 76 77 private static Stamp getSucceedingStamp(boolean negated, Stamp xStampGeneric, Stamp otherStampGeneric) { 78 if (xStampGeneric instanceof IntegerStamp && otherStampGeneric instanceof IntegerStamp) { 79 IntegerStamp xStamp = (IntegerStamp) xStampGeneric; 80 IntegerStamp otherStamp = (IntegerStamp) otherStampGeneric; 81 if (negated) { 82 if (Long.bitCount(otherStamp.upMask()) == 1) { 83 long newDownMask = xStamp.downMask() | otherStamp.upMask(); 84 if (xStamp.downMask() != newDownMask) { 85 return IntegerStamp.stampForMask(xStamp.getBits(), newDownMask, xStamp.upMask()).join(xStamp); 86 } 87 } 88 } else { 89 long restrictedUpMask = ((~otherStamp.downMask()) & xStamp.upMask()); 90 if (xStamp.upMask() != restrictedUpMask) { 91 return IntegerStamp.stampForMask(xStamp.getBits(), xStamp.downMask(), restrictedUpMask).join(xStamp); 92 } 93 } 94 } 95 return null; 96 } 97 98 @Override 99 public Stamp getSucceedingStampForY(boolean negated) { 100 Stamp xStampGeneric = this.getX().stamp(); 101 Stamp yStampGeneric = this.getY().stamp(); 102 return getSucceedingStamp(negated, yStampGeneric, xStampGeneric); 103 } 104 105 @Override 106 public TriState tryFold(Stamp xStampGeneric, Stamp yStampGeneric) { 107 if (xStampGeneric instanceof IntegerStamp && yStampGeneric instanceof IntegerStamp) { 108 IntegerStamp xStamp = (IntegerStamp) xStampGeneric; 109 IntegerStamp yStamp = (IntegerStamp) yStampGeneric; 110 if ((xStamp.upMask() & yStamp.upMask()) == 0) { 111 return TriState.TRUE; 112 } else if ((xStamp.downMask() & yStamp.downMask()) != 0) { 113 return TriState.FALSE; 114 } 115 } 116 return TriState.UNKNOWN; 117 } 118 } | 51 } 52 53 @Override 54 public ValueNode canonical(CanonicalizerTool tool, ValueNode forX, ValueNode forY) { 55 if (forX.isConstant() && forY.isConstant()) { 56 return LogicConstantNode.forBoolean((forX.asJavaConstant().asLong() & forY.asJavaConstant().asLong()) == 0); 57 } 58 if (forX.stamp() instanceof IntegerStamp && forY.stamp() instanceof IntegerStamp) { 59 IntegerStamp xStamp = (IntegerStamp) forX.stamp(); 60 IntegerStamp yStamp = (IntegerStamp) forY.stamp(); 61 if ((xStamp.upMask() & yStamp.upMask()) == 0) { 62 return LogicConstantNode.tautology(); 63 } else if ((xStamp.downMask() & yStamp.downMask()) != 0) { 64 return LogicConstantNode.contradiction(); 65 } 66 } 67 return this; 68 } 69 70 @Override 71 public Stamp getSucceedingStampForX(boolean negated, Stamp xStamp, Stamp yStamp) { 72 return getSucceedingStamp(negated, xStamp, yStamp); 73 } 74 75 private static Stamp getSucceedingStamp(boolean negated, Stamp xStampGeneric, Stamp otherStampGeneric) { 76 if (xStampGeneric instanceof IntegerStamp && otherStampGeneric instanceof IntegerStamp) { 77 IntegerStamp xStamp = (IntegerStamp) xStampGeneric; 78 IntegerStamp otherStamp = (IntegerStamp) otherStampGeneric; 79 if (negated) { 80 if (Long.bitCount(otherStamp.upMask()) == 1) { 81 long newDownMask = xStamp.downMask() | otherStamp.upMask(); 82 if (xStamp.downMask() != newDownMask) { 83 return IntegerStamp.stampForMask(xStamp.getBits(), newDownMask, xStamp.upMask()).join(xStamp); 84 } 85 } 86 } else { 87 long restrictedUpMask = ((~otherStamp.downMask()) & xStamp.upMask()); 88 if (xStamp.upMask() != restrictedUpMask) { 89 return IntegerStamp.stampForMask(xStamp.getBits(), xStamp.downMask(), restrictedUpMask).join(xStamp); 90 } 91 } 92 } 93 return null; 94 } 95 96 @Override 97 public Stamp getSucceedingStampForY(boolean negated, Stamp xStamp, Stamp yStamp) { 98 return getSucceedingStamp(negated, yStamp, xStamp); 99 } 100 101 @Override 102 public TriState tryFold(Stamp xStampGeneric, Stamp yStampGeneric) { 103 if (xStampGeneric instanceof IntegerStamp && yStampGeneric instanceof IntegerStamp) { 104 IntegerStamp xStamp = (IntegerStamp) xStampGeneric; 105 IntegerStamp yStamp = (IntegerStamp) yStampGeneric; 106 if ((xStamp.upMask() & yStamp.upMask()) == 0) { 107 return TriState.TRUE; 108 } else if ((xStamp.downMask() & yStamp.downMask()) != 0) { 109 return TriState.FALSE; 110 } 111 } 112 return TriState.UNKNOWN; 113 } 114 } |