mirror of
https://github.com/RPCS3/llvm.git
synced 2025-03-02 15:45:44 +00:00
Fix a DAG combiner assertion failure when constant folding BUILD_VECTORS.
svn r139159 caused SelectionDAG::getConstant() to promote BUILD_VECTOR operands with illegal types, even before type legalization. For this testcase, that led to one BUILD_VECTOR with i16 operands and another with promoted i32 operands, which triggered the assertion. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142370 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
630243a8c2
commit
db2b18feba
@ -7261,8 +7261,19 @@ SDValue DAGCombiner::SimplifyVBinOp(SDNode *N) {
|
||||
}
|
||||
|
||||
EVT VT = LHSOp.getValueType();
|
||||
assert(RHSOp.getValueType() == VT &&
|
||||
"SimplifyVBinOp with different BUILD_VECTOR element types");
|
||||
EVT RVT = RHSOp.getValueType();
|
||||
if (RVT != VT) {
|
||||
// Integer BUILD_VECTOR operands may have types larger than the element
|
||||
// size (e.g., when the element type is not legal). Prior to type
|
||||
// legalization, the types may not match between the two BUILD_VECTORS.
|
||||
// Truncate one of the operands to make them match.
|
||||
if (RVT.getSizeInBits() > VT.getSizeInBits()) {
|
||||
RHSOp = DAG.getNode(ISD::TRUNCATE, N->getDebugLoc(), VT, RHSOp);
|
||||
} else {
|
||||
LHSOp = DAG.getNode(ISD::TRUNCATE, N->getDebugLoc(), RVT, LHSOp);
|
||||
VT = RVT;
|
||||
}
|
||||
}
|
||||
SDValue FoldOp = DAG.getNode(N->getOpcode(), LHS.getDebugLoc(), VT,
|
||||
LHSOp, RHSOp);
|
||||
if (FoldOp.getOpcode() != ISD::UNDEF &&
|
||||
|
@ -123,3 +123,13 @@ define void @orVec(<3 x i8>* %A) nounwind {
|
||||
ret void
|
||||
}
|
||||
|
||||
; The following test was hitting an assertion in the DAG combiner when
|
||||
; constant folding the multiply because the "sext undef" was translated to
|
||||
; a BUILD_VECTOR with i32 0 operands, which did not match the i16 operands
|
||||
; of the other BUILD_VECTOR.
|
||||
define i16 @foldBuildVectors() {
|
||||
%1 = sext <8 x i8> undef to <8 x i16>
|
||||
%2 = mul <8 x i16> %1, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
|
||||
%3 = extractelement <8 x i16> %2, i32 0
|
||||
ret i16 %3
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user