forked from OSchip/llvm-project
[SelectionDAG] Allow constant folding for implicitly truncating BUILD_VECTOR nodes.
In FoldConstantArithmetic, handle BUILD_VECTOR nodes that do implicit truncation on the elements. This is similar to what is done in FoldConstantVectorArithmetic. Differential Revision: https://reviews.llvm.org/D36506 llvm-svn: 310593
This commit is contained in:
parent
7235bcdf8f
commit
136b543745
|
@ -3968,18 +3968,31 @@ SDValue SelectionDAG::FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL,
|
|||
assert(BV1->getNumOperands() == BV2->getNumOperands() && "Out of sync!");
|
||||
|
||||
EVT SVT = VT.getScalarType();
|
||||
EVT LegalSVT = SVT;
|
||||
if (NewNodesMustHaveLegalTypes && LegalSVT.isInteger()) {
|
||||
LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
|
||||
if (LegalSVT.bitsLT(SVT))
|
||||
return SDValue();
|
||||
}
|
||||
SmallVector<SDValue, 4> Outputs;
|
||||
for (unsigned I = 0, E = BV1->getNumOperands(); I != E; ++I) {
|
||||
SDValue V1 = BV1->getOperand(I);
|
||||
SDValue V2 = BV2->getOperand(I);
|
||||
|
||||
// Avoid BUILD_VECTOR nodes that perform implicit truncation.
|
||||
// FIXME: This is valid and could be handled by truncation.
|
||||
if (SVT.isInteger()) {
|
||||
if (V1->getValueType(0).bitsGT(SVT))
|
||||
V1 = getNode(ISD::TRUNCATE, DL, SVT, V1);
|
||||
if (V2->getValueType(0).bitsGT(SVT))
|
||||
V2 = getNode(ISD::TRUNCATE, DL, SVT, V2);
|
||||
}
|
||||
|
||||
if (V1->getValueType(0) != SVT || V2->getValueType(0) != SVT)
|
||||
return SDValue();
|
||||
|
||||
// Fold one vector element.
|
||||
SDValue ScalarResult = getNode(Opcode, DL, SVT, V1, V2);
|
||||
if (LegalSVT != SVT)
|
||||
ScalarResult = getNode(ISD::SIGN_EXTEND, DL, LegalSVT, ScalarResult);
|
||||
|
||||
// Scalar folding only succeeded if the result is a constant or UNDEF.
|
||||
if (!ScalarResult.isUndef() && ScalarResult.getOpcode() != ISD::Constant &&
|
||||
|
@ -3998,6 +4011,7 @@ SDValue SelectionDAG::FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL,
|
|||
return getBuildVector(VT, SDLoc(), Outputs);
|
||||
}
|
||||
|
||||
// TODO: Merge with FoldConstantArithmetic
|
||||
SDValue SelectionDAG::FoldConstantVectorArithmetic(unsigned Opcode,
|
||||
const SDLoc &DL, EVT VT,
|
||||
ArrayRef<SDValue> Ops,
|
||||
|
|
|
@ -123,8 +123,6 @@ define i16 @test_kxnor(i16 %a0, i16 %a1) {
|
|||
; CHECK-NEXT: kmovw %eax, %k2
|
||||
; CHECK-NEXT: kxorw %k0, %k1, %k0
|
||||
; CHECK-NEXT: kxorw %k0, %k2, %k0
|
||||
; CHECK-NEXT: kxnorw %k0, %k0, %k1
|
||||
; CHECK-NEXT: kxnorw %k1, %k0, %k0
|
||||
; CHECK-NEXT: kmovw %k0, %eax
|
||||
; CHECK-NEXT: ## kill: %AX<def> %AX<kill> %EAX<kill>
|
||||
; CHECK-NEXT: retq
|
||||
|
|
Loading…
Reference in New Issue