forked from OSchip/llvm-project
[DAGCombiner] Fixed incorrect test for buildvector of constant integers.
DAGCombiner::ReassociateOps was correctly testing for an constant integer scalar but failed to correctly test for constant integer vectors (it was testing for any constant vector). llvm-svn: 233482
This commit is contained in:
parent
cd5553ed39
commit
7fdcc30e93
|
@ -705,16 +705,8 @@ static bool isConstantSplatVector(SDNode *N, APInt& SplatValue) {
|
|||
EltVT.getSizeInBits() >= SplatBitSize);
|
||||
}
|
||||
|
||||
// \brief Returns the SDNode if it is a constant BuildVector or constant.
|
||||
static SDNode *isConstantBuildVectorOrConstantInt(SDValue N) {
|
||||
if (isa<ConstantSDNode>(N))
|
||||
return N.getNode();
|
||||
BuildVectorSDNode *BV = dyn_cast<BuildVectorSDNode>(N);
|
||||
if (BV && BV->isConstant())
|
||||
return BV;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// \brief Returns the SDNode if it is a constant integer BuildVector
|
||||
// or constant integer.
|
||||
static SDNode *isConstantIntBuildVectorOrConstantInt(SDValue N) {
|
||||
if (isa<ConstantSDNode>(N))
|
||||
return N.getNode();
|
||||
|
@ -723,6 +715,8 @@ static SDNode *isConstantIntBuildVectorOrConstantInt(SDValue N) {
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
// \brief Returns the SDNode if it is a constant float BuildVector
|
||||
// or constant float.
|
||||
static SDNode *isConstantFPBuildVectorOrConstantFP(SDValue N) {
|
||||
if (isa<ConstantFPSDNode>(N))
|
||||
return N.getNode();
|
||||
|
@ -773,8 +767,8 @@ SDValue DAGCombiner::ReassociateOps(unsigned Opc, SDLoc DL,
|
|||
SDValue N0, SDValue N1) {
|
||||
EVT VT = N0.getValueType();
|
||||
if (N0.getOpcode() == Opc) {
|
||||
if (SDNode *L = isConstantBuildVectorOrConstantInt(N0.getOperand(1))) {
|
||||
if (SDNode *R = isConstantBuildVectorOrConstantInt(N1)) {
|
||||
if (SDNode *L = isConstantIntBuildVectorOrConstantInt(N0.getOperand(1))) {
|
||||
if (SDNode *R = isConstantIntBuildVectorOrConstantInt(N1)) {
|
||||
// reassoc. (op (op x, c1), c2) -> (op x, (op c1, c2))
|
||||
if (SDValue OpNode = DAG.FoldConstantArithmetic(Opc, VT, L, R))
|
||||
return DAG.getNode(Opc, DL, VT, N0.getOperand(0), OpNode);
|
||||
|
@ -793,8 +787,8 @@ SDValue DAGCombiner::ReassociateOps(unsigned Opc, SDLoc DL,
|
|||
}
|
||||
|
||||
if (N1.getOpcode() == Opc) {
|
||||
if (SDNode *R = isConstantBuildVectorOrConstantInt(N1.getOperand(1))) {
|
||||
if (SDNode *L = isConstantBuildVectorOrConstantInt(N0)) {
|
||||
if (SDNode *R = isConstantIntBuildVectorOrConstantInt(N1.getOperand(1))) {
|
||||
if (SDNode *L = isConstantIntBuildVectorOrConstantInt(N0)) {
|
||||
// reassoc. (op c2, (op x, c1)) -> (op x, (op c1, c2))
|
||||
if (SDValue OpNode = DAG.FoldConstantArithmetic(Opc, VT, R, L))
|
||||
return DAG.getNode(Opc, DL, VT, N1.getOperand(0), OpNode);
|
||||
|
|
Loading…
Reference in New Issue