mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
[SelectionDAG] Add constant buildvector support to isKnownNeverZero
This allows us to use SelectionDAG::isKnownNeverZero in DAGCombiner::visitREM (visitSDIVLike/visitUDIVLike handle the checking for constants). llvm-svn: 336779
This commit is contained in:
parent
d8954c65cb
commit
f61404c6ac
@ -3297,10 +3297,7 @@ SDValue DAGCombiner::visitREM(SDNode *N) {
|
||||
// by skipping the simplification if isIntDivCheap(). When div is not cheap,
|
||||
// combine will not return a DIVREM. Regardless, checking cheapness here
|
||||
// makes sense since the simplification results in fatter code.
|
||||
// TODO: replace matchUnaryPredicate with SelectionDAG::isKnownNeverZero(N1).
|
||||
if (ISD::matchUnaryPredicate(
|
||||
N1, [](ConstantSDNode *C) { return !C->isNullValue(); }) &&
|
||||
!TLI.isIntDivCheap(VT, Attr)) {
|
||||
if (DAG.isKnownNeverZero(N1) && !TLI.isIntDivCheap(VT, Attr)) {
|
||||
SDValue OptimizedDiv =
|
||||
isSigned ? visitSDIVLike(N0, N1, N) : visitUDIVLike(N0, N1, N);
|
||||
if (OptimizedDiv.getNode() && OptimizedDiv.getOpcode() != ISD::UDIVREM &&
|
||||
|
@ -3626,12 +3626,18 @@ bool SelectionDAG::isKnownNeverZero(SDValue Op) const {
|
||||
assert(!Op.getValueType().isFloatingPoint() &&
|
||||
"Floating point types unsupported - use isKnownNeverZeroFloat");
|
||||
|
||||
// If the value is a constant, we can obviously see if it is a zero or not.
|
||||
if (ISD::matchUnaryPredicate(
|
||||
Op, [](ConstantSDNode *C) { return !C->isNullValue(); }))
|
||||
return true;
|
||||
|
||||
// TODO: Recognize more cases here.
|
||||
switch (Op.getOpcode()) {
|
||||
default: break;
|
||||
case ISD::OR:
|
||||
if (const ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op.getOperand(1)))
|
||||
return !C->isNullValue();
|
||||
if (isKnownNeverZero(Op.getOperand(1)) ||
|
||||
isKnownNeverZero(Op.getOperand(0)))
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user