mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-06 03:08:43 +00:00
Added DAG xforms. e.g.
(vextract (v4f32 s2v (f32 load $addr)), 0) -> (f32 load $addr) (vextract (v4i32 bc (v4f32 s2v (f32 load $addr))), 0) -> (i32 load $addr) Remove x86 specific patterns. llvm-svn: 42677
This commit is contained in:
parent
9b7ac95116
commit
dc95020e30
@ -263,6 +263,7 @@ namespace {
|
|||||||
SDOperand visitLOAD(SDNode *N);
|
SDOperand visitLOAD(SDNode *N);
|
||||||
SDOperand visitSTORE(SDNode *N);
|
SDOperand visitSTORE(SDNode *N);
|
||||||
SDOperand visitINSERT_VECTOR_ELT(SDNode *N);
|
SDOperand visitINSERT_VECTOR_ELT(SDNode *N);
|
||||||
|
SDOperand visitEXTRACT_VECTOR_ELT(SDNode *N);
|
||||||
SDOperand visitBUILD_VECTOR(SDNode *N);
|
SDOperand visitBUILD_VECTOR(SDNode *N);
|
||||||
SDOperand visitCONCAT_VECTORS(SDNode *N);
|
SDOperand visitCONCAT_VECTORS(SDNode *N);
|
||||||
SDOperand visitVECTOR_SHUFFLE(SDNode *N);
|
SDOperand visitVECTOR_SHUFFLE(SDNode *N);
|
||||||
@ -682,6 +683,7 @@ SDOperand DAGCombiner::visit(SDNode *N) {
|
|||||||
case ISD::LOAD: return visitLOAD(N);
|
case ISD::LOAD: return visitLOAD(N);
|
||||||
case ISD::STORE: return visitSTORE(N);
|
case ISD::STORE: return visitSTORE(N);
|
||||||
case ISD::INSERT_VECTOR_ELT: return visitINSERT_VECTOR_ELT(N);
|
case ISD::INSERT_VECTOR_ELT: return visitINSERT_VECTOR_ELT(N);
|
||||||
|
case ISD::EXTRACT_VECTOR_ELT: return visitEXTRACT_VECTOR_ELT(N);
|
||||||
case ISD::BUILD_VECTOR: return visitBUILD_VECTOR(N);
|
case ISD::BUILD_VECTOR: return visitBUILD_VECTOR(N);
|
||||||
case ISD::CONCAT_VECTORS: return visitCONCAT_VECTORS(N);
|
case ISD::CONCAT_VECTORS: return visitCONCAT_VECTORS(N);
|
||||||
case ISD::VECTOR_SHUFFLE: return visitVECTOR_SHUFFLE(N);
|
case ISD::VECTOR_SHUFFLE: return visitVECTOR_SHUFFLE(N);
|
||||||
@ -2907,9 +2909,8 @@ SDOperand DAGCombiner::visitBIT_CONVERT(SDNode *N) {
|
|||||||
return DAG.getNode(ISD::BIT_CONVERT, VT, N0.getOperand(0));
|
return DAG.getNode(ISD::BIT_CONVERT, VT, N0.getOperand(0));
|
||||||
|
|
||||||
// fold (conv (load x)) -> (load (conv*)x)
|
// fold (conv (load x)) -> (load (conv*)x)
|
||||||
// If the resultant load doesn't need a higher alignment than the original!
|
// If the resultant load doesn't need a higher alignment than the original!
|
||||||
if (ISD::isNON_EXTLoad(N0.Val) && N0.hasOneUse() &&
|
if (ISD::isNormalLoad(N0.Val) && N0.hasOneUse() &&
|
||||||
ISD::isUNINDEXEDLoad(N0.Val) &&
|
|
||||||
TLI.isOperationLegal(ISD::LOAD, VT)) {
|
TLI.isOperationLegal(ISD::LOAD, VT)) {
|
||||||
LoadSDNode *LN0 = cast<LoadSDNode>(N0);
|
LoadSDNode *LN0 = cast<LoadSDNode>(N0);
|
||||||
unsigned Align = TLI.getTargetMachine().getTargetData()->
|
unsigned Align = TLI.getTargetMachine().getTargetData()->
|
||||||
@ -3901,6 +3902,54 @@ SDOperand DAGCombiner::visitINSERT_VECTOR_ELT(SDNode *N) {
|
|||||||
return SDOperand();
|
return SDOperand();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDOperand DAGCombiner::visitEXTRACT_VECTOR_ELT(SDNode *N) {
|
||||||
|
SDOperand InVec = N->getOperand(0);
|
||||||
|
SDOperand EltNo = N->getOperand(1);
|
||||||
|
|
||||||
|
// (vextract (v4f32 s2v (f32 load $addr)), 0) -> (f32 load $addr)
|
||||||
|
// (vextract (v4i32 bc (v4f32 s2v (f32 load $addr))), 0) -> (i32 load $addr)
|
||||||
|
if (isa<ConstantSDNode>(EltNo)) {
|
||||||
|
unsigned Elt = cast<ConstantSDNode>(EltNo)->getValue();
|
||||||
|
bool NewLoad = false;
|
||||||
|
if (Elt == 0) {
|
||||||
|
MVT::ValueType VT = InVec.getValueType();
|
||||||
|
MVT::ValueType EVT = MVT::getVectorElementType(VT);
|
||||||
|
MVT::ValueType LVT = EVT;
|
||||||
|
unsigned NumElts = MVT::getVectorNumElements(VT);
|
||||||
|
if (InVec.getOpcode() == ISD::BIT_CONVERT) {
|
||||||
|
MVT::ValueType BCVT = InVec.getOperand(0).getValueType();
|
||||||
|
if (NumElts != MVT::getVectorNumElements(BCVT))
|
||||||
|
return SDOperand();
|
||||||
|
InVec = InVec.getOperand(0);
|
||||||
|
EVT = MVT::getVectorElementType(BCVT);
|
||||||
|
NewLoad = true;
|
||||||
|
}
|
||||||
|
if (InVec.getOpcode() == ISD::SCALAR_TO_VECTOR &&
|
||||||
|
InVec.getOperand(0).getValueType() == EVT &&
|
||||||
|
ISD::isNormalLoad(InVec.getOperand(0).Val) &&
|
||||||
|
InVec.getOperand(0).hasOneUse()) {
|
||||||
|
LoadSDNode *LN0 = cast<LoadSDNode>(InVec.getOperand(0));
|
||||||
|
unsigned Align = LN0->getAlignment();
|
||||||
|
if (NewLoad) {
|
||||||
|
// Check the resultant load doesn't need a higher alignment than the
|
||||||
|
// original load.
|
||||||
|
unsigned NewAlign = TLI.getTargetMachine().getTargetData()->
|
||||||
|
getABITypeAlignment(MVT::getTypeForValueType(LVT));
|
||||||
|
if (!TLI.isOperationLegal(ISD::LOAD, LVT) || NewAlign > Align)
|
||||||
|
return SDOperand();
|
||||||
|
Align = NewAlign;
|
||||||
|
}
|
||||||
|
|
||||||
|
return DAG.getLoad(LVT, LN0->getChain(), LN0->getBasePtr(),
|
||||||
|
LN0->getSrcValue(), LN0->getSrcValueOffset(),
|
||||||
|
LN0->isVolatile(), Align);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return SDOperand();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
SDOperand DAGCombiner::visitBUILD_VECTOR(SDNode *N) {
|
SDOperand DAGCombiner::visitBUILD_VECTOR(SDNode *N) {
|
||||||
unsigned NumInScalars = N->getNumOperands();
|
unsigned NumInScalars = N->getNumOperands();
|
||||||
MVT::ValueType VT = N->getValueType(0);
|
MVT::ValueType VT = N->getValueType(0);
|
||||||
|
@ -2942,11 +2942,3 @@ def : Pat<(store (v8i16 VR128:$src), addr:$dst),
|
|||||||
(MOVUPSmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
|
(MOVUPSmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
|
||||||
def : Pat<(store (v16i8 VR128:$src), addr:$dst),
|
def : Pat<(store (v16i8 VR128:$src), addr:$dst),
|
||||||
(MOVUPSmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
|
(MOVUPSmr addr:$dst, VR128:$src)>, Requires<[HasSSE2]>;
|
||||||
|
|
||||||
// (vextract (v4i32 bc (v4f32 s2v (f32 load $addr))), 0) -> (i32 load $addr)
|
|
||||||
def : Pat<(vector_extract
|
|
||||||
(bc_v4i32 (v4f32 (scalar_to_vector (loadf32 addr:$src)))), (iPTR 0)),
|
|
||||||
(MOV32rm addr:$src)>, Requires<[HasSSE2]>;
|
|
||||||
def : Pat<(vector_extract
|
|
||||||
(bc_v2i64 (v2f64 (scalar_to_vector (loadf64 addr:$src)))), (iPTR 0)),
|
|
||||||
(MOV64rm addr:$src)>, Requires<[HasSSE2, In64BitMode]>;
|
|
||||||
|
Loading…
Reference in New Issue
Block a user