changeset 18874:e847e842ce93

[SPARC] do not virtualize on big endian when bit sizes do not match (temporary fix)
author Stefan Anzinger <stefan.anzinger@oracle.com>
date Fri, 16 Jan 2015 16:01:31 +0100
parents 9f85ac52d521
children d71bf1009d71
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreFieldNode.java
diffstat 1 files changed, 9 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreFieldNode.java	Fri Jan 16 11:48:52 2015 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreFieldNode.java	Fri Jan 16 16:01:31 2015 +0100
@@ -22,6 +22,8 @@
  */
 package com.oracle.graal.nodes.java;
 
+import java.nio.*;
+
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.compiler.common.type.*;
 import com.oracle.graal.nodeinfo.*;
@@ -73,8 +75,13 @@
         if (state != null && state.getState() == EscapeState.Virtual) {
             int fieldIndex = ((VirtualInstanceNode) state.getVirtualObject()).fieldIndex(field());
             if (fieldIndex != -1) {
-                tool.setVirtualEntry(state, fieldIndex, value(), false);
-                tool.delete();
+                Kind entryKind = state.getVirtualObject().entryKind(fieldIndex);
+                Kind valueKind = value().getKind();
+                boolean isStoreSafe = !entryKind.isPrimitive() || ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN || entryKind.getBitCount() == valueKind.getBitCount();
+                if (isStoreSafe) {
+                    tool.setVirtualEntry(state, fieldIndex, value(), false);
+                    tool.delete();
+                }
             }
         }
     }