diff options
author | Craig Topper <craig.topper@gmail.com> | 2016-11-26 18:43:24 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@gmail.com> | 2016-11-26 18:43:24 +0000 |
commit | e266e126ff4f20b48918f48106f470184dabcba1 (patch) | |
tree | 8f17094af522b1072f198031d2858fd6bfa7a858 /llvm/lib/Target/X86/X86ISelDAGToDAG.cpp | |
parent | d3ab1a390537e5801530f31576f5647acf1cfd67 (diff) | |
download | bcm5719-llvm-e266e126ff4f20b48918f48106f470184dabcba1.tar.gz bcm5719-llvm-e266e126ff4f20b48918f48106f470184dabcba1.zip |
[X86] Fix the zero extending load detection in X86DAGToDAGISel::selectScalarSSELoad to pass the load node to IsProfitableToFold and IsLegalToFold.
Previously we were passing the SCALAR_TO_VECTOR node.
llvm-svn: 287986
Diffstat (limited to 'llvm/lib/Target/X86/X86ISelDAGToDAG.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelDAGToDAG.cpp | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp index e760e18d2b7..17b0a82d8a4 100644 --- a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp +++ b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp @@ -1533,18 +1533,19 @@ bool X86DAGToDAGISel::selectScalarSSELoad(SDNode *Root, if (N.getOpcode() == X86ISD::VZEXT_MOVL && N.getNode()->hasOneUse() && // Check to see if the top elements are all zeros (or bitcast of zeros). N.getOperand(0).getOpcode() == ISD::SCALAR_TO_VECTOR && - N.getOperand(0).getNode()->hasOneUse() && - ISD::isNON_EXTLoad(N.getOperand(0).getOperand(0).getNode()) && - N.getOperand(0).getOperand(0).hasOneUse() && - IsProfitableToFold(N.getOperand(0), N.getNode(), Root) && - IsLegalToFold(N.getOperand(0), N.getNode(), Root, OptLevel)) { - // Okay, this is a zero extending load. Fold it. - LoadSDNode *LD = cast<LoadSDNode>(N.getOperand(0).getOperand(0)); - if (!selectAddr(LD, LD->getBasePtr(), Base, Scale, Index, Disp, Segment)) - return false; - PatternNodeWithChain = SDValue(LD, 0); - return true; + N.getOperand(0).getNode()->hasOneUse()) { + PatternNodeWithChain = N.getOperand(0).getOperand(0); + if (ISD::isNON_EXTLoad(PatternNodeWithChain.getNode()) && + PatternNodeWithChain.hasOneUse() && + IsProfitableToFold(PatternNodeWithChain, N.getNode(), Root) && + IsLegalToFold(PatternNodeWithChain, N.getNode(), Root, OptLevel)) { + // Okay, this is a zero extending load. Fold it. + LoadSDNode *LD = cast<LoadSDNode>(PatternNodeWithChain); + return selectAddr(LD, LD->getBasePtr(), Base, Scale, Index, Disp, + Segment); + } } + return false; } |