mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-27 05:32:22 +00:00
Add a DAGCombine for subvector extracts to remove useless chains of
subvector inserts and extracts. Initial patch by Rackover, Zvi with some tweak done by me. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@140204 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f4b841d4e2
commit
e97190fdf8
@ -216,6 +216,7 @@ namespace {
|
||||
SDValue visitEXTRACT_VECTOR_ELT(SDNode *N);
|
||||
SDValue visitBUILD_VECTOR(SDNode *N);
|
||||
SDValue visitCONCAT_VECTORS(SDNode *N);
|
||||
SDValue visitEXTRACT_SUBVECTOR(SDNode *N);
|
||||
SDValue visitVECTOR_SHUFFLE(SDNode *N);
|
||||
SDValue visitMEMBARRIER(SDNode *N);
|
||||
|
||||
@ -1105,6 +1106,7 @@ SDValue DAGCombiner::visit(SDNode *N) {
|
||||
case ISD::EXTRACT_VECTOR_ELT: return visitEXTRACT_VECTOR_ELT(N);
|
||||
case ISD::BUILD_VECTOR: return visitBUILD_VECTOR(N);
|
||||
case ISD::CONCAT_VECTORS: return visitCONCAT_VECTORS(N);
|
||||
case ISD::EXTRACT_SUBVECTOR: return visitEXTRACT_SUBVECTOR(N);
|
||||
case ISD::VECTOR_SHUFFLE: return visitVECTOR_SHUFFLE(N);
|
||||
case ISD::MEMBARRIER: return visitMEMBARRIER(N);
|
||||
}
|
||||
@ -7031,6 +7033,36 @@ SDValue DAGCombiner::visitCONCAT_VECTORS(SDNode *N) {
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
SDValue DAGCombiner::visitEXTRACT_SUBVECTOR(SDNode* N) {
|
||||
EVT NVT = N->getValueType(0);
|
||||
SDValue V = N->getOperand(0);
|
||||
|
||||
if (V->getOpcode() == ISD::INSERT_SUBVECTOR) {
|
||||
// Handle only simple case where vector being inserted and vector
|
||||
// being extracted are of same type, and are half size of larger vectors.
|
||||
EVT BigVT = V->getOperand(0).getValueType();
|
||||
EVT SmallVT = V->getOperand(1).getValueType();
|
||||
if (NVT != SmallVT || NVT.getSizeInBits()*2 != BigVT.getSizeInBits())
|
||||
return SDValue();
|
||||
|
||||
// Combine:
|
||||
// (extract_subvec (insert_subvec V1, V2, InsIdx), ExtIdx)
|
||||
// Into:
|
||||
// indicies are equal => V1
|
||||
// otherwise => (extract_subvec V1, ExtIdx)
|
||||
//
|
||||
SDValue InsIdx = N->getOperand(1);
|
||||
SDValue ExtIdx = V->getOperand(2);
|
||||
|
||||
if (InsIdx == ExtIdx)
|
||||
return V->getOperand(1);
|
||||
return DAG.getNode(ISD::EXTRACT_SUBVECTOR, N->getDebugLoc(), NVT,
|
||||
V->getOperand(0), N->getOperand(1));
|
||||
}
|
||||
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
SDValue DAGCombiner::visitVECTOR_SHUFFLE(SDNode *N) {
|
||||
EVT VT = N->getValueType(0);
|
||||
unsigned NumElts = VT.getVectorNumElements();
|
||||
|
@ -37,3 +37,22 @@ allocas:
|
||||
ret void
|
||||
}
|
||||
|
||||
;; DAG Combine must remove useless vinsertf128 instructions
|
||||
|
||||
; CHECK: DAGCombineA
|
||||
; CHECK-NOT: vinsertf128 $1
|
||||
define <4 x i32> @DAGCombineA(<4 x i32> %v1) nounwind readonly {
|
||||
%1 = shufflevector <4 x i32> %v1, <4 x i32> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
|
||||
%2 = shufflevector <8 x i32> %1, <8 x i32> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
|
||||
ret <4 x i32> %2
|
||||
}
|
||||
|
||||
; CHECK: DAGCombineB
|
||||
; CHECK: vpaddd %xmm
|
||||
; CHECK-NOT: vinsertf128 $1
|
||||
; CHECK: vpaddd %xmm
|
||||
define <8 x i32> @DAGCombineB(<8 x i32> %v1, <8 x i32> %v2) nounwind readonly {
|
||||
%1 = add <8 x i32> %v1, %v2
|
||||
%2 = add <8 x i32> %1, %v1
|
||||
ret <8 x i32> %2
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user