You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by mf...@apache.org on 2008/03/18 09:45:06 UTC
svn commit: r638265 - in /harmony/enhanced/drlvm/trunk/vm/jitrino/src:
optimizer/constantfolder.cpp optimizer/escanalyzer.cpp
optimizer/simplifier.cpp shared/Type.h
Author: mfursov
Date: Tue Mar 18 01:45:01 2008
New Revision: 638265
URL: http://svn.apache.org/viewvc?rev=638265&view=rev
Log:
Fix for HARMONY-5471 [drlvm][jit][opt] IntPtr type support in HLO's simplifier
Modified:
harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/constantfolder.cpp
harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.cpp
harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp
harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/Type.h
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/constantfolder.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/constantfolder.cpp?rev=638265&r1=638264&r2=638265&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/constantfolder.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/constantfolder.cpp Tue Mar 18 01:45:01 2008
@@ -549,118 +549,114 @@
bool ovfm = (mod.getOverflowModifier()!=Overflow_None);
switch (toType) {
case Type::Int32:
- switch (fromType) {
- case Type::Int32:
- res.i4 = src.i4; return true;
- case Type::UInt32:
- res.i4 = src.i4;
- if (ovfm && (src.i4 < 0)) return false;
- return true;
- case Type::Int64:
- res.i4 = CAST(int32, src.i8);
- if (ovfm && (src.i8 != CAST(int64, res.i4))) return false;
- return true;
- case Type::UInt64:
- res.i4 = CAST(int32, CAST(uint64, src.i8));
- if (ovfm && (CAST(uint64, src.i8) != CAST(uint64, res.i4))) return false;
- return true;
- case Type::Single:
+#ifndef PONTER64
+ case Type::IntPtr:
+#endif
+ if (Type::isInteger(fromType)) {
+ if (Type::isIntegerOf4Signed(fromType)) {
+ res.i4 = src.i4; return true;
+ } else if (Type::isIntegerOf4Unsigned(fromType)) {
+ res.i4 = src.i4;
+ if (ovfm && (src.i4 < 0)) return false;
+ return true;
+ } else if (Type::isIntegerOf8Signed(fromType)) {
+ res.i4 = CAST(int32, src.i8);
+ if (ovfm && (src.i8 != CAST(int64, res.i4))) return false;
+ return true;
+ } else if (Type::isIntegerOf8Unsigned(fromType)) {
+ res.i4 = CAST(int32, CAST(uint64, src.i8));
+ if (ovfm && (CAST(uint64, src.i8) != CAST(uint64, res.i4))) return false;
+ return true;
+ }
+ assert(0);
+ } else if (fromType == Type::Single) {
res.i4 = float2int<int32, float>(src.s);
if (ovfm && (src.s != CAST(float, res.i4))) return false;
return true;
- case Type::Double:
+ } else if (fromType == Type::Double) {
res.i4 = float2int<int32, double>(src.d);
if (ovfm && (src.d != CAST(double, res.i4))) return false;
return true;
- case Type::Float:
- default:
- break;
}
break;
case Type::UInt32:
- switch (fromType) {
- case Type::Int32:
- if (ovfm && (src.i4 < 0)) return false;
- res.i4 = src.i4; return true;
- case Type::UInt32:
- res.i4 = src.i4; return true;
- case Type::Int64:
- res.i4 = CAST(int32, CAST(uint32, src.i8));
- if (ovfm && (src.i8 != CAST(int64, CAST(uint32, res.i4)))) return false;
- return true;
- case Type::UInt64:
- res.i4 = CAST(int32, CAST(uint32, CAST(uint64, src.i8)));
- if (ovfm && (CAST(uint64, src.i8) != CAST(uint64, CAST(uint32, res.i4))))
- return false;
- return true;
- case Type::Single:
+#ifndef PONTER64
+ case Type::UIntPtr:
+#endif
+ if (Type::isInteger(fromType)) {
+ if (Type::isIntegerOf4Bytes(fromType)) {
+ res.i4 = src.i4; return true;
+ } else if (Type::isIntegerOf8Signed(fromType)) {
+ res.i4 = CAST(int32, CAST(uint32, src.i8));
+ if (ovfm && (src.i8 != CAST(int64, CAST(uint32, res.i4)))) return false;
+ return true;
+ } else if (Type::isIntegerOf8Unsigned(fromType)) {
+ res.i4 = CAST(int32, CAST(uint32, CAST(uint64, src.i8)));
+ if (ovfm && (CAST(uint64, src.i8) != CAST(uint64, CAST(uint32, res.i4)))) return false;
+ return true;
+ }
+ assert(0);
+ } else if (fromType == Type::Single) {
res.i4 = float2uint<uint32, float>(src.s);
if (ovfm && (src.s != CAST(float, CAST(uint32, res.i4)))) return false;
return true;
- case Type::Double:
+ } else if (fromType == Type::Double) {
res.i4 = float2uint<uint32, double>(src.d);
if (ovfm && (src.d != CAST(double, CAST(uint32, res.i4)))) return false;
return true;
- case Type::Float:
- default:
- break;
}
break;
case Type::Int64:
- if (ovfm) { assert(mod.getOverflowModifier()==Overflow_Signed); };
- switch (fromType) {
- case Type::Int32:
- res.i8 = src.i4; return true;
- case Type::UInt32:
- res.i8 = CAST(uint32, src.i4);
- if (ovfm && (src.i4 < 0)) return false;
- return true;
- case Type::Int64:
- res.i8 = src.i8; return true;
- case Type::UInt64:
- res.i8 = src.i8;
- if (ovfm && (src.i8 < 0)) return false;
- return true;
- case Type::Single:
+#ifdef PONTER64
+ case Type::IntPtr:
+#endif
+ assert(!ovfm || mod.getOverflowModifier()==Overflow_Signed);
+ if (Type::isInteger(fromType)) {
+ if (Type::isIntegerOf4Signed(fromType)) {
+ res.i8 = src.i4; return true;
+ } else if (Type::isIntegerOf4Unsigned(fromType)) {
+ res.i8 = CAST(uint32, src.i4);
+ if (ovfm && (src.i4 < 0)) return false;
+ return true;
+ } else if (Type::isIntegerOf8Signed(fromType)) {
+ res.i8 = src.i8; return true;
+ } else if (Type::isIntegerOf8Unsigned(fromType)) {
+ res.i8 = src.i8;
+ if (ovfm && (src.i8 < 0)) return false;
+ return true;
+ }
+ assert(0);
+ } else if (fromType == Type::Single) {
res.i8 = float2int<int64, float>(src.s);
if (ovfm && (src.s != CAST(float, res.i8))) return false;
return true;
- case Type::Double:
+ } else if (fromType == Type::Double) {
res.i8 = float2int<int64, double>(src.d);
if (ovfm && (src.d != CAST(double, res.i8))) return false;
return true;
- case Type::Float:
- default:
- break;
}
break;
case Type::UInt64:
- if (ovfm) { assert(mod.getOverflowModifier()==Overflow_Unsigned); };
- switch (fromType) {
- case Type::Int32:
- res.i8 = CAST(uint64, CAST(uint32, src.i4));
- if (ovfm && (src.i4 < 0)) return false;
- return true;
- case Type::UInt32:
- res.i8 = CAST(uint64, CAST(uint32, src.i4)); return true;
- case Type::Int64:
- res.i8 = src.i8;
- if (ovfm && (src.i8 < 0)) return false;
- return true;
- case Type::UInt64:
- if (ovfm && (src.i8 < 0)) return false;
- res.i8 = src.i8; return true;
- case Type::Single:
- res.i8 = float2uint<uint64, float>(src.s);
- if (ovfm) {
- return false;
+#ifdef PONTER64
+ case Type::UIntPtr:
+#endif
+ assert(!ovfm || mod.getOverflowModifier()==Overflow_Unsigned);
+ if (Type::isInteger(fromType)) {
+ if (Type::isIntegerOf4Signed(fromType)) {
+ res.i8 = CAST(uint64, CAST(uint32, src.i4));
+ if (ovfm && (src.i4 < 0)) return false;
+ return true;
+ } else if (Type::isIntegerOf4Unsigned(fromType)) {
+ res.i8 = CAST(uint64, CAST(uint32, src.i4)); return true;
+ } else if (Type::isIntegerOf8Bytes(fromType)) {
+ res.i8 = src.i8; return true;
}
+ } else if (fromType == Type::Single) {
+ res.i8 = float2uint<uint64, float>(src.s);
+ if (ovfm) return false;
return true;
- case Type::Double:
- return false;
- case Type::Float:
- default:
- break;
+ } else if (fromType == Type::Double) {
+ return false;
}
break;
case Type::Single:
@@ -703,6 +699,16 @@
case Type::Float:
default:
break;
+ }
+ break;
+ case Type::UnmanagedPtr:
+ // Let's accept the conversion from properly sized integer
+#ifdef PONTER64
+ if (Type::isIntegerOf8Bytes(fromType)) {
+#else
+ if (Type::isIntegerOf4Bytes(fromType)) {
+#endif
+ return true;
}
break;
default:
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.cpp?rev=638265&r1=638264&r2=638265&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.cpp Tue Mar 18 01:45:01 2008
@@ -356,13 +356,16 @@
break;
case Op_TauLdInd: // ldind
{
+ Opnd* src = inst->getSrc(0);
+ if(src->getType()->isUnmanagedPtr())
+ break; // skip load from unmanaged source
type = inst->getDst()->getType();
if (type->isReference()) { //isObject()) {
assert(findCnGNode_op(inst->getDst()->getId())==NULL);
cgnode = addCnGNode_op(inst,type,NT_LDOBJ);
exam2Insts->push_back(inst);
}
- if (inst->getSrc(0)->getInst()->getOpcode()==Op_LdStaticAddr)
+ if (src->getInst()->getOpcode()==Op_LdStaticAddr)
break;
if (type->isValue()) {
assert(findCnGNode_op(inst->getDst()->getId())==NULL);
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp?rev=638265&r1=638264&r2=638265&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp Tue Mar 18 01:45:01 2008
@@ -1795,6 +1795,21 @@
Modifier ovfmod,
Opnd* src)
{
+ // get rid of redundant conversion
+ Inst *opndInst = src->getInst();
+ if (toType == opndInst->getType() && (dstType == src->getType())) {
+ return src;
+ }
+ ConstInst *cinst = opndInst->asConstInst();
+ if (cinst) {
+ ConstInst::ConstValue srcval = cinst->getValue();
+ ConstInst::ConstValue res;
+ Type::Tag fromType = opndInst->getType();
+ if (ConstantFolder::foldConv(fromType, toType, ovfmod, srcval, res)) {
+ if (dstType->tag == toType)
+ return genLdConstant(dstType, res)->getDst();
+ }
+ }
return NULL;
}
@@ -1804,6 +1819,21 @@
Modifier ovfmod,
Opnd* src)
{
+ // get rid of redundant conversion
+ Inst *opndInst = src->getInst();
+ if (toType == opndInst->getType() && (dstType == src->getType())) {
+ return src;
+ }
+ ConstInst *cinst = opndInst->asConstInst();
+ if (cinst) {
+ ConstInst::ConstValue srcval = cinst->getValue();
+ ConstInst::ConstValue res;
+ Type::Tag fromType = opndInst->getType();
+ if (ConstantFolder::foldConv(fromType, toType, ovfmod, srcval, res)) {
+ if (dstType->tag == toType)
+ return genLdConstant(dstType, res)->getDst();
+ }
+ }
return NULL;
}
@@ -3127,8 +3157,9 @@
Opnd*
Simplifier::simplifyAddScaledIndex(Opnd* base, Opnd* index) {
ConstInst* constIndexInst = index->getInst()->asConstInst();
- if ((constIndexInst != NULL) && (index->getType()->tag == Type::Int32)) {
- if (constIndexInst->getValue().i4 == 0)
+ if ( constIndexInst != NULL ) {
+ assert(index->getType()->isInteger());
+ if (constIndexInst->getValue().i8 == 0)
return base;
}
return NULL;
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/Type.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/Type.h?rev=638265&r1=638264&r2=638265&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/Type.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/Type.h Tue Mar 18 01:45:01 2008
@@ -369,6 +369,22 @@
uint32 getId() { return id; }
+ // This is for switching integer types depending on the size
+#ifdef POINTER64
+ static bool isIntegerOf4Signed(Tag tag) { return tag == Int32; }
+ static bool isIntegerOf4Unsigned(Tag tag) { return tag == UInt32; }
+ static bool isIntegerOf8Signed(Tag tag) { return tag == Int64 || tag == IntPtr; }
+ static bool isIntegerOf8Unsigned(Tag tag) { return tag == UInt64 || tag == UIntPtr; }
+#else
+ static bool isIntegerOf4Signed(Tag tag) { return tag == Int32 || tag == IntPtr; }
+ static bool isIntegerOf4Unsigned(Tag tag) { return tag == UInt32 || tag == UIntPtr; }
+ static bool isIntegerOf8Signed(Tag tag) { return tag == Int64; }
+ static bool isIntegerOf8Unsigned(Tag tag) { return tag == UInt64; }
+#endif
+ static bool isIntegerOf4Bytes(Tag tag) { return isIntegerOf4Signed(tag) || isIntegerOf4Unsigned(tag); }
+ static bool isIntegerOf8Bytes(Tag tag) { return isIntegerOf8Signed(tag) || isIntegerOf8Unsigned(tag); }
+
+
protected:
virtual bool _isFinalClass() {return false;}