From ced1f501ce8ec5dce05d577d7d41bc87b7934946 Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Mon, 9 Jun 2025 15:24:12 +0100 Subject: [PATCH] [X86] IsElementEquivalent - pull out exact matching for same index/op. (#143367) The types must still be vectors matching MaskSize --- llvm/lib/Target/X86/X86ISelLowering.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index eafc4acbb177..244b0f9410b8 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -9790,6 +9790,10 @@ static bool IsElementEquivalent(int MaskSize, SDValue Op, SDValue ExpectedOp, (int)ExpectedVT.getVectorNumElements() != MaskSize) return false; + // Exact match. + if (Idx == ExpectedIdx && Op == ExpectedOp) + return true; + switch (Op.getOpcode()) { case ISD::BUILD_VECTOR: // If the values are build vectors, we can look through them to find @@ -9837,8 +9841,7 @@ static bool IsElementEquivalent(int MaskSize, SDValue Op, SDValue ExpectedOp, SmallVector Mask; DecodeVPERMMask(MaskSize, Op.getConstantOperandVal(1), Mask); SDValue Src = Op.getOperand(0); - return (Mask[Idx] == Mask[ExpectedIdx]) || - IsElementEquivalent(MaskSize, Src, Src, Mask[Idx], + return IsElementEquivalent(MaskSize, Src, Src, Mask[Idx], Mask[ExpectedIdx]); } break;