[PATCH] Vselect improvements
Matt Arsenault
Matthew.Arsenault at amd.com
Mon Jun 3 13:43:00 PDT 2013
Remove PromoteVectorOp part
Hi nadav,
http://llvm-reviews.chandlerc.com/D903
CHANGE SINCE LAST DIFF
http://llvm-reviews.chandlerc.com/D903?vs=2217&id=2253#toc
Files:
lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp
lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
lib/CodeGen/SelectionDAG/SelectionDAG.cpp
Index: lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
===================================================================
--- lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+++ lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
@@ -3659,16 +3659,28 @@
Tmp3 = Node->getOperand(2); // True
Tmp4 = Node->getOperand(3); // False
SDValue CC = Node->getOperand(4);
+ ISD::CondCode CCCode = cast<CondCodeSDNode>(CC)->get();
+ EVT LHSVT = Tmp1.getValueType();
+ EVT LSetCCType = getSetCCResultType(LHSVT);
+
+ if (TLI.getCondCodeAction(CCCode, LSetCCType.getSimpleVT())
+ == TargetLowering::Legal) {
+ // The condition is legal, lets expand into setcc + [v]select.
+ Tmp1 = DAG.getSetCC(dl, LSetCCType, Tmp1, Tmp2, CCCode);
+ Tmp1 = DAG.getSelect(dl, Node->getValueType(0), Tmp1, Tmp3, Tmp4);
+ } else {
+ LegalizeSetCCCondCode(LSetCCType.getSimpleVT(),
+ Tmp1, Tmp2, CC, dl);
+ // The condition is illegal, but we have a valid convesions.
+ // Lets convert to SELECT_CC with a legal CC.
+ assert(!Tmp2.getNode() &&
+ "Can't legalize SELECT_CC with legal condition!");
- LegalizeSetCCCondCode(getSetCCResultType(Tmp1.getValueType()),
- Tmp1, Tmp2, CC, dl);
+ Tmp2 = DAG.getConstant(0, LHSVT);
+ Tmp1 = DAG.getSelectCC(dl, Tmp1, Tmp2,
+ Tmp3, Tmp4, ISD::SETNE);
+ }
- assert(!Tmp2.getNode() && "Can't legalize SELECT_CC with legal condition!");
- Tmp2 = DAG.getConstant(0, Tmp1.getValueType());
- CC = DAG.getCondCode(ISD::SETNE);
- Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, Node->getValueType(0), Tmp1, Tmp2,
- Tmp3, Tmp4, CC);
- Results.push_back(Tmp1);
break;
}
case ISD::BR_CC: {
@@ -3826,8 +3838,15 @@
case ISD::XOR: {
unsigned ExtOp, TruncOp;
if (OVT.isVector()) {
- ExtOp = ISD::BITCAST;
- TruncOp = ISD::BITCAST;
+ if (OVT.getSizeInBits() == NVT.getSizeInBits()) {
+ ExtOp = ISD::BITCAST;
+ TruncOp = ISD::BITCAST;
+ } else if (OVT.getVectorNumElements() == NVT.getVectorNumElements()) {
+ ExtOp = ISD::SIGN_EXTEND;
+ TruncOp = ISD::TRUNCATE;
+ } else {
+ llvm_unreachable("Cannot determine what operations to execute!");
+ }
} else {
assert(OVT.isInteger() && "Cannot promote logic operation");
ExtOp = ISD::ANY_EXTEND;
Index: lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp
===================================================================
--- lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp
+++ lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp
@@ -490,10 +490,10 @@
SDValue Cond = N->getOperand(0);
CL = CH = Cond;
if (Cond.getValueType().isVector()) {
- assert(Cond.getValueType().getVectorElementType() == MVT::i1 &&
- "Condition legalized before result?");
- unsigned NumElements = Cond.getValueType().getVectorNumElements();
- EVT VCondTy = EVT::getVectorVT(*DAG.getContext(), MVT::i1, NumElements / 2);
+ EVT CondVT = Cond.getValueType();
+ unsigned NumElements = CondVT.getVectorNumElements();
+ EVT VCondTy = EVT::getVectorVT(*DAG.getContext(),
+ CondVT.getVectorElementType(), NumElements / 2);
CL = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, VCondTy, Cond,
DAG.getIntPtrConstant(0));
CH = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, VCondTy, Cond,
Index: lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
===================================================================
--- lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
+++ lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
@@ -268,9 +268,13 @@
case TargetLowering::ZeroOrNegativeOneBooleanContent:
assert(VecBool == TargetLowering::UndefinedBooleanContent ||
VecBool == TargetLowering::ZeroOrOneBooleanContent);
- // Vector reads from a one, scalar from all ones so sign extend.
- Cond = DAG.getNode(ISD::SIGN_EXTEND_INREG, SDLoc(N), CondVT,
- Cond, DAG.getValueType(MVT::i1));
+
+ if (CondVT.getScalarType() == MVT::i1) {
+ // Vector reads from a one, scalar from all ones so sign extend.
+ Cond = DAG.getNode(ISD::SIGN_EXTEND_INREG, SDLoc(N), CondVT,
+ Cond, DAG.getValueType(MVT::i1));
+ }
+
break;
}
}
@@ -307,7 +311,8 @@
SDLoc DL(N);
// Turn it into a scalar SETCC.
- return DAG.getNode(ISD::SETCC, DL, MVT::i1, LHS, RHS, N->getOperand(2));
+ return DAG.getNode(ISD::SETCC, DL, N->getValueType(0),
+ LHS, RHS, N->getOperand(2));
}
SDValue DAGTypeLegalizer::ScalarizeVecRes_UNDEF(SDNode *N) {
@@ -334,7 +339,7 @@
SDLoc DL(N);
// Turn it into a scalar SETCC.
- SDValue Res = DAG.getNode(ISD::SETCC, DL, MVT::i1, LHS, RHS,
+ SDValue Res = DAG.getNode(ISD::SETCC, DL, NVT, LHS, RHS,
N->getOperand(2));
// Vectors may have a different boolean contents to scalars. Promote the
// value appropriately.
Index: lib/CodeGen/SelectionDAG/SelectionDAG.cpp
===================================================================
--- lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -1766,6 +1766,8 @@
return;
}
case ISD::SELECT:
+ assert(!Op.getOperand(0).getValueType().isVector() &&
+ "Should use ISD::VSELECT for vector select!");
ComputeMaskedBits(Op.getOperand(2), KnownZero, KnownOne, Depth+1);
ComputeMaskedBits(Op.getOperand(1), KnownZero2, KnownOne2, Depth+1);
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
@@ -3290,6 +3292,8 @@
break;
}
case ISD::SELECT:
+ assert(!N1.getValueType().isVector() &&
+ "Should use ISD::VSELECT for vector select!");
if (N1C) {
if (N1C->getZExtValue())
return N2; // select true, X, Y -> X
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D903.2.patch
Type: text/x-patch
Size: 5956 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130603/da22c8ed/attachment.bin>
More information about the llvm-commits
mailing list