[llvm] 7e5681c - [DAG] Peek through ZEXT/TRUNC in foldAddSubMasked1
Amaury Séchet via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 19 05:23:47 PST 2023
Author: Amaury Séchet
Date: 2023-01-19T13:23:42Z
New Revision: 7e5681cf295a267de0b8c2216f049d0285a73c4c
URL: https://github.com/llvm/llvm-project/commit/7e5681cf295a267de0b8c2216f049d0285a73c4c
DIFF: https://github.com/llvm/llvm-project/commit/7e5681cf295a267de0b8c2216f049d0285a73c4c.diff
LOG: [DAG] Peek through ZEXT/TRUNC in foldAddSubMasked1
Fix a regression in D141883
Depends on D141883
Reviewed By: lebedev.ri
Differential Revision: https://reviews.llvm.org/D141884
Added:
Modified:
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
llvm/test/CodeGen/X86/known-signbits-vector.ll
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 36c077ae2f12..4e3afebe268f 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -2793,16 +2793,26 @@ static SDValue getAsCarry(const TargetLowering &TLI, SDValue V) {
/// the opcode and bypass the mask operation.
static SDValue foldAddSubMasked1(bool IsAdd, SDValue N0, SDValue N1,
SelectionDAG &DAG, const SDLoc &DL) {
+ if (N1.getOpcode() == ISD::ZERO_EXTEND)
+ N1 = N1.getOperand(0);
+
if (N1.getOpcode() != ISD::AND || !isOneOrOneSplat(N1->getOperand(1)))
return SDValue();
EVT VT = N0.getValueType();
- if (DAG.ComputeNumSignBits(N1.getOperand(0)) != VT.getScalarSizeInBits())
+ SDValue N10 = N1.getOperand(0);
+ if (N10.getValueType() != VT && N10.getOpcode() == ISD::TRUNCATE)
+ N10 = N10.getOperand(0);
+
+ if (N10.getValueType() != VT)
+ return SDValue();
+
+ if (DAG.ComputeNumSignBits(N10) != VT.getScalarSizeInBits())
return SDValue();
// add N0, (and (AssertSext X, i1), 1) --> sub N0, X
// sub N0, (and (AssertSext X, i1), 1) --> add N0, X
- return DAG.getNode(IsAdd ? ISD::SUB : ISD::ADD, DL, VT, N0, N1.getOperand(0));
+ return DAG.getNode(IsAdd ? ISD::SUB : ISD::ADD, DL, VT, N0, N10);
}
/// Helper for doing combines based on N0 and N1 being added to each other.
diff --git a/llvm/test/CodeGen/X86/known-signbits-vector.ll b/llvm/test/CodeGen/X86/known-signbits-vector.ll
index 14619d13ba3d..25d26372af4b 100644
--- a/llvm/test/CodeGen/X86/known-signbits-vector.ll
+++ b/llvm/test/CodeGen/X86/known-signbits-vector.ll
@@ -679,8 +679,6 @@ define i64 @signbits_cmpsd(double %0, double %1) {
; X64: # %bb.0:
; X64-NEXT: vcmpeqsd %xmm1, %xmm0, %xmm0
; X64-NEXT: vmovq %xmm0, %rax
-; X64-NEXT: andl $1, %eax
-; X64-NEXT: negq %rax
; X64-NEXT: retq
%3 = fcmp oeq double %0, %1
%4 = sext i1 %3 to i64
More information about the llvm-commits
mailing list