[llvm] [X86] Fold concat(PCMP*(), PCMP*()) -> CMPPS(concat, concat) on AVX1 targets (PR #95915)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 27 03:34:02 PDT 2024
================
@@ -56111,11 +56133,50 @@ static SDValue combineConcatVectorOps(const SDLoc &DL, MVT VT,
break;
case X86ISD::PCMPEQ:
case X86ISD::PCMPGT:
- if (!IsSplat && VT.is256BitVector() && Subtarget.hasInt256() &&
+ if (!IsSplat && VT.is256BitVector() &&
+ (Subtarget.hasInt256() || VT == MVT::v8i32) &&
(IsConcatFree(VT, Ops, 0) || IsConcatFree(VT, Ops, 1))) {
- return DAG.getNode(Op0.getOpcode(), DL, VT,
- ConcatSubOperand(VT, Ops, 0),
- ConcatSubOperand(VT, Ops, 1));
+ if (Subtarget.hasInt256())
+ return DAG.getNode(Op0.getOpcode(), DL, VT,
+ ConcatSubOperand(VT, Ops, 0),
+ ConcatSubOperand(VT, Ops, 1));
+
+ // Without AVX2, see if we can cast the values to v8f32 and use fcmp.
+ // TODO: Handle v4f64 as well?
+ unsigned MaxSigBitsLHS = 0, MaxSigBitsRHS = 0;
+ for (unsigned I = 0; I != NumOps; ++I) {
+ MaxSigBitsLHS =
+ std::max(MaxSigBitsLHS,
+ DAG.ComputeMaxSignificantBits(Ops[I].getOperand(0)));
+ MaxSigBitsRHS =
+ std::max(MaxSigBitsRHS,
+ DAG.ComputeMaxSignificantBits(Ops[I].getOperand(1)));
+ if (MaxSigBitsLHS == EltSizeInBits && MaxSigBitsRHS == EltSizeInBits)
----------------
goldsteinn wrote:
Ah yes :)
https://github.com/llvm/llvm-project/pull/95915
More information about the llvm-commits
mailing list