mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-10-25 10:27:04 +00:00
Use a linked data structure for the uses lists of an SDNode, just like
LLVM Value/Use does and MachineRegisterInfo/MachineOperand does. This allows constant time for all uses list maintenance operations. The idea was suggested by Chris. Reviewed by Evan and Dan. Patch is tested and approved by Dan. On normal use-cases compilation speed is not affected. On very big basic blocks there are compilation speedups in the range of 15-20% or even better. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48822 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -78,7 +78,7 @@ namespace {
|
||||
void AddUsersToWorkList(SDNode *N) {
|
||||
for (SDNode::use_iterator UI = N->use_begin(), UE = N->use_end();
|
||||
UI != UE; ++UI)
|
||||
AddToWorkList(*UI);
|
||||
AddToWorkList(UI->getUser());
|
||||
}
|
||||
|
||||
/// visit - call the node-specific routine that knows how to fold each
|
||||
@@ -2704,7 +2704,7 @@ static bool ExtendUsesToFormExtLoad(SDNode *N, SDOperand N0,
|
||||
bool isTruncFree = TLI.isTruncateFree(N->getValueType(0), N0.getValueType());
|
||||
for (SDNode::use_iterator UI = N0.Val->use_begin(), UE = N0.Val->use_end();
|
||||
UI != UE; ++UI) {
|
||||
SDNode *User = *UI;
|
||||
SDNode *User = UI->getUser();
|
||||
if (User == N)
|
||||
continue;
|
||||
// FIXME: Only extend SETCC N, N and SETCC N, c for now.
|
||||
@@ -2743,7 +2743,7 @@ static bool ExtendUsesToFormExtLoad(SDNode *N, SDOperand N0,
|
||||
bool BothLiveOut = false;
|
||||
for (SDNode::use_iterator UI = N->use_begin(), UE = N->use_end();
|
||||
UI != UE; ++UI) {
|
||||
SDNode *User = *UI;
|
||||
SDNode *User = UI->getUser();
|
||||
for (unsigned i = 0, e = User->getNumOperands(); i != e; ++i) {
|
||||
SDOperand UseOp = User->getOperand(i);
|
||||
if (UseOp.Val == N && UseOp.ResNo == 0) {
|
||||
@@ -3880,7 +3880,7 @@ SDOperand DAGCombiner::visitFP_EXTEND(SDNode *N) {
|
||||
MVT::ValueType VT = N->getValueType(0);
|
||||
|
||||
// If this is fp_round(fpextend), don't fold it, allow ourselves to be folded.
|
||||
if (N->hasOneUse() && (*N->use_begin())->getOpcode() == ISD::FP_ROUND)
|
||||
if (N->hasOneUse() && (N->use_begin())->getOpcode() == ISD::FP_ROUND)
|
||||
return SDOperand();
|
||||
|
||||
// fold (fp_extend c1fp) -> c1fp
|
||||
@@ -4101,7 +4101,7 @@ bool DAGCombiner::CombineToPreIndexedLoadStore(SDNode *N) {
|
||||
bool RealUse = false;
|
||||
for (SDNode::use_iterator I = Ptr.Val->use_begin(),
|
||||
E = Ptr.Val->use_end(); I != E; ++I) {
|
||||
SDNode *Use = *I;
|
||||
SDNode *Use = I->getUser();
|
||||
if (Use == N)
|
||||
continue;
|
||||
if (Use->isPredecessorOf(N))
|
||||
@@ -4186,7 +4186,7 @@ bool DAGCombiner::CombineToPostIndexedLoadStore(SDNode *N) {
|
||||
|
||||
for (SDNode::use_iterator I = Ptr.Val->use_begin(),
|
||||
E = Ptr.Val->use_end(); I != E; ++I) {
|
||||
SDNode *Op = *I;
|
||||
SDNode *Op = I->getUser();
|
||||
if (Op == N ||
|
||||
(Op->getOpcode() != ISD::ADD && Op->getOpcode() != ISD::SUB))
|
||||
continue;
|
||||
@@ -4214,7 +4214,7 @@ bool DAGCombiner::CombineToPostIndexedLoadStore(SDNode *N) {
|
||||
bool TryNext = false;
|
||||
for (SDNode::use_iterator II = BasePtr.Val->use_begin(),
|
||||
EE = BasePtr.Val->use_end(); II != EE; ++II) {
|
||||
SDNode *Use = *II;
|
||||
SDNode *Use = II->getUser();
|
||||
if (Use == Ptr.Val)
|
||||
continue;
|
||||
|
||||
@@ -4224,7 +4224,7 @@ bool DAGCombiner::CombineToPostIndexedLoadStore(SDNode *N) {
|
||||
bool RealUse = false;
|
||||
for (SDNode::use_iterator III = Use->use_begin(),
|
||||
EEE = Use->use_end(); III != EEE; ++III) {
|
||||
SDNode *UseUse = *III;
|
||||
SDNode *UseUse = III->getUser();
|
||||
if (!((UseUse->getOpcode() == ISD::LOAD &&
|
||||
cast<LoadSDNode>(UseUse)->getBasePtr().Val == Use) ||
|
||||
(UseUse->getOpcode() == ISD::STORE &&
|
||||
|
||||
Reference in New Issue
Block a user