changeset 14157:8c4a3d9308a7

fixed FindBugs bugs
author twisti
date Wed, 12 Mar 2014 12:40:45 -0700
parents 7668297a2e67
children 92e34e6121ac fd7fcd2d2072
files graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/Assumptions.java graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/DebugInfo.java graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/Register.java graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/VirtualObject.java graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/AbstractJavaProfile.java graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ExceptionHandler.java graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Value.java graal/com.oracle.graal.asm.ptx/src/com/oracle/graal/asm/ptx/PTXAssembler.java graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScanWalker.java graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java graal/com.oracle.graal.debug/src/com/oracle/graal/debug/internal/DebugHistogramAsciiPrinter.java graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/ForEachToGraal.java graal/com.oracle.graal.hotspot.ptx/src/com/oracle/graal/hotspot/ptx/PTXHotSpotBackend.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompilationTask.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/debug/BenchmarkCounters.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotForeignCallsProviderImpl.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphCache.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMetaAccessProvider.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotNmethod.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedPrimitiveType.java graal/com.oracle.graal.java.decompiler/src/com/oracle/graal/java/decompiler/Decompiler.java graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeDisassembler.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerTestNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java graal/com.oracle.graal.options/src/com/oracle/graal/options/OptionProcessor.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ValueAnchorCleanupPhase.java graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ComputeProbabilityClosure.java graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/MergeableState.java graal/com.oracle.graal.printer/src/com/oracle/graal/printer/GraphPrinterDumpHandler.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StringSubstitutions.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleDebugJavaMethod.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleExpansionLogger.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PEReadEliminationBlockState.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/ReadEliminationBlockState.java mx/projects
diffstat 40 files changed, 118 insertions(+), 83 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/Assumptions.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/Assumptions.java	Wed Mar 12 12:40:45 2014 -0700
@@ -197,8 +197,8 @@
 
         @Override
         public boolean equals(Object obj) {
-            if (obj instanceof ConcreteMethod) {
-                ConcreteMethod other = (ConcreteMethod) obj;
+            if (obj instanceof MethodContents) {
+                MethodContents other = (MethodContents) obj;
                 return other.method == method;
             }
             return false;
@@ -387,7 +387,7 @@
             }
         }
 
-        out.printf("%d assumptions:\n", nonNullList.size());
+        out.printf("%d assumptions:%n", nonNullList.size());
         for (Assumption a : nonNullList) {
             out.println(a.toString());
         }
--- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/DebugInfo.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/DebugInfo.java	Wed Mar 12 12:40:45 2014 -0700
@@ -22,8 +22,6 @@
  */
 package com.oracle.graal.api.code;
 
-import java.io.*;
-
 /**
  * Represents the debugging information for a particular point of execution. This information
  * includes:
@@ -35,9 +33,7 @@
  * <li>a map from the registers (in the caller's frame) to the slots where they are saved in the
  * current frame</li>
  */
