diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-06-27 10:21:06 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-06-27 10:21:06 +0000 |
commit | dfbcc66adcc88b0df16ee371f4b9794afde425da (patch) | |
tree | b16838198acce19bb688a6daeb77aa24fee0f287 /llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | |
parent | da8dd8b800e9874d6c262cc354f28f77f305193f (diff) | |
download | bcm5719-llvm-dfbcc66adcc88b0df16ee371f4b9794afde425da.tar.gz bcm5719-llvm-dfbcc66adcc88b0df16ee371f4b9794afde425da.zip |
[DAGCombiner] Fold SDIV(%X, MIN_SIGNED) -> SELECT(%X == MIN_SIGNED, 1, 0)
Fixes PR37569.
llvm-svn: 335719
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index d690f86790d..136bd54077f 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -3024,6 +3024,11 @@ SDValue DAGCombiner::visitSDIV(SDNode *N) { // fold (sdiv X, -1) -> 0-X if (N1C && N1C->isAllOnesValue()) return DAG.getNode(ISD::SUB, DL, VT, DAG.getConstant(0, DL, VT), N0); + // fold (sdiv X, MIN_SIGNED) -> select(X == MIN_SIGNED, 1, 0) + if (N1C && N1C->getAPIntValue().isMinSignedValue()) + return DAG.getSelect(DL, VT, DAG.getSetCC(DL, VT, N0, N1, ISD::SETEQ), + DAG.getConstant(1, DL, VT), + DAG.getConstant(0, DL, VT)); if (SDValue V = simplifyDivRem(N, DAG)) return V; |