aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-08-29 01:01:01 +0000
committerChris Lattner <sabre@nondot.org>2005-08-29 01:01:01 +0000
commit2fef809b5b6a38d38aadc3399b5f7a78b537d092 (patch)
tree74f1d3dec81329762ba533a87cd574b01c9e2bc4
parent2a06a5ef363382479e74cae2d39f139e11f40225 (diff)
A hack to fix a problem folding immedaites. This fixes Olden/power.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23126 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/PowerPC/PPCISelDAGToDAG.cpp12
1 files changed, 8 insertions, 4 deletions
diff --git a/lib/Target/PowerPC/PPCISelDAGToDAG.cpp b/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
index 89f0f64223..2503e26e61 100644
--- a/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
+++ b/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
@@ -685,16 +685,20 @@ SDOperand PPC32DAGToDAGISel::Select(SDOperand Op) {
unsigned v = (unsigned)cast<ConstantSDNode>(N)->getValue();
unsigned Hi = HA16(v);
unsigned Lo = Lo16(v);
+
+ // NOTE: This doesn't use SelectNodeTo, because doing that will prevent
+ // folding shared immediates into other the second instruction that
+ // uses it.
if (Hi && Lo) {
SDOperand Top = CurDAG->getTargetNode(PPC::LIS, MVT::i32,
getI32Imm(v >> 16));
- CurDAG->SelectNodeTo(N, PPC::ORI, MVT::i32, Top, getI32Imm(v & 0xFFFF));
+ return CurDAG->getTargetNode(PPC::ORI, MVT::i32, Top,
+ getI32Imm(v & 0xFFFF));
} else if (Lo) {
- CurDAG->SelectNodeTo(N, PPC::LI, MVT::i32, getI32Imm(v));
+ return CurDAG->getTargetNode(PPC::LI, MVT::i32, getI32Imm(v));
} else {
- CurDAG->SelectNodeTo(N, PPC::LIS, MVT::i32, getI32Imm(v >> 16));
+ return CurDAG->getTargetNode(PPC::LIS, MVT::i32, getI32Imm(v >> 16));
}
- break;
}
case ISD::UNDEF:
if (N->getValueType(0) == MVT::i32)