summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-01-12 02:19:06 +0000
committerChris Lattner <sabre@nondot.org>2005-01-12 02:19:06 +0000
commitb7fe57a0f1efe8d8f61e0ab496dfd142d5679c01 (patch)
tree8f0f814368c2a57b9b8a974ff9e274138623315d /llvm
parent2cfce6853b3824aa5b8b555b917dac3dee2ec504 (diff)
downloadbcm5719-llvm-b7fe57a0f1efe8d8f61e0ab496dfd142d5679c01.tar.gz
bcm5719-llvm-b7fe57a0f1efe8d8f61e0ab496dfd142d5679c01.zip
Fold TRUNCATE (LOAD P) into a smaller load from P.
llvm-svn: 19494
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Target/X86/X86ISelPattern.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelPattern.cpp b/llvm/lib/Target/X86/X86ISelPattern.cpp
index dacd5133c1d..34d13564707 100644
--- a/llvm/lib/Target/X86/X86ISelPattern.cpp
+++ b/llvm/lib/Target/X86/X86ISelPattern.cpp
@@ -410,6 +410,7 @@ unsigned ISel::ComputeRegPressure(SDOperand O) {
Result = MaxRegUse+NumExtraMaxRegUsers;
}
+
//std::cerr << " WEIGHT: " << Result << " "; N->dump(); std::cerr << "\n";
return Result;
}
@@ -1106,6 +1107,20 @@ unsigned ISel::SelectExpr(SDOperand N) {
return Result;
}
case ISD::TRUNCATE:
+ // Fold TRUNCATE (LOAD P) into a smaller load from P.
+ if (isFoldableLoad(N.getOperand(0))) {
+ switch (N.getValueType()) {
+ default: assert(0 && "Unknown truncate!");
+ case MVT::i1:
+ case MVT::i8: Opc = X86::MOV8rm; break;
+ case MVT::i16: Opc = X86::MOV16rm; break;
+ }
+ X86AddressMode AM;
+ EmitFoldedLoad(N.getOperand(0), AM);
+ addFullAddress(BuildMI(BB, Opc, 4, Result), AM);
+ return Result;
+ }
+
// Handle cast of LARGER int to SMALLER int using a move to EAX followed by
// a move out of AX or AL.
switch (N.getOperand(0).getValueType()) {
OpenPOWER on IntegriCloud