summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/X86ISelPattern.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-01-13 19:56:00 +0000
committerChris Lattner <sabre@nondot.org>2005-01-13 19:56:00 +0000
commit15bd19dd76c4b77739de2c91dfa06bbe2cc53c71 (patch)
treea7f910f11c761c7f6385a896c238233c49256f54 /llvm/lib/Target/X86/X86ISelPattern.cpp
parent2451684678ab9c59affd5f7a36885f8164a38573 (diff)
downloadbcm5719-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.cpp16
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))) {
OpenPOWER on IntegriCloud