[PATCH] D16803: Use ComputeNumSignBits to fold (sext_inreg (trunc x)) -> (trunc x)
Vasileios Kalintiris via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 2 04:09:04 PST 2016
vkalintiris created this revision.
vkalintiris added a reviewer: dsanders.
vkalintiris added a subscriber: llvm-commits.
If x's number of sign bits is greater than the number of sign bits
introduced by the sext_inreg, then we can skip the sign extension.
I can't think of any way to test this. I tried to using csmith without any
luck. This patch is intended for D16220.
http://reviews.llvm.org/D16803
Files:
lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Index: lib/CodeGen/SelectionDAG/DAGCombiner.cpp
===================================================================
--- lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -6915,6 +6915,16 @@
return DAG.getNode(ISD::SIGN_EXTEND, SDLoc(N), VT, N00, N1);
}
+ // fold (sext_in_reg (trunc x)) -> (trunc x) if x's sign bits start from
+ // EVTBits.
+ if (N0.getOpcode() == ISD::TRUNCATE) {
+ unsigned N00VTBits = N0.getOperand(0).getValueType().getSizeInBits();
+ unsigned N00NSB = DAG.ComputeNumSignBits(N0.getOperand(0));
+
+ if ((N00VTBits - N00NSB + 1) <= EVTBits)
+ return N0;
+ }
+
// fold (sext_in_reg x) -> (zext_in_reg x) if the sign bit is known zero.
if (DAG.MaskedValueIsZero(N0, APInt::getBitsSet(VTBits, EVTBits-1, EVTBits)))
return DAG.getZeroExtendInReg(N0, SDLoc(N), EVT);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D16803.46637.patch
Type: text/x-patch
Size: 863 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160202/10e0d4b1/attachment.bin>
More information about the llvm-commits
mailing list