-public class DebugInfo implements Serializable {
-
-    private static final long serialVersionUID = -6047206624915812516L;
+public class DebugInfo {
 
     private final BytecodePosition bytecodePosition;
     private final ReferenceMap referenceMap;
--- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/Register.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/Register.java	Wed Mar 12 12:40:45 2014 -0700
@@ -22,16 +22,12 @@
  */
 package com.oracle.graal.api.code;
 
-import java.io.*;
-
 import com.oracle.graal.api.meta.*;
 
 /**
  * Represents a target machine register.
  */
-public final class Register implements Comparable<Register>, Serializable {
-
-    private static final long serialVersionUID = -7213269157816016300L;
+public final class Register implements Comparable<Register> {
 
     public static final RegisterCategory SPECIAL = new RegisterCategory("SPECIAL");
 
--- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/VirtualObject.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/VirtualObject.java	Wed Mar 12 12:40:45 2014 -0700
@@ -87,7 +87,7 @@
                         }
                     } else {
                         ResolvedJavaField[] fields = vo.type.getInstanceFields(true);
-                        assert fields.length == vo.values.length : vo.type + ", fields=" + Arrays.toString(fields) + ", values=" + vo.values;
+                        assert fields.length == vo.values.length : vo.type + ", fields=" + Arrays.toString(fields) + ", values=" + Arrays.toString(vo.values);
                         for (int i = 0; i < vo.values.length; i++) {
                             if (i != 0) {
                                 buf.append(',');
--- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/AbstractJavaProfile.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/AbstractJavaProfile.java	Wed Mar 12 12:40:45 2014 -0700
@@ -43,7 +43,7 @@
 
     public AbstractJavaProfile(double notRecordedProbability, T[] pitems) {
         this.pitems = pitems;
-        assert notRecordedProbability != Double.NaN;
+        assert !Double.isNaN(notRecordedProbability);
         this.notRecordedProbability = notRecordedProbability;
         assert isSorted();
     }
@@ -124,28 +124,26 @@
     }
 
     @Override
-    public boolean equals(Object other) {
-        if (other == this) {
+    public boolean equals(Object obj) {
+        if (obj == this) {
             return true;
         }
-        if (getClass() == other.getClass()) {
-            AbstractJavaProfile javaTypeProfile = (AbstractJavaProfile) other;
-            if (javaTypeProfile.notRecordedProbability != notRecordedProbability) {
+        if (!(obj instanceof AbstractJavaProfile)) {
+            return false;
+        }
+        AbstractJavaProfile that = (AbstractJavaProfile) obj;
+        if (that.notRecordedProbability != notRecordedProbability) {
+            return false;
+        }
+        if (that.pitems.length != pitems.length) {
+            return false;
+        }
+        for (int i = 0; i < pitems.length; ++i) {
+            if (!pitems[i].equals(that.pitems[i])) {
                 return false;
             }
-            if (javaTypeProfile.pitems.length != pitems.length) {
-                return false;
-            }
-
-            for (int i = 0; i < pitems.length; ++i) {
-                if (!pitems[i].equals(javaTypeProfile.pitems[i])) {
-                    return false;
-                }
-            }
-
-            return true;
         }
-        return false;
+        return true;
     }
 
     @Override
--- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ExceptionHandler.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ExceptionHandler.java	Wed Mar 12 12:40:45 2014 -0700
@@ -97,6 +97,9 @@
 
     @Override
     public boolean equals(Object obj) {
+        if (!(obj instanceof ExceptionHandler)) {
+            return false;
+        }
         ExceptionHandler that = (ExceptionHandler) obj;
         if (this.startBCI != that.startBCI || this.endBCI != that.endBCI || this.handlerBCI != that.handlerBCI || this.catchTypeCPI != that.catchTypeCPI) {
             return false;
--- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Value.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Value.java	Wed Mar 12 12:40:45 2014 -0700
@@ -87,8 +87,8 @@
     @Override
     public boolean equals(Object obj) {
         if (obj instanceof Value) {
-            Value other = (Value) obj;
-            return kind.equals(other.kind) && platformKind.equals(platformKind);
+            Value that = (Value) obj;
+            return kind.equals(that.kind) && platformKind.equals(that.platformKind);
         }
         return false;
     }
--- a/graal/com.oracle.graal.asm.ptx/src/com/oracle/graal/asm/ptx/PTXAssembler.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.asm.ptx/src/com/oracle/graal/asm/ptx/PTXAssembler.java	Wed Mar 12 12:40:45 2014 -0700
@@ -698,9 +698,6 @@
     @Override
     public void jmp(Label l) {
         String str = nameOf(l);
-        if (l.equals("?")) {
-            Thread.dumpStack();
-        }
         bra(str);
     }
 
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScanWalker.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScanWalker.java	Wed Mar 12 12:40:45 2014 -0700
@@ -413,8 +413,8 @@
 
             Debug.log("splitting at position %d", optimalSplitPos);
 
-            assert allocator.isBlockBegin(optimalSplitPos) || (optimalSplitPos % 2 == 1) : "split pos must be odd when not on block boundary";
-            assert !allocator.isBlockBegin(optimalSplitPos) || (optimalSplitPos % 2 == 0) : "split pos must be even on block boundary";
+            assert allocator.isBlockBegin(optimalSplitPos) || ((optimalSplitPos & 1) == 1) : "split pos must be odd when not on block boundary";
+            assert !allocator.isBlockBegin(optimalSplitPos) || ((optimalSplitPos & 1) == 0) : "split pos must be even on block boundary";
 
             Interval splitPart = interval.split(optimalSplitPos, allocator);
 
@@ -493,8 +493,8 @@
             }
 
             try (Indent indent2 = Debug.logAndIndent("splitting at position %d", optimalSplitPos)) {
-                assert allocator.isBlockBegin(optimalSplitPos) || (optimalSplitPos % 2 == 1) : "split pos must be odd when not on block boundary";
-                assert !allocator.isBlockBegin(optimalSplitPos) || (optimalSplitPos % 2 == 0) : "split pos must be even on block boundary";
+                assert allocator.isBlockBegin(optimalSplitPos) || ((optimalSplitPos & 1) == 1) : "split pos must be odd when not on block boundary";
+                assert !allocator.isBlockBegin(optimalSplitPos) || ((optimalSplitPos & 1) == 0) : "split pos must be even on block boundary";
 
                 Interval spilledPart = interval.split(optimalSplitPos, allocator);
                 allocator.assignSpillSlot(spilledPart);
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java	Wed Mar 12 12:40:45 2014 -0700
@@ -56,9 +56,6 @@
         FrameState current = topState;
         do {
             for (EscapeObjectState state : current.virtualObjectMappings()) {
-                if (objectStates == null) {
-                    objectStates = new IdentityHashMap<>();
-                }
                 if (!objectStates.containsKey(state.object())) {
                     if (!(state instanceof MaterializedObjectState) || ((MaterializedObjectState) state).materializedValue() != state.object()) {
                         objectStates.put(state.object(), state);
--- a/graal/com.oracle.graal.debug/src/com/oracle/graal/debug/internal/DebugHistogramAsciiPrinter.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.debug/src/com/oracle/graal/debug/internal/DebugHistogramAsciiPrinter.java	Wed Mar 12 12:40:45 2014 -0700
@@ -62,7 +62,7 @@
     public void print(DebugHistogram histogram) {
         List<CountedValue> list = histogram.getValues();
         if (list.isEmpty()) {
-            os.printf("%s is empty.\n", histogram.getName());
+            os.printf("%s is empty.%n", histogram.getName());
             return;
         }
 
@@ -73,7 +73,7 @@
         }
 
         // Print header.
-        os.printf("%s has %d unique elements and %d total elements:\n", histogram.getName(), list.size(), total);
+        os.printf("%s has %d unique elements and %d total elements:%n", histogram.getName(), list.size(), total);
 
         int max = list.get(0).getCount();
         final int lineSize = nameSize + NumberSize + barSize + 10;
@@ -96,6 +96,6 @@
     private static void printLine(PrintStream printStream, char c, int lineSize) {
         char[] charArr = new char[lineSize];
         Arrays.fill(charArr, c);
-        printStream.printf("%s\n", new String(charArr));
+        printStream.printf("%s%n", new String(charArr));
     }
 }
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Wed Mar 12 12:40:45 2014 -0700
@@ -535,18 +535,22 @@
     }
 
     private void maybeNotifyChanged(Node usage) {
-        assert graph == null || !graph.isFrozen();
-        NodeChangedListener listener = graph.inputChangedListener;
-        if (listener != null) {
-            listener.nodeChanged(usage);
+        if (graph != null) {
+            assert !graph.isFrozen();
+            NodeChangedListener listener = graph.inputChangedListener;
+            if (listener != null) {
+                listener.nodeChanged(usage);
+            }
         }
     }
 
     private void maybeNotifyZeroInputs(Node oldInput) {
-        assert graph == null || !graph.isFrozen();
-        NodeChangedListener listener = graph.usagesDroppedToZeroListener;
-        if (listener != null) {
-            listener.nodeChanged(oldInput);
+        if (graph != null) {
+            assert !graph.isFrozen();
+            NodeChangedListener listener = graph.usagesDroppedToZeroListener;
+            if (listener != null) {
+                listener.nodeChanged(oldInput);
+            }
         }
     }
 
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Wed Mar 12 12:40:45 2014 -0700
@@ -970,8 +970,8 @@
         int index = startIndex;
         while (index < inputOffsets.length) {
             NodeList<Node> list = getNodeList(node, inputOffsets[index]);
+            assert list != null : clazz;
             putNodeList(node, inputOffsets[index], updateInputListCopy(list, node, duplicationReplacement));
-            assert list != null : clazz;
             index++;
         }
     }
@@ -980,8 +980,8 @@
         int index = startIndex;
         while (index < successorOffsets.length) {
             NodeList<Node> list = getNodeList(node, successorOffsets[index]);
+            assert list != null : clazz;
             putNodeList(node, successorOffsets[index], updateSuccListCopy(list, node, duplicationReplacement));
-            assert list != null : clazz;
             index++;
         }
     }
--- a/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/ForEachToGraal.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/ForEachToGraal.java	Wed Mar 12 12:40:45 2014 -0700
@@ -82,13 +82,13 @@
         NodeIterable<MethodCallTargetNode> calls = graph.getNodes(MethodCallTargetNode.class);
         assert calls.count() == 1;
         ResolvedJavaMethod lambdaMethod = calls.first().targetMethod();
-        assert lambdaMethod.getName().startsWith("lambda$");
         Debug.log("target ... " + lambdaMethod);
 
         if (lambdaMethod == null) {
             Debug.log("Did not find call in accept()");
             return null;
         }
+        assert lambdaMethod.getName().startsWith("lambda$");
 
         ExternalCompilationResult hsailCode = backend.compileKernel(lambdaMethod, true);
         return backend.installKernel(lambdaMethod, hsailCode);
--- a/graal/com.oracle.graal.hotspot.ptx/src/com/oracle/graal/hotspot/ptx/PTXHotSpotBackend.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.hotspot.ptx/src/com/oracle/graal/hotspot/ptx/PTXHotSpotBackend.java	Wed Mar 12 12:40:45 2014 -0700
@@ -184,7 +184,7 @@
 
             private boolean canOffloadToGPU(ResolvedJavaMethod method) {
                 HotSpotVMConfig config = getRuntime().getConfig();
-                return config.gpuOffload && method.getName().contains("lambda$") & method.isSynthetic();
+                return config.gpuOffload && method.getName().contains("lambda$") && method.isSynthetic();
             }
         };
     }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompilationTask.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompilationTask.java	Wed Mar 12 12:40:45 2014 -0700
@@ -51,6 +51,8 @@
 import com.oracle.graal.phases.*;
 import com.oracle.graal.phases.tiers.*;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 public class CompilationTask implements Runnable, Comparable {
 
     // Keep static finals in a group with withinEnqueue as the last one. CompilationTask can be
@@ -125,6 +127,7 @@
         return entryBCI;
     }
 
+    @SuppressFBWarnings(value = "NN_NAKED_NOTIFY")
     public void run() {
         withinEnqueue.set(Boolean.FALSE);
         try {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java	Wed Mar 12 12:40:45 2014 -0700
@@ -60,8 +60,19 @@
     }
 
     HotSpotVMConfig(CompilerToVM compilerToVm) {
+        /** These fields are set in {@link CompilerToVM#initializeConfiguration}. */
+        gHotSpotVMStructs = 0;
+        gHotSpotVMTypes = 0;
+        gHotSpotVMIntConstants = 0;
+        gHotSpotVMLongConstants = 0;
+
         compilerToVm.initializeConfiguration(this);
 
+        assert gHotSpotVMStructs != 0;
+        assert gHotSpotVMTypes != 0;
+        assert gHotSpotVMIntConstants != 0;
+        assert gHotSpotVMLongConstants != 0;
+
         // Fill the VM fields hash map.
         HashMap<String, VMFields.Field> vmFields = new HashMap<>();
         for (VMFields.Field e : new VMFields(gHotSpotVMStructs)) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/debug/BenchmarkCounters.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/debug/BenchmarkCounters.java	Wed Mar 12 12:40:45 2014 -0700
@@ -45,6 +45,8 @@
 import com.oracle.graal.options.*;
 import com.oracle.graal.replacements.nodes.*;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * This class contains infrastructure to maintain counters based on {@link DynamicCounterNode}s. The
  * infrastructure is enabled by specifying either the GenericDynamicCounters or
@@ -105,6 +107,7 @@
     public static long[] delta;
     public static final ArrayList<AtomicLong> staticCounters = new ArrayList<>();
 
+    @SuppressFBWarnings(value = "AT_OPERATION_SEQUENCE_ON_CONCURRENT_ABSTRACTION", justification = "concurrent abstraction calls are in synchronized block")
     public static int getIndex(DynamicCounterNode counter) {
         if (!enabled) {
             throw new GraalInternalError("counter nodes shouldn't exist when counters are not enabled: " + counter.getGroup() + ", " + counter.getName());
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotForeignCallsProviderImpl.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotForeignCallsProviderImpl.java	Wed Mar 12 12:40:45 2014 -0700
@@ -134,8 +134,8 @@
     public static final LocationIdentity[] NO_LOCATIONS = {};
 
     public HotSpotForeignCallLinkage lookupForeignCall(ForeignCallDescriptor descriptor) {
+        assert foreignCalls != null : descriptor;
         HotSpotForeignCallLinkage callTarget = foreignCalls.get(descriptor);
-        assert foreignCalls != null : descriptor;
         callTarget.finalizeAddress(runtime.getHostBackend());
         return callTarget;
     }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphCache.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphCache.java	Wed Mar 12 12:40:45 2014 -0700
@@ -34,6 +34,8 @@
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.spi.*;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * This class implements the graph caching system for the HotSpot platform.
  * 
@@ -115,6 +117,7 @@
     }
 
     @Override
+    @SuppressFBWarnings(value = "VO_VOLATILE_INCREMENT", justification = "counters are only used for statistics")
     public StructuredGraph get(ResolvedJavaMethod method) {
         StructuredGraph result = (StructuredGraph) method.getCompilerStorage().get(this);
 
@@ -129,6 +132,7 @@
     }
 
     @Override
+    @SuppressFBWarnings(value = "VO_VOLATILE_INCREMENT", justification = "counters are only used for statistics")
     public boolean put(StructuredGraph graph, boolean hasMatureProfilingInfo) {
         assert graph.method() != null;
         if (hasMatureProfilingInfo) {
@@ -160,6 +164,7 @@
         }
     }
 
+    @SuppressFBWarnings(value = "VO_VOLATILE_INCREMENT", justification = "counters are only used for statistics")
     public void removeGraphs(long[] deoptedGraphs) {
         for (long graphId : deoptedGraphs) {
             WeakReference<ResolvedJavaMethod> ref = cachedGraphIds.get(graphId);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMetaAccessProvider.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMetaAccessProvider.java	Wed Mar 12 12:40:45 2014 -0700
@@ -120,8 +120,7 @@
             HotSpotResolvedObjectType resolved = (HotSpotResolvedObjectType) holder;
             return resolved.createField(name, type, offset, modifiers);
         } else {
-            // TODO this cast will not succeed
-            return (ResolvedJavaField) new HotSpotUnresolvedField(holder, name, type);
+            throw GraalInternalError.shouldNotReachHere("unresolved field " + reflectionField);
         }
     }
 
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotNmethod.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotNmethod.java	Wed Mar 12 12:40:45 2014 -0700
@@ -84,7 +84,7 @@
 
     @Override
     public String toString() {
-        return String.format("InstalledNmethod[method=%s, codeBlob=0x%x, isDefault=%b, name=]", method, getCodeBlob(), isDefault, name);
+        return String.format("InstalledNmethod[method=%s, codeBlob=0x%x, isDefault=%b, name=%s]", method, getCodeBlob(), isDefault, name);
     }
 
     @Override
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedPrimitiveType.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedPrimitiveType.java	Wed Mar 12 12:40:45 2014 -0700
@@ -70,7 +70,10 @@
 
     @Override
     public ResolvedJavaType getArrayClass() {
-        Class javaArrayMirror = kind == Kind.Void ? null : Array.newInstance(mirror(), 0).getClass();
+        if (kind == Kind.Void) {
+            return null;
+        }
+        Class<?> javaArrayMirror = Array.newInstance(mirror(), 0).getClass();
         return HotSpotResolvedObjectType.fromClass(javaArrayMirror);
     }
 
--- a/graal/com.oracle.graal.java.decompiler/src/com/oracle/graal/java/decompiler/Decompiler.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.java.decompiler/src/com/oracle/graal/java/decompiler/Decompiler.java	Wed Mar 12 12:40:45 2014 -0700
@@ -25,6 +25,7 @@
 import java.io.*;
 import java.util.*;
 
+import com.oracle.graal.graph.*;
 import com.oracle.graal.java.decompiler.block.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.cfg.*;
@@ -55,9 +56,9 @@
                 schedule = new SchedulePhase();
                 schedule.apply(graph);
             } catch (Throwable t) {
+                throw new GraalInternalError(t);
             }
         }
-
         cfg = schedule.getCFG();
     }
 
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeDisassembler.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeDisassembler.java	Wed Mar 12 12:40:45 2014 -0700
@@ -141,7 +141,7 @@
                             desc = constant.toString();
                         }
                         if (!multiline) {
-                            desc.replaceAll("\\n", "");
+                            desc = desc.replaceAll("\\n", "");
                         }
                         buf.append(String.format("#%-10d // %s", cpi, desc));
                         break;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java	Wed Mar 12 12:40:45 2014 -0700
@@ -54,7 +54,7 @@
      * @param y the instruction that produces the second input to this instruction
      */
     public CompareNode(ValueNode x, ValueNode y) {
-        assert (x == null && y == null) || x.kind() == y.kind();
+        assert x != null && y != null && x.kind() == y.kind();
         this.x = x;
         this.y = y;
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerTestNode.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerTestNode.java	Wed Mar 12 12:40:45 2014 -0700
@@ -53,7 +53,7 @@
      * @param y the instruction that produces the second input to this instruction
      */
     public IntegerTestNode(ValueNode x, ValueNode y) {
-        assert (x == null && y == null) || x.stamp().isCompatible(y.stamp());
+        assert x != null && y != null && x.stamp().isCompatible(y.stamp());
         this.x = x;
         this.y = y;
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java	Wed Mar 12 12:40:45 2014 -0700
@@ -76,7 +76,7 @@
         }
         if (tool.canonicalizeReads()) {
             if (metaAccess != null && object != null && object.isConstant()) {
-                if ((location.getLocationIdentity() == LocationIdentity.FINAL_LOCATION || location.getLocationIdentity() == LocationIdentity.ARRAY_LENGTH_LOCATION) &
+                if ((location.getLocationIdentity() == LocationIdentity.FINAL_LOCATION || location.getLocationIdentity() == LocationIdentity.ARRAY_LENGTH_LOCATION) &&
                                 location instanceof ConstantLocationNode) {
                     long displacement = ((ConstantLocationNode) location).getDisplacement();
                     Kind kind = location.getValueKind();
--- a/graal/com.oracle.graal.options/src/com/oracle/graal/options/OptionProcessor.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.options/src/com/oracle/graal/options/OptionProcessor.java	Wed Mar 12 12:40:45 2014 -0700
@@ -172,7 +172,7 @@
                 String declaringClass = option.declaringClass;
                 Name fieldName = option.field.getSimpleName();
                 String comma = i == info.options.size() - 1 ? "" : ",";
-                out.printf("            new %s(\"%s\", %s.class, \"%s\", %s.class, \"%s\", %s)%s\n", desc, name, type, help, declaringClass, fieldName, optionValue, comma);
+                out.printf("            new %s(\"%s\", %s.class, \"%s\", %s.class, \"%s\", %s)%s%n", desc, name, type, help, declaringClass, fieldName, optionValue, comma);
                 i++;
             }
             out.println("        );");
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java	Wed Mar 12 12:40:45 2014 -0700
@@ -66,7 +66,7 @@
         new ConditionalElimination(graph.start(), new State()).apply();
     }
 
-    public static class State extends MergeableState<State> {
+    public static class State extends MergeableState<State> implements Cloneable {
 
         private IdentityHashMap<ValueNode, ResolvedJavaType> knownTypes;
         private HashSet<ValueNode> knownNonNull;
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ValueAnchorCleanupPhase.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ValueAnchorCleanupPhase.java	Wed Mar 12 12:40:45 2014 -0700
@@ -37,7 +37,7 @@
  */
 public class ValueAnchorCleanupPhase extends Phase {
 
-    private static class State extends MergeableState<State> {
+    private static class State extends MergeableState<State> implements Cloneable {
 
         private final HashSet<Node> anchoredValues;
 
--- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ComputeProbabilityClosure.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ComputeProbabilityClosure.java	Wed Mar 12 12:40:45 2014 -0700
@@ -169,7 +169,7 @@
 
         public final NodeMap<Set<LoopInfo>> requires;
 
-        private double loopFrequency = -1;
+        private double loopFrequency = -1.0;
         public boolean ended = false;
 
         public LoopInfo(LoopBeginNode loopBegin) {
@@ -178,7 +178,8 @@
         }
 
         public double loopFrequency(NodesToDoubles nodeProbabilities) {
-            if (loopFrequency == -1 && ended) {
+            // loopFrequency is initialized with -1.0
+            if (loopFrequency < 0.0 && ended) {
                 double backEdgeProb = 0.0;
                 for (LoopEndNode le : loopBegin.loopEnds()) {
                     double factor = 1;
@@ -219,7 +220,7 @@
         return r;
     }
 
-    private class Probability extends MergeableState<Probability> {
+    private class Probability extends MergeableState<Probability> implements Cloneable {
 
         public double probability;
         public Set<LoopInfo> loops;
@@ -330,7 +331,7 @@
         }
     }
 
-    private class LoopCount extends MergeableState<LoopCount> {
+    private class LoopCount extends MergeableState<LoopCount> implements Cloneable {
 
         public double count;
 
--- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/MergeableState.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/MergeableState.java	Wed Mar 12 12:40:45 2014 -0700
@@ -62,7 +62,7 @@
         // empty default implementation
     }
 
-    public static final class EmptyState extends MergeableState<EmptyState> {
+    public static final class EmptyState extends MergeableState<EmptyState> implements Cloneable {
 
         @Override
         public EmptyState clone() {
--- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/GraphPrinterDumpHandler.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/GraphPrinterDumpHandler.java	Wed Mar 12 12:40:45 2014 -0700
@@ -86,7 +86,7 @@
     // This field must be lazily initialized as this class may be loaded in a version
     // VM startup phase at which not all required features (such as system properties)
     // are online.
-    private static SimpleDateFormat sdf;
+    private static volatile SimpleDateFormat sdf;
 
     private void initializeFilePrinter() {
         String ext;
@@ -98,7 +98,13 @@
         if (sdf == null) {
             sdf = new SimpleDateFormat("YYYY-MM-dd-HHmm");
         }
-        String prefix = "Graphs-" + Thread.currentThread().getName() + "-" + sdf.format(new Date());
+
+        // DateFormats are inherently unsafe for multi-threaded use. Use a synchronized block.
+        String prefix;
+        synchronized (sdf) {
+            prefix = "Graphs-" + Thread.currentThread().getName() + "-" + sdf.format(new Date());
+        }
+
         String num = "";
         File file;
         int i = 0;
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StringSubstitutions.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StringSubstitutions.java	Wed Mar 12 12:40:45 2014 -0700
@@ -30,6 +30,8 @@
 import com.oracle.graal.graph.*;
 import com.oracle.graal.replacements.nodes.*;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Substitutions for {@link java.lang.String} methods.
  */
@@ -51,6 +53,7 @@
     }
 
     @MethodSubstitution(isStatic = false)
+    @SuppressFBWarnings(value = "ES_COMPARING_PARAMETER_STRING_WITH_EQ", justification = "reference equality on the receiver is what we want")
     public static boolean equals(final String thisString, Object obj) {
         if (thisString == obj) {
             return true;
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleDebugJavaMethod.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleDebugJavaMethod.java	Wed Mar 12 12:40:45 2014 -0700
@@ -59,7 +59,7 @@
 
         @Override
         public boolean equals(Object obj) {
-            return obj.getClass() == getClass();
+            return obj instanceof TruffleDebugJavaMethod;
         }
 
         @Override
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleExpansionLogger.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleExpansionLogger.java	Wed Mar 12 12:40:45 2014 -0700
@@ -168,10 +168,10 @@
                 if (e.getLineNumber() >= 0) {
                     return String.format("(%s:%d)", e.getFileName(), e.getLineNumber());
                 } else {
-                    return String.format("(%s)", e.getFileName(), e.getLineNumber());
+                    return String.format("(%s)", e.getFileName());
                 }
             } else {
-                return String.format("(Unknown Source)", e.getFileName(), e.getLineNumber());
+                return String.format("(Unknown Source)");
             }
         }
     }
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PEReadEliminationBlockState.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PEReadEliminationBlockState.java	Wed Mar 12 12:40:45 2014 -0700
@@ -50,6 +50,9 @@
 
         @Override
         public boolean equals(Object obj) {
+            if (!(obj instanceof ReadCacheEntry)) {
+                return false;
+            }
             ReadCacheEntry other = (ReadCacheEntry) obj;
             return identity == other.identity && object == other.object;
         }
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/ReadEliminationBlockState.java	Wed Mar 12 13:36:23 2014 +0100
+++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/ReadEliminationBlockState.java	Wed Mar 12 12:40:45 2014 -0700
@@ -52,6 +52,9 @@
 
         @Override
         public boolean equals(Object obj) {
+            if (!(obj instanceof CacheEntry<?>)) {
+                return false;
+            }
             CacheEntry<?> other = (CacheEntry<?>) obj;
             return identity == other.identity && object == other.object;
         }
--- a/mx/projects	Wed Mar 12 13:36:23 2014 +0100
+++ b/mx/projects	Wed Mar 12 12:40:45 2014 -0700
@@ -13,6 +13,9 @@
 library@CHECKSTYLE@path=lib/checkstyle-5.5-all.jar
 library@CHECKSTYLE@urls=jar:http://sourceforge.net/projects/checkstyle/files/checkstyle/5.5/checkstyle-5.5-bin.zip/download!/checkstyle-5.5/checkstyle-5.5-all.jar
 
+library@FINDBUGS@path=lib/findbugs-3.0.0-dev-20131204-e3cbbd5.jar
+library@FINDBUGS@urls=jar:http://sourceforge.net/projects/findbugs/files/findbugs/3.0.0/findbugs-3.0.0-dev-20131204-e3cbbd5.zip/download!/findbugs-3.0.0-dev-20131204-e3cbbd5/lib/findbugs.jar
+
 library@DACAPO@path=lib/dacapo-9.12-bach.jar
 library@DACAPO@urls=http://softlayer.dl.sourceforge.net/project/dacapobench/9.12-bach/dacapo-9.12-bach.jar
 
@@ -230,7 +233,7 @@
 # graal.graph
 project@com.oracle.graal.graph@subDir=graal
 project@com.oracle.graal.graph@sourceDirs=src
-project@com.oracle.graal.graph@dependencies=com.oracle.graal.debug,com.oracle.graal.api.code
+project@com.oracle.graal.graph@dependencies=FINDBUGS,com.oracle.graal.debug,com.oracle.graal.api.code
 project@com.oracle.graal.graph@javaCompliance=1.7
 project@com.oracle.graal.graph@workingSets=Graal,Graph