diff options
| author | Craig Topper <craig.topper@intel.com> | 2018-07-27 00:00:30 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2018-07-27 00:00:30 +0000 |
| commit | f7bc55022338a7915ede107fe8cf74065656e114 (patch) | |
| tree | 8bafaae16cf13cbcac47153a96af30b4a0eae2aa /llvm/lib/Target | |
| parent | dd0b344339526b91b1a9703122743d1a4a8f5157 (diff) | |
| download | bcm5719-llvm-f7bc55022338a7915ede107fe8cf74065656e114.tar.gz bcm5719-llvm-f7bc55022338a7915ede107fe8cf74065656e114.zip | |
[X86] When removing sign extends from gather/scatter indices, make sure we handle UpdateNodeOperands finding an existing node to CSE with.
If this happens the operands aren't updated and the existing node is returned. Make sure we pass this existing node up to the DAG combiner so that a proper replacement happens. Otherwise we get stuck in an infinite loop with an unoptimized node.
llvm-svn: 338090
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index c53c8d160a2..7572cf4a6ec 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -38100,12 +38100,14 @@ static SDValue combineGatherScatter(SDNode *N, SelectionDAG &DAG, Index.getOperand(0).getScalarValueSizeInBits() <= 32) { SmallVector<SDValue, 5> NewOps(N->op_begin(), N->op_end()); NewOps[4] = Index.getOperand(0); - DAG.UpdateNodeOperands(N, NewOps); - // The original sign extend has less users, add back to worklist in case - // it needs to be removed - DCI.AddToWorklist(Index.getNode()); - DCI.AddToWorklist(N); - return SDValue(N, 0); + SDNode *Res = DAG.UpdateNodeOperands(N, NewOps); + if (Res == N) { + // The original sign extend has less users, add back to worklist in + // case it needs to be removed + DCI.AddToWorklist(Index.getNode()); + DCI.AddToWorklist(N); + } + return SDValue(Res, 0); } } @@ -38118,9 +38120,10 @@ static SDValue combineGatherScatter(SDNode *N, SelectionDAG &DAG, Index = DAG.getSExtOrTrunc(Index, DL, IndexVT); SmallVector<SDValue, 5> NewOps(N->op_begin(), N->op_end()); NewOps[4] = Index; - DAG.UpdateNodeOperands(N, NewOps); - DCI.AddToWorklist(N); - return SDValue(N, 0); + SDNode *Res = DAG.UpdateNodeOperands(N, NewOps); + if (Res == N) + DCI.AddToWorklist(N); + return SDValue(Res, 0); } // Try to remove zero extends from 32->64 if we know the sign bit of @@ -38131,12 +38134,14 @@ static SDValue combineGatherScatter(SDNode *N, SelectionDAG &DAG, if (DAG.SignBitIsZero(Index.getOperand(0))) { SmallVector<SDValue, 5> NewOps(N->op_begin(), N->op_end()); NewOps[4] = Index.getOperand(0); - DAG.UpdateNodeOperands(N, NewOps); - // The original zero extend has less users, add back to worklist in case - // it needs to be removed - DCI.AddToWorklist(Index.getNode()); - DCI.AddToWorklist(N); - return SDValue(N, 0); + SDNode *Res = DAG.UpdateNodeOperands(N, NewOps); + if (Res == N) { + // The original sign extend has less users, add back to worklist in + // case it needs to be removed + DCI.AddToWorklist(Index.getNode()); + DCI.AddToWorklist(N); + } + return SDValue(Res, 0); } } } |

