mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 20:29:53 +00:00
Add VSELECT to LegalizeVectorTypes::ScalariseVectorResult. Previously it would crash if it encountered a 1 element VSELECT. Solution is slightly more complicated than just creating a SELET as we have to mask or sign extend the vector condition if it had different boolean contents from the scalar condition. Fixes <rdar://problem/11178095>
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153976 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
dda3a099a0
commit
2ce63c7352
@ -521,6 +521,7 @@ private:
|
||||
SDValue ScalarizeVecRes_LOAD(LoadSDNode *N);
|
||||
SDValue ScalarizeVecRes_SCALAR_TO_VECTOR(SDNode *N);
|
||||
SDValue ScalarizeVecRes_SIGN_EXTEND_INREG(SDNode *N);
|
||||
SDValue ScalarizeVecRes_VSELECT(SDNode *N);
|
||||
SDValue ScalarizeVecRes_SELECT(SDNode *N);
|
||||
SDValue ScalarizeVecRes_SELECT_CC(SDNode *N);
|
||||
SDValue ScalarizeVecRes_SETCC(SDNode *N);
|
||||
|
@ -58,6 +58,7 @@ void DAGTypeLegalizer::ScalarizeVectorResult(SDNode *N, unsigned ResNo) {
|
||||
case ISD::LOAD: R = ScalarizeVecRes_LOAD(cast<LoadSDNode>(N));break;
|
||||
case ISD::SCALAR_TO_VECTOR: R = ScalarizeVecRes_SCALAR_TO_VECTOR(N); break;
|
||||
case ISD::SIGN_EXTEND_INREG: R = ScalarizeVecRes_InregOp(N); break;
|
||||
case ISD::VSELECT: R = ScalarizeVecRes_VSELECT(N); break;
|
||||
case ISD::SELECT: R = ScalarizeVecRes_SELECT(N); break;
|
||||
case ISD::SELECT_CC: R = ScalarizeVecRes_SELECT_CC(N); break;
|
||||
case ISD::SETCC: R = ScalarizeVecRes_SETCC(N); break;
|
||||
@ -226,6 +227,38 @@ SDValue DAGTypeLegalizer::ScalarizeVecRes_SCALAR_TO_VECTOR(SDNode *N) {
|
||||
return InOp;
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::ScalarizeVecRes_VSELECT(SDNode *N) {
|
||||
SDValue Cond = GetScalarizedVector(N->getOperand(0));
|
||||
SDValue LHS = GetScalarizedVector(N->getOperand(1));
|
||||
TargetLowering::BooleanContent ScalarBool = TLI.getBooleanContents(false);
|
||||
TargetLowering::BooleanContent VecBool = TLI.getBooleanContents(true);
|
||||
if (ScalarBool != VecBool) {
|
||||
EVT CondVT = Cond.getValueType();
|
||||
switch (ScalarBool) {
|
||||
default: llvm_unreachable("Unknown boolean content enum");
|
||||
case TargetLowering::UndefinedBooleanContent:
|
||||
break;
|
||||
case TargetLowering::ZeroOrOneBooleanContent:
|
||||
assert(VecBool == TargetLowering::UndefinedBooleanContent ||
|
||||
VecBool == TargetLowering::ZeroOrNegativeOneBooleanContent);
|
||||
// Vector read from all ones, scalar expects a single 1 so mask.
|
||||
Cond = DAG.getNode(ISD::AND, N->getDebugLoc(), CondVT,
|
||||
Cond, DAG.getConstant(1, CondVT));
|
||||
break;
|
||||
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, N->getDebugLoc(), CondVT,
|
||||
Cond, DAG.getValueType(MVT::i1));
|
||||
break;
|
||||
}
|
||||
}
|
||||
return DAG.getNode(ISD::SELECT, N->getDebugLoc(),
|
||||
LHS.getValueType(), Cond, LHS,
|
||||
GetScalarizedVector(N->getOperand(2)));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::ScalarizeVecRes_SELECT(SDNode *N) {
|
||||
SDValue LHS = GetScalarizedVector(N->getOperand(1));
|
||||
return DAG.getNode(ISD::SELECT, N->getDebugLoc(),
|
||||
|
@ -185,3 +185,11 @@ define i32 @checkFoldGEP(%Domain* %D, i64 %idx) {
|
||||
ret i32 %reg820
|
||||
}
|
||||
|
||||
; Test case for scalarising a 1 element vselect
|
||||
;
|
||||
define <1 x i32> @checkScalariseVSELECT(<1 x i32> %a, <1 x i32> %b) {
|
||||
%cond = icmp uge <1 x i32> %a, %b
|
||||
%s = select <1 x i1> %cond, <1 x i32> %a, <1 x i32> %b
|
||||
ret <1 x i32> %s
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user