mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-21 21:29:41 +00:00
Don't apply type information to load instructions if it will cause collapsing
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5684 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
af68ccefeb
commit
088b639e3a
@ -152,7 +152,8 @@ bool DSNode::isNodeCompletelyFolded() const {
|
|||||||
///
|
///
|
||||||
/// This method returns true if the node is completely folded, otherwise false.
|
/// This method returns true if the node is completely folded, otherwise false.
|
||||||
///
|
///
|
||||||
bool DSNode::mergeTypeInfo(const Type *NewTy, unsigned Offset) {
|
bool DSNode::mergeTypeInfo(const Type *NewTy, unsigned Offset,
|
||||||
|
bool FoldIfIncompatible) {
|
||||||
// Check to make sure the Size member is up-to-date. Size can be one of the
|
// Check to make sure the Size member is up-to-date. Size can be one of the
|
||||||
// following:
|
// following:
|
||||||
// Size = 0, Ty = Void: Nothing is known about this node.
|
// Size = 0, Ty = Void: Nothing is known about this node.
|
||||||
@ -213,14 +214,14 @@ bool DSNode::mergeTypeInfo(const Type *NewTy, unsigned Offset) {
|
|||||||
// It is illegal to grow this node if we have treated it as an array of
|
// It is illegal to grow this node if we have treated it as an array of
|
||||||
// objects...
|
// objects...
|
||||||
if (isArray()) {
|
if (isArray()) {
|
||||||
foldNodeCompletely();
|
if (FoldIfIncompatible) foldNodeCompletely();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Offset) { // We could handle this case, but we don't for now...
|
if (Offset) { // We could handle this case, but we don't for now...
|
||||||
DEBUG(std::cerr << "UNIMP: Trying to merge a growth type into "
|
DEBUG(std::cerr << "UNIMP: Trying to merge a growth type into "
|
||||||
<< "offset != 0: Collapsing!\n");
|
<< "offset != 0: Collapsing!\n");
|
||||||
foldNodeCompletely();
|
if (FoldIfIncompatible) foldNodeCompletely();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -277,7 +278,7 @@ bool DSNode::mergeTypeInfo(const Type *NewTy, unsigned Offset) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
foldNodeCompletely();
|
if (FoldIfIncompatible) foldNodeCompletely();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -356,7 +357,7 @@ bool DSNode::mergeTypeInfo(const Type *NewTy, unsigned Offset) {
|
|||||||
<< "\n due to:" << NewTy << " @ " << Offset << "!\n"
|
<< "\n due to:" << NewTy << " @ " << Offset << "!\n"
|
||||||
<< "SubType: " << SubType << "\n\n");
|
<< "SubType: " << SubType << "\n\n");
|
||||||
|
|
||||||
foldNodeCompletely();
|
if (FoldIfIncompatible) foldNodeCompletely();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -368,7 +368,7 @@ void GraphBuilder::visitLoadInst(LoadInst &LI) {
|
|||||||
Ptr.getNode()->NodeType |= DSNode::Read;
|
Ptr.getNode()->NodeType |= DSNode::Read;
|
||||||
|
|
||||||
// Ensure a typerecord exists...
|
// Ensure a typerecord exists...
|
||||||
Ptr.getNode()->mergeTypeInfo(LI.getType(), Ptr.getOffset());
|
Ptr.getNode()->mergeTypeInfo(LI.getType(), Ptr.getOffset(), false);
|
||||||
|
|
||||||
if (isPointerType(LI.getType()))
|
if (isPointerType(LI.getType()))
|
||||||
setDestTo(LI, getLink(Ptr));
|
setDestTo(LI, getLink(Ptr));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user