[llvm] d485317 - [TargetLowering] Emit SIGN_EXTEND_INREG instead of shift pair from optimizeSetCCOfSignedTruncationCheck. (#81785)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 15 09:24:06 PST 2024
Author: Craig Topper
Date: 2024-02-15T09:24:02-08:00
New Revision: d485317357376ba6335fe7116efec8edcebd689c
URL: https://github.com/llvm/llvm-project/commit/d485317357376ba6335fe7116efec8edcebd689c
DIFF: https://github.com/llvm/llvm-project/commit/d485317357376ba6335fe7116efec8edcebd689c.diff
LOG: [TargetLowering] Emit SIGN_EXTEND_INREG instead of shift pair from optimizeSetCCOfSignedTruncationCheck. (#81785)
sext_inreg is our canonical form of shift pair before op legalization so
DAG combiner will probably create it anyway. If it isn't legal
LegalizeDAG will expand to shifts later.
Added:
Modified:
llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index a4987de43779af..f689cd120ecbdc 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -4084,17 +4084,12 @@ SDValue TargetLowering::optimizeSetCCOfSignedTruncationCheck(
XVT, KeptBits))
return SDValue();
- const unsigned MaskedBits = XVT.getSizeInBits() - KeptBits;
- assert(MaskedBits > 0 && MaskedBits < XVT.getSizeInBits() && "unreachable");
-
- // Unfold into: ((%x << C) a>> C) cond %x
+ // Unfold into: sext_inreg(%x) cond %x
// Where 'cond' will be either 'eq' or 'ne'.
- SDValue ShiftAmt = DAG.getConstant(MaskedBits, DL, XVT);
- SDValue T0 = DAG.getNode(ISD::SHL, DL, XVT, X, ShiftAmt);
- SDValue T1 = DAG.getNode(ISD::SRA, DL, XVT, T0, ShiftAmt);
- SDValue T2 = DAG.getSetCC(DL, SCCVT, T1, X, NewCond);
-
- return T2;
+ SDValue SExtInReg = DAG.getNode(
+ ISD::SIGN_EXTEND_INREG, DL, XVT, X,
+ DAG.getValueType(EVT::getIntegerVT(*DAG.getContext(), KeptBits)));
+ return DAG.getSetCC(DL, SCCVT, SExtInReg, X, NewCond);
}
// (X & (C l>>/<< Y)) ==/!= 0 --> ((X <</l>> Y) & C) ==/!= 0
More information about the llvm-commits
mailing list