[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Chris Lattner
lattner at cs.uiuc.edu
Mon Feb 27 22:35:47 PST 2006
Changes in directory llvm/lib/CodeGen/SelectionDAG:
DAGCombiner.cpp updated: 1.111 -> 1.112
---
Log message:
Fold "and (LOAD P), 255" -> zextload. This allows us to compile:
unsigned foo3(unsigned *P) { return *P & 255; }
as:
_foo3:
lbz r3, 3(r3)
blr
instead of:
_foo3:
lwz r2, 0(r3)
rlwinm r3, r2, 0, 24, 31
blr
and:
unsigned short foo2(float a) { return a; }
as:
_foo2:
fctiwz f0, f1
stfd f0, -8(r1)
lhz r3, -2(r1)
blr
instead of:
_foo2:
fctiwz f0, f1
stfd f0, -8(r1)
lwz r2, -4(r1)
rlwinm r3, r2, 0, 16, 31
blr
---
Diffs of the changes: (+33 -0)
DAGCombiner.cpp | 33 +++++++++++++++++++++++++++++++++
1 files changed, 33 insertions(+)
Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.111 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.112
--- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.111 Tue Feb 28 00:23:04 2006
+++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Tue Feb 28 00:35:35 2006
@@ -1042,6 +1042,39 @@
return SDOperand();
}
}
+
+ // fold (and (load x), 255) -> (zextload x)
+ if (N1C && N0.getOpcode() == ISD::LOAD && N0.hasOneUse()) {
+ MVT::ValueType EVT;
+ if (N1C->getValue() == 255)
+ EVT = MVT::i8;
+ else if (N1C->getValue() == 65535)
+ EVT = MVT::i16;
+ else if (N1C->getValue() == ~0U)
+ EVT = MVT::i32;
+ else
+ EVT = MVT::Other;
+ if (EVT != MVT::Other) {
+ assert(MVT::getSizeInBits(VT) > MVT::getSizeInBits(EVT) &&
+ "Cannot zext to larger type!");
+ MVT::ValueType PtrType = N0.getOperand(1).getValueType();
+ // For big endian targets, we need to add an offset to the pointer to load
+ // the correct bytes. For little endian systems, we merely need to read
+ // fewer bytes from the same pointer.
+ uint64_t PtrOff = (MVT::getSizeInBits(VT) - MVT::getSizeInBits(EVT)) / 8;
+ SDOperand NewPtr = TLI.isLittleEndian() ? N0.getOperand(1) :
+ DAG.getNode(ISD::ADD, PtrType, N0.getOperand(1),
+ DAG.getConstant(PtrOff, PtrType));
+ WorkList.push_back(NewPtr.Val);
+ SDOperand Load =
+ DAG.getExtLoad(ISD::ZEXTLOAD, VT, N0.getOperand(0), NewPtr,
+ N0.getOperand(2), EVT);
+ WorkList.push_back(N);
+ CombineTo(N0.Val, Load, Load.getValue(1));
+ return SDOperand();
+ }
+ }
+
return SDOperand();
}
More information about the llvm-commits
mailing list