# HG changeset patch # User Stefan Anzinger # Date 1430238916 -7200 # Node ID 7a62f41ed61081faa758480357063b9256ee6b30 # Parent fb2b2741834746c078fdae7ceee4b1981ba52f61# Parent a5faa9aafc8031075ef187bf8f136331731c4659 Merge diff -r a5faa9aafc80 -r 7a62f41ed610 graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java --- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Tue Apr 28 13:08:22 2015 +0200 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Tue Apr 28 18:35:16 2015 +0200 @@ -90,6 +90,10 @@ @Override public boolean canInlineConstant(JavaConstant c) { switch (c.getKind()) { + case Boolean: + case Byte: + case Char: + case Short: case Int: return SPARCAssembler.isSimm13(c.asInt()) && !getCodeCache().needsDataPatch(c); case Long: @@ -217,7 +221,7 @@ @Override public void emitCompareBranch(PlatformKind cmpKind, Value x, Value y, Condition cond, boolean unorderedIsTrue, LabelRef trueDestination, LabelRef falseDestination, double trueDestinationProbability) { - Variable left; + Value left; Value right; Condition actualCondition; if (isConstant(x)) { @@ -230,8 +234,20 @@ actualCondition = cond; } SPARCCompare opcode; - Kind kind = left.getKind().getStackKind(); - switch (kind) { + Kind actualCmpKind = (Kind) cmpKind; + switch (actualCmpKind) { + case Byte: + left = emitSignExtend(left, 8, 32); + right = emitSignExtend(right, 8, 32); + actualCmpKind = Kind.Int; + opcode = ICMP; + break; + case Short: + left = emitSignExtend(left, 16, 32); + right = emitSignExtend(right, 16, 32); + actualCmpKind = Kind.Int; + opcode = ICMP; + break; case Object: opcode = ACMP; break; @@ -239,9 +255,6 @@ opcode = LCMP; break; case Int: - case Short: - case Char: - case Byte: opcode = ICMP; break; case Float: @@ -251,9 +264,9 @@ opcode = DCMP; break; default: - throw GraalInternalError.shouldNotReachHere(kind.toString()); + throw GraalInternalError.shouldNotReachHere(actualCmpKind.toString()); } - append(new SPARCControlFlow.CompareBranchOp(opcode, left, right, actualCondition, trueDestination, falseDestination, kind, unorderedIsTrue, trueDestinationProbability)); + append(new SPARCControlFlow.CompareBranchOp(opcode, left, right, actualCondition, trueDestination, falseDestination, actualCmpKind, unorderedIsTrue, trueDestinationProbability)); } @Override diff -r a5faa9aafc80 -r 7a62f41ed610 graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_ifeq.java --- a/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_ifeq.java Tue Apr 28 13:08:22 2015 +0200 +++ b/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_ifeq.java Tue Apr 28 18:35:16 2015 +0200 @@ -55,4 +55,101 @@ runTest("test", 1); } + @Test + public void run3() { + runTest("testb", 0xff); + } + + /** + * Tests if the if does work properly on byte stamp. + */ + public static int testb(int b) { + byte x = (byte) b; + int y = x & 0xff; + if (y == 0xff) { + // Just do anything else to force jump instead of conditional move + y = (int) (System.currentTimeMillis() >> 32); + } + return y; + } + + @Test + public void run4() { + runTest("tests", 0xffff); + } + + /** + * Tests if the if does work properly on short stamp. + */ + public static int tests(int b) { + short x = (short) b; + int y = x & 0xffff; + if (y == 0xffff) { + // Just do anything else to force jump instead of conditional move + y = (int) (System.currentTimeMillis() >> 32); + } + return y; + } + + @Test + public void run5() { + runTest("testc", 0xffff); + } + + /** + * Tests if the if does work properly on char stamp (boils down to short, just to cover all the + * java types). + */ + public static int testc(int b) { + char x = (char) b; + int y = x & 0xffff; + if (y == 0xffff) { + // Just do anything else to force jump instead of conditional move + y = (int) (System.currentTimeMillis() >> 32); + } + return y; + } + + // the same with conditional move + @Test + public void run6() { + runTest("testCondb", 0xff); + } + + /** + * Tests if the if does work properly on byte stamp. + */ + public static boolean testCondb(int b) { + byte x = (byte) b; + int y = x & 0xff; + return y == 0xff; + } + + @Test + public void run7() { + runTest("testConds", 0xffff); + } + + /** + * Tests if the if does work properly on short stamp. + */ + public static boolean testConds(int b) { + short x = (short) b; + int y = x & 0xffff; + return y == 0xffff; + } + + @Test + public void run8() { + runTest("testCondc", 0xffff); + } + + /** + * Tests if the if does work properly on char type. + */ + public static boolean testCondc(int b) { + char x = (char) b; + int y = x & 0xffff; + return y == 0xffff; + } } diff -r a5faa9aafc80 -r 7a62f41ed610 graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCCompare.java --- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCCompare.java Tue Apr 28 13:08:22 2015 +0200 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCCompare.java Tue Apr 28 18:35:16 2015 +0200 @@ -33,6 +33,7 @@ import com.oracle.graal.compiler.common.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.asm.*; +import com.oracle.graal.lir.sparc.SPARCControlFlow.CompareBranchOp; public enum SPARCCompare { ICMP, @@ -63,11 +64,11 @@ @Override public void verify() { super.verify(); + assert CompareBranchOp.SUPPORTED_KINDS.contains(x.getKind()) : x.getKind(); + assert x.getKind().equals(y.getKind()) : x + " " + y; // @formatter:off - assert (name().startsWith("I") && - (!(x.getKind() == Kind.Int) || y.getKind().getStackKind() == Kind.Int) && - (!(x.getKind() == Kind.Short) || y.getKind().getStackKind() == Kind.Int) && - (!(x.getKind() == Kind.Byte) || y.getKind().getStackKind() == Kind.Int)) || + assert + (name().startsWith("I") && x.getKind() == Kind.Int && y.getKind().getStackKind() == Kind.Int) || (name().startsWith("L") && x.getKind() == Kind.Long && y.getKind() == Kind.Long) || (name().startsWith("A") && x.getKind() == Kind.Object && y.getKind() == Kind.Object) || (name().startsWith("F") && x.getKind() == Kind.Float && y.getKind() == Kind.Float) || diff -r a5faa9aafc80 -r 7a62f41ed610 graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java --- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java Tue Apr 28 13:08:22 2015 +0200 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java Tue Apr 28 18:35:16 2015 +0200 @@ -31,6 +31,8 @@ import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*; import static com.oracle.graal.sparc.SPARC.*; +import java.util.*; + import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.asm.*; @@ -75,6 +77,7 @@ public static final class CompareBranchOp extends SPARCLIRInstruction implements BlockEndOp, SPARCDelayedControlTransfer { public static final LIRInstructionClass TYPE = LIRInstructionClass.create(CompareBranchOp.class); + static final EnumSet SUPPORTED_KINDS = EnumSet.of(Kind.Long, Kind.Int, Kind.Object, Kind.Float, Kind.Double); private final SPARCCompare opcode; @Use({REG}) protected Value x; @@ -231,9 +234,6 @@ private static void emitCBCond(SPARCMacroAssembler masm, Value actualX, Value actualY, Label actualTrueTarget, ConditionFlag conditionFlag) { switch ((Kind) actualX.getLIRKind().getPlatformKind()) { - case Byte: - case Char: - case Short: case Int: if (isConstant(actualY)) { int constantY = asConstant(actualY).asInt(); @@ -269,9 +269,6 @@ return false; } switch ((Kind) x.getPlatformKind()) { - case Byte: - case Char: - case Short: case Int: case Long: case Object: @@ -319,6 +316,13 @@ emitted = false; delaySlotPosition = -1; } + + @Override + public void verify() { + super.verify(); + assert SUPPORTED_KINDS.contains(kind) : kind; + assert x.getKind().equals(kind) && y.getKind().equals(kind) : x + " " + y; + } } public static final class BranchOp extends SPARCLIRInstruction implements StandardOp.BranchOp { @@ -342,6 +346,11 @@ public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) { emitBranch(crb, masm, kind, conditionFlag, trueDestination, falseDestination, true, trueDestinationProbability); } + + @Override + public void verify() { + assert CompareBranchOp.SUPPORTED_KINDS.contains(kind); + } } private static boolean emitBranch(CompilationResultBuilder crb, SPARCMacroAssembler masm, Kind kind, ConditionFlag conditionFlag, LabelRef trueDestination, LabelRef falseDestination, diff -r a5faa9aafc80 -r 7a62f41ed610 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Tue Apr 28 13:08:22 2015 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Tue Apr 28 18:35:16 2015 +0200 @@ -52,6 +52,8 @@ import com.oracle.graal.nodes.StructuredGraph.AllowAssumptions; import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.options.*; +import com.oracle.graal.options.OptionValue.OverrideScope; import com.oracle.graal.phases.*; import com.oracle.graal.phases.common.*; import com.oracle.graal.phases.tiers.*; @@ -446,7 +448,9 @@ * @param frameStateProcessing controls how {@link FrameState FrameStates} should be handled. */ public StructuredGraph makeGraph(ResolvedJavaMethod method, Object[] args, ResolvedJavaMethod original, FrameStateProcessing frameStateProcessing) { - return createGraphMaker(method, original, frameStateProcessing).makeGraph(args); + try (OverrideScope s = OptionValue.override(DeoptALot, false)) { + return createGraphMaker(method, original, frameStateProcessing).makeGraph(args); + } } /**