diff options
author | Chris Lattner <sabre@nondot.org> | 2005-01-13 19:56:00 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-01-13 19:56:00 +0000 |
commit | 1d50b7fa533c640dc946dead6134debd4fe5b550 (patch) | |
tree | 89e559684e2a41590b1a4fc1e2519329bc4cbd63 | |
parent | 5a6c6d98d561df671350a56c8031a3611f1c46fa (diff) |
Codegen factor nodes more intelligently according to perceived register pressure.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19532 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/X86/X86ISelPattern.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/Target/X86/X86ISelPattern.cpp b/lib/Target/X86/X86ISelPattern.cpp index d5ec4668ad..d13dbdf077 100644 --- a/lib/Target/X86/X86ISelPattern.cpp +++ b/lib/Target/X86/X86ISelPattern.cpp @@ -2088,8 +2088,20 @@ void ISel::Select(SDOperand N) { assert(0 && "Node not handled yet!"); case ISD::EntryToken: return; // Noop case ISD::TokenFactor: - for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) - Select(Node->getOperand(i)); + if (Node->getNumOperands() == 2) { + bool OneFirst = + getRegPressure(Node->getOperand(1))>getRegPressure(Node->getOperand(0)); + Select(Node->getOperand(OneFirst)); + Select(Node->getOperand(!OneFirst)); + } else { + std::vector<std::pair<unsigned, unsigned> > OpsP; + for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) + OpsP.push_back(std::make_pair(getRegPressure(Node->getOperand(i)), i)); + std::sort(OpsP.begin(), OpsP.end()); + std::reverse(OpsP.begin(), OpsP.end()); + for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) + Select(Node->getOperand(OpsP[i].second)); + } return; case ISD::CopyToReg: if (getRegPressure(N.getOperand(0)) > getRegPressure(N.getOperand(1))) { |