summaryrefslogtreecommitdiff
path: root/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/SelectionDAG/DAGCombiner.cpp')
-rw-r--r--lib/CodeGen/SelectionDAG/DAGCombiner.cpp23
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 7343236e6a..90cd1d3ee2 100644
--- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -4364,6 +4364,29 @@ SDValue DAGCombiner::visitVSELECT(SDNode *N) {
}
}
+ // Treat SETCC as a vector mask and promote the result type based on the
+ // targets expected SETCC result type. This will ensure that SETCC and VSELECT
+ // are both split by the type legalizer. This is done to prevent the type
+ // legalizer from unrolling SETCC into scalar comparions.
+ EVT SelectVT = N->getValueType(0);
+ EVT MaskVT = getSetCCResultType(SelectVT);
+ assert(MaskVT.isVector() && "Expected a vector type.");
+ if (N0.getOpcode() == ISD::SETCC && N0.getValueType() != MaskVT) {
+ SDLoc MaskDL(N0);
+
+ // Extend the mask to the desired value type.
+ ISD::NodeType ExtendCode =
+ TargetLowering::getExtendForContent(TLI.getBooleanContents(true));
+ SDValue Mask = DAG.getNode(ExtendCode, MaskDL, MaskVT, N0);
+
+ AddToWorkList(Mask.getNode());
+
+ SDValue LHS = N->getOperand(1);
+ SDValue RHS = N->getOperand(2);
+
+ return DAG.getNode(ISD::VSELECT, DL, SelectVT, Mask, LHS, RHS);
+ }
+
return SDValue();
}