[llvm] [TargetLowering] Emit SIGN_EXTEND_INREG instead of shift pair from optimizeSetCCOfSignedTruncationCheck. (PR #81785)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 14 12:52:58 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-selectiondag
Author: Craig Topper (topperc)
<details>
<summary>Changes</summary>
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 get expand to shifts later.
---
Full diff: https://github.com/llvm/llvm-project/pull/81785.diff
1 Files Affected:
- (modified) llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp (+5-10)
``````````diff
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index a4987de43779af..008db00f886b5a 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
``````````
</details>
https://github.com/llvm/llvm-project/pull/81785
More information about the llvm-commits
mailing list