diff options
| author | Roman Levenstein <romix.llvm@googlemail.com> | 2008-03-26 12:39:26 +0000 |
|---|---|---|
| committer | Roman Levenstein <romix.llvm@googlemail.com> | 2008-03-26 12:39:26 +0000 |
| commit | 0664ef9d7e3b538fc448fe42e8557aa52d8d6d51 (patch) | |
| tree | 40c4cfd27294a5496057047830a1f5c4b4fe432c /lib/Target | |
| parent | 186d9b73181e9f74bd6b835cb4aa7d919d5c0953 (diff) | |
| download | external_llvm-0664ef9d7e3b538fc448fe42e8557aa52d8d6d51.zip external_llvm-0664ef9d7e3b538fc448fe42e8557aa52d8d6d51.tar.gz external_llvm-0664ef9d7e3b538fc448fe42e8557aa52d8d6d51.tar.bz2 | |
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
Diffstat (limited to 'lib/Target')
| -rw-r--r-- | lib/Target/PowerPC/PPCISelLowering.cpp | 12 | ||||
| -rw-r--r-- | lib/Target/X86/X86ISelDAGToDAG.cpp | 2 | ||||
| -rw-r--r-- | lib/Target/X86/X86ISelLowering.cpp | 2 |
3 files changed, 8 insertions, 8 deletions
diff --git a/lib/Target/PowerPC/PPCISelLowering.cpp b/lib/Target/PowerPC/PPCISelLowering.cpp index 5cf08a6..dff53cd 100644 --- a/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/lib/Target/PowerPC/PPCISelLowering.cpp @@ -3660,11 +3660,11 @@ SDOperand PPCTargetLowering::PerformDAGCombine(SDNode *N, SDNode *LHSN = N->getOperand(0).Val; for (SDNode::use_iterator UI = LHSN->use_begin(), E = LHSN->use_end(); UI != E; ++UI) - if ((*UI)->getOpcode() == PPCISD::VCMPo && - (*UI)->getOperand(1) == N->getOperand(1) && - (*UI)->getOperand(2) == N->getOperand(2) && - (*UI)->getOperand(0) == N->getOperand(0)) { - VCMPoNode = *UI; + if ((*UI).getUser()->getOpcode() == PPCISD::VCMPo && + (*UI).getUser()->getOperand(1) == N->getOperand(1) && + (*UI).getUser()->getOperand(2) == N->getOperand(2) && + (*UI).getUser()->getOperand(0) == N->getOperand(0)) { + VCMPoNode = UI->getUser(); break; } @@ -3680,7 +3680,7 @@ SDOperand PPCTargetLowering::PerformDAGCombine(SDNode *N, for (SDNode::use_iterator UI = VCMPoNode->use_begin(); FlagUser == 0; ++UI) { assert(UI != VCMPoNode->use_end() && "Didn't find user!"); - SDNode *User = *UI; + SDNode *User = UI->getUser(); for (unsigned i = 0, e = User->getNumOperands(); i != e; ++i) { if (User->getOperand(i) == SDOperand(VCMPoNode, 1)) { FlagUser = User; diff --git a/lib/Target/X86/X86ISelDAGToDAG.cpp b/lib/Target/X86/X86ISelDAGToDAG.cpp index cc80348..bcc87e9 100644 --- a/lib/Target/X86/X86ISelDAGToDAG.cpp +++ b/lib/Target/X86/X86ISelDAGToDAG.cpp @@ -225,7 +225,7 @@ namespace { static SDNode *findFlagUse(SDNode *N) { unsigned FlagResNo = N->getNumValues()-1; for (SDNode::use_iterator I = N->use_begin(), E = N->use_end(); I != E; ++I) { - SDNode *User = *I; + SDNode *User = I->getUser(); for (unsigned i = 0, e = User->getNumOperands(); i != e; ++i) { SDOperand Op = User->getOperand(i); if (Op.Val == N && Op.ResNo == FlagResNo) diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 1d72e1f..aea57f2 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -3724,7 +3724,7 @@ X86TargetLowering::LowerEXTRACT_VECTOR_ELT_SSE4(SDOperand Op, // result has a single use which is a store. if (!Op.hasOneUse()) return SDOperand(); - SDNode *User = *Op.Val->use_begin(); + SDNode *User = Op.Val->use_begin()->getUser(); if (User->getOpcode() != ISD::STORE) return SDOperand(); SDOperand Extract = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, MVT::i32, |
