From a28f178132c068c99365f5e37fbb2d106f202cb0 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Tue, 15 Oct 2019 06:10:11 +0000 Subject: [PATCH] [X86] Don't check for VBROADCAST_LOAD being a user of the source of a VBROADCAST when trying to share broadcasts. The only things VBROADCAST_LOAD uses is an address and a chain node. It has no vector inputs. So if its a user of the source of another broadcast that could only mean one of two things. The other broadcast is broadcasting the address of the broadcast_load. Or the source is a load and the use we're seeing is the chain result from that load. Neither of these cases make sense to combine here. This issue was reported post-commit r373871. Test case has not been reduced yet. llvm-svn: 374862 --- lib/Target/X86/X86ISelLowering.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index c649a90ddff..0e5a397fa93 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -33450,9 +33450,7 @@ static SDValue combineTargetShuffle(SDValue N, SelectionDAG &DAG, // Share broadcast with the longest vector and extract low subvector (free). for (SDNode *User : Src->uses()) - if (User != N.getNode() && - (User->getOpcode() == X86ISD::VBROADCAST || - User->getOpcode() == X86ISD::VBROADCAST_LOAD) && + if (User != N.getNode() && User->getOpcode() == X86ISD::VBROADCAST && User->getValueSizeInBits(0) > VT.getSizeInBits()) { return extractSubVector(SDValue(User, 0), 0, DAG, DL, VT.getSizeInBits());