mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-21 18:24:23 +00:00
DAGCombine tryFoldToZero cannot create illegal types after type legalization
When folding sub x, x (and other similar constructs), where x is a vector, the result is a vector of zeros. After type legalization, make sure that the input zero elements have a legal type. This type may be larger than the result's vector element type. This was another bug found by llvm-stress. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185949 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -1613,12 +1613,19 @@ SDValue DAGCombiner::visitADDE(SDNode *N) {
|
||||
// Since it may not be valid to emit a fold to zero for vector initializers
|
||||
// check if we can before folding.
|
||||
static SDValue tryFoldToZero(SDLoc DL, const TargetLowering &TLI, EVT VT,
|
||||
SelectionDAG &DAG, bool LegalOperations) {
|
||||
SelectionDAG &DAG,
|
||||
bool LegalOperations, bool LegalTypes) {
|
||||
if (!VT.isVector())
|
||||
return DAG.getConstant(0, VT);
|
||||
if (!LegalOperations || TLI.isOperationLegal(ISD::BUILD_VECTOR, VT)) {
|
||||
// Produce a vector of zeros.
|
||||
SDValue El = DAG.getConstant(0, VT.getVectorElementType());
|
||||
EVT ElemTy = VT.getVectorElementType();
|
||||
if (LegalTypes && TLI.getTypeAction(*DAG.getContext(), ElemTy) ==
|
||||
TargetLowering::TypePromoteInteger)
|
||||
ElemTy = TLI.getTypeToTransformTo(*DAG.getContext(), ElemTy);
|
||||
assert((!LegalTypes || TLI.isTypeLegal(ElemTy)) &&
|
||||
"Type for zero vector elements is not legal");
|
||||
SDValue El = DAG.getConstant(0, ElemTy);
|
||||
std::vector<SDValue> Ops(VT.getVectorNumElements(), El);
|
||||
return DAG.getNode(ISD::BUILD_VECTOR, DL, VT,
|
||||
&Ops[0], Ops.size());
|
||||
@ -1648,7 +1655,7 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
|
||||
// fold (sub x, x) -> 0
|
||||
// FIXME: Refactor this and xor and other similar operations together.
|
||||
if (N0 == N1)
|
||||
return tryFoldToZero(SDLoc(N), TLI, VT, DAG, LegalOperations);
|
||||
return tryFoldToZero(SDLoc(N), TLI, VT, DAG, LegalOperations, LegalTypes);
|
||||
// fold (sub c1, c2) -> c1-c2
|
||||
if (N0C && N1C)
|
||||
return DAG.FoldConstantArithmetic(ISD::SUB, VT, N0C, N1C);
|
||||
@ -3519,7 +3526,7 @@ SDValue DAGCombiner::visitXOR(SDNode *N) {
|
||||
}
|
||||
// fold (xor x, x) -> 0
|
||||
if (N0 == N1)
|
||||
return tryFoldToZero(SDLoc(N), TLI, VT, DAG, LegalOperations);
|
||||
return tryFoldToZero(SDLoc(N), TLI, VT, DAG, LegalOperations, LegalTypes);
|
||||
|
||||
// Simplify: xor (op x...), (op y...) -> (op (xor x, y))
|
||||
if (N0.getOpcode() == N1.getOpcode()) {
|
||||
|
Reference in New Issue
Block a user