summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Pilgrim <[email protected]>2025-08-18 11:06:29 +0100
committerGitHub <[email protected]>2025-08-18 11:06:29 +0100
commit681ecae9133b0e54441529d1eb68fb3604333a93 (patch)
tree05ba46092914925de4aabbb89ab21e73cf588db7
parent6842cc556222659256b32883bb2b63ff019100e0 (diff)
[DAG] visitTRUNCATE - test abd legality early to avoid unnecessary computeKnownBits/ComputeNumSignBits calls. NFC. (#154085)upstream/main
isOperationLegal is much cheaper than value tracking
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp7
1 files changed, 4 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 6eb8468e2573..785245b2d9e7 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -16329,8 +16329,9 @@ SDValue DAGCombiner::visitTRUNCATE(SDNode *N) {
break;
case ISD::ABDU:
case ISD::ABDS:
- // (trunc (abdu/abds a, b)) → (abdu/abds (trunc a), (trunc b))
- if (!LegalOperations || N0.hasOneUse()) {
+ // (trunc (abdu/abds a, b)) -> (abdu/abds (trunc a), (trunc b))
+ if ((!LegalOperations || N0.hasOneUse()) &&
+ TLI.isOperationLegal(N0.getOpcode(), VT)) {
EVT SrcVT = N0.getValueType();
EVT TruncVT = VT;
unsigned SrcBits = SrcVT.getScalarSizeInBits();
@@ -16352,7 +16353,7 @@ SDValue DAGCombiner::visitTRUNCATE(SDNode *N) {
CanFold = SignBitsA > NeededBits && SignBitsB > NeededBits;
}
- if (CanFold && TLI.isOperationLegal(N0.getOpcode(), VT)) {
+ if (CanFold) {
SDValue NewA = DAG.getNode(ISD::TRUNCATE, DL, TruncVT, A);
SDValue NewB = DAG.getNode(ISD::TRUNCATE, DL, TruncVT, B);
return DAG.getNode(N0.getOpcode(), DL, TruncVT, NewA, NewB);