mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-17 00:57:54 +00:00
Add support for promoting SETCC operations.
llvm-svn: 76987
This commit is contained in:
parent
e01fec5446
commit
5ca1bdc613
@ -797,14 +797,17 @@ public:
|
||||
struct DAGCombinerInfo {
|
||||
void *DC; // The DAG Combiner object.
|
||||
bool BeforeLegalize;
|
||||
bool BeforeLegalizeOps;
|
||||
bool CalledByLegalizer;
|
||||
public:
|
||||
SelectionDAG &DAG;
|
||||
|
||||
DAGCombinerInfo(SelectionDAG &dag, bool bl, bool cl, void *dc)
|
||||
: DC(dc), BeforeLegalize(bl), CalledByLegalizer(cl), DAG(dag) {}
|
||||
DAGCombinerInfo(SelectionDAG &dag, bool bl, bool blo, bool cl, void *dc)
|
||||
: DC(dc), BeforeLegalize(bl), BeforeLegalizeOps(blo),
|
||||
CalledByLegalizer(cl), DAG(dag) {}
|
||||
|
||||
bool isBeforeLegalize() const { return BeforeLegalize; }
|
||||
bool isBeforeLegalizeOps() const { return BeforeLegalizeOps; }
|
||||
bool isCalledByLegalizer() const { return CalledByLegalizer; }
|
||||
|
||||
void AddToWorklist(SDNode *N);
|
||||
|
@ -802,7 +802,7 @@ SDValue DAGCombiner::combine(SDNode *N) {
|
||||
|
||||
// Expose the DAG combiner to the target combiner impls.
|
||||
TargetLowering::DAGCombinerInfo
|
||||
DagCombineInfo(DAG, Level == Unrestricted, false, this);
|
||||
DagCombineInfo(DAG, !LegalTypes, !LegalOperations, false, this);
|
||||
|
||||
RV = TLI.PerformDAGCombine(N, DagCombineInfo);
|
||||
}
|
||||
@ -6005,7 +6005,7 @@ SDValue DAGCombiner::SimplifySetCC(MVT VT, SDValue N0,
|
||||
SDValue N1, ISD::CondCode Cond,
|
||||
DebugLoc DL, bool foldBooleans) {
|
||||
TargetLowering::DAGCombinerInfo
|
||||
DagCombineInfo(DAG, Level == Unrestricted, false, this);
|
||||
DagCombineInfo(DAG, !LegalTypes, !LegalOperations, false, this);
|
||||
return TLI.SimplifySetCC(VT, N0, N1, Cond, foldBooleans, DagCombineInfo, DL);
|
||||
}
|
||||
|
||||
|
@ -3086,12 +3086,14 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node,
|
||||
break;
|
||||
}
|
||||
case ISD::SETCC: {
|
||||
if (NVT.isInteger())
|
||||
llvm_unreachable("Cannot promote Legal Integer SETCC yet");
|
||||
else {
|
||||
Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0));
|
||||
Tmp2 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(1));
|
||||
unsigned ExtOp = ISD::FP_EXTEND;
|
||||
if (NVT.isInteger()) {
|
||||
ISD::CondCode CCCode =
|
||||
cast<CondCodeSDNode>(Node->getOperand(2))->get();
|
||||
ExtOp = isSignedIntSetCC(CCCode) ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
|
||||
}
|
||||
Tmp1 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(0));
|
||||
Tmp2 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(1));
|
||||
Results.push_back(DAG.getNode(ISD::SETCC, dl, Node->getValueType(0),
|
||||
Tmp1, Tmp2, Node->getOperand(2)));
|
||||
break;
|
||||
|
@ -2067,7 +2067,7 @@ void DAGTypeLegalizer::IntegerExpandSetCCOperands(SDValue &NewLHS,
|
||||
|
||||
// NOTE: on targets without efficient SELECT of bools, we can always use
|
||||
// this identity: (B1 ? B2 : B3) --> (B1 & B2)|(!B1&B3)
|
||||
TargetLowering::DAGCombinerInfo DagCombineInfo(DAG, false, true, NULL);
|
||||
TargetLowering::DAGCombinerInfo DagCombineInfo(DAG, false, true, true, NULL);
|
||||
SDValue Tmp1, Tmp2;
|
||||
Tmp1 = TLI.SimplifySetCC(TLI.getSetCCResultType(LHSLo.getValueType()),
|
||||
LHSLo, RHSLo, LowCC, false, DagCombineInfo, dl);
|
||||
|
@ -1641,11 +1641,16 @@ TargetLowering::SimplifySetCC(MVT VT, SDValue N0, SDValue N1,
|
||||
case ISD::SETUGT:
|
||||
case ISD::SETUGE:
|
||||
case ISD::SETULT:
|
||||
case ISD::SETULE:
|
||||
return DAG.getSetCC(dl, VT, N0.getOperand(0),
|
||||
DAG.getConstant(APInt(C1).trunc(InSize),
|
||||
N0.getOperand(0).getValueType()),
|
||||
Cond);
|
||||
case ISD::SETULE: {
|
||||
MVT newVT = N0.getOperand(0).getValueType();
|
||||
if (DCI.isBeforeLegalizeOps() ||
|
||||
(isOperationLegal(ISD::SETCC, newVT) &&
|
||||
getCondCodeAction(Cond, newVT)==Legal))
|
||||
return DAG.getSetCC(dl, VT, N0.getOperand(0),
|
||||
DAG.getConstant(APInt(C1).trunc(InSize), newVT),
|
||||
Cond);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break; // todo, be more careful with signed comparisons
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user