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 | 15bd19dd76c4b77739de2c91dfa06bbe2cc53c71 (patch) | |
| tree | a7f910f11c761c7f6385a896c238233c49256f54 /llvm/lib/Target/X86/X86ISelPattern.cpp | |
| parent | 2451684678ab9c59affd5f7a36885f8164a38573 (diff) | |
| download | bcm5719-llvm-15bd19dd76c4b77739de2c91dfa06bbe2cc53c71.tar.gz bcm5719-llvm-15bd19dd76c4b77739de2c91dfa06bbe2cc53c71.zip | |
Codegen factor nodes more intelligently according to perceived register pressure.
llvm-svn: 19532
Diffstat (limited to 'llvm/lib/Target/X86/X86ISelPattern.cpp')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelPattern.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/llvm/lib/Target/X86/X86ISelPattern.cpp b/llvm/lib/Target/X86/X86ISelPattern.cpp index d5ec4668ad5..d13dbdf077f 100644 --- a/llvm/lib/Target/X86/X86ISelPattern.cpp +++ b/llvm/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))) { |

