mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-25 05:22:04 +00:00
[X86] Add two combine rules to simplify dag nodes introduced during type legalization when promoting nodes with illegal vector type.
This patch teaches the backend how to simplify/canonicalize dag node
sequences normally introduced by the backend when promoting certain dag nodes
with illegal vector type.
This patch adds two new combine rules:
1) fold (shuffle (bitcast (BINOP A, B)), Undef, <Mask>) ->
(shuffle (BINOP (bitcast A), (bitcast B)), Undef, <Mask>)
2) fold (BINOP (shuffle (A, Undef, <Mask>)), (shuffle (B, Undef, <Mask>))) ->
(shuffle (BINOP A, B), Undef, <Mask>).
Both rules are only triggered on the type-legalized DAG.
In particular, rule 1. is a target specific combine rule that attempts
to sink a bitconvert into the operands of a binary operation.
Rule 2. is a target independet rule that attempts to move a shuffle
immediately after a binary operation.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209930 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -10801,6 +10801,27 @@ SDValue DAGCombiner::SimplifyVBinOp(SDNode *N) {
|
||||
return DAG.getNode(ISD::BUILD_VECTOR, SDLoc(N), LHS.getValueType(), Ops);
|
||||
}
|
||||
|
||||
// Type legalization might introduce new shuffles in the DAG.
|
||||
// Fold (VBinOp (shuffle (A, Undef, Mask)), (shuffle (B, Undef, Mask)))
|
||||
// -> (shuffle (VBinOp (A, B)), Undef, Mask).
|
||||
if (LegalTypes && isa<ShuffleVectorSDNode>(LHS) &&
|
||||
isa<ShuffleVectorSDNode>(RHS) && LHS.hasOneUse() && RHS.hasOneUse() &&
|
||||
LHS.getOperand(1).getOpcode() == ISD::UNDEF &&
|
||||
RHS.getOperand(1).getOpcode() == ISD::UNDEF) {
|
||||
ShuffleVectorSDNode *SVN0 = cast<ShuffleVectorSDNode>(LHS);
|
||||
ShuffleVectorSDNode *SVN1 = cast<ShuffleVectorSDNode>(RHS);
|
||||
|
||||
if (SVN0->getMask().equals(SVN1->getMask())) {
|
||||
EVT VT = N->getValueType(0);
|
||||
SDValue UndefVector = LHS.getOperand(1);
|
||||
SDValue NewBinOp = DAG.getNode(N->getOpcode(), SDLoc(N), VT,
|
||||
LHS.getOperand(0), RHS.getOperand(0));
|
||||
AddUsersToWorkList(N);
|
||||
return DAG.getVectorShuffle(VT, SDLoc(N), NewBinOp, UndefVector,
|
||||
&SVN0->getMask()[0]);
|
||||
}
|
||||
}
|
||||
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user