diff options
author | Davide Italiano <davide@freebsd.org> | 2016-11-22 22:11:25 +0000 |
---|---|---|
committer | Davide Italiano <davide@freebsd.org> | 2016-11-22 22:11:25 +0000 |
commit | e7ffae9dea1c934d3f9be2b74a629f215d674fe1 (patch) | |
tree | f192cfe557adcc0c07169c4823e90e0c14b7f476 /llvm/lib/Transforms/Scalar/SCCP.cpp | |
parent | 7f423442d1869f4612319b8d042f8defa32d8e2c (diff) | |
download | bcm5719-llvm-e7ffae9dea1c934d3f9be2b74a629f215d674fe1.tar.gz bcm5719-llvm-e7ffae9dea1c934d3f9be2b74a629f215d674fe1.zip |
[SCCP] Remove code in visitBinaryOperator (and add tests).
We visit and/or, we try to derive a lattice value for the
instruction even if one of the operands is overdefined.
If the non-overdefined value is still 'unknown' just return and wait
for ResolvedUndefsIn to "plug in" the correct value. This simplifies
the logic a bit. While I'm here add tests for missing cases.
llvm-svn: 287709
Diffstat (limited to 'llvm/lib/Transforms/Scalar/SCCP.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/SCCP.cpp | 14 |
1 files changed, 3 insertions, 11 deletions
diff --git a/llvm/lib/Transforms/Scalar/SCCP.cpp b/llvm/lib/Transforms/Scalar/SCCP.cpp index eeb36bb56a1..9de3059dadf 100644 --- a/llvm/lib/Transforms/Scalar/SCCP.cpp +++ b/llvm/lib/Transforms/Scalar/SCCP.cpp @@ -928,25 +928,17 @@ void SCCPSolver::visitBinaryOperator(Instruction &I) { NonOverdefVal = &V2State; if (NonOverdefVal) { - if (NonOverdefVal->isUnknown()) { - // Could annihilate value. - if (I.getOpcode() == Instruction::And) - markConstant(IV, &I, Constant::getNullValue(I.getType())); - else if (VectorType *PT = dyn_cast<VectorType>(I.getType())) - markConstant(IV, &I, Constant::getAllOnesValue(PT)); - else - markConstant(IV, &I, - Constant::getAllOnesValue(I.getType())); + if (NonOverdefVal->isUnknown()) return; - } if (I.getOpcode() == Instruction::And) { // X and 0 = 0 if (NonOverdefVal->getConstant()->isNullValue()) return markConstant(IV, &I, NonOverdefVal->getConstant()); } else { + // X or -1 = -1 if (ConstantInt *CI = NonOverdefVal->getConstantInt()) - if (CI->isAllOnesValue()) // X or -1 = -1 + if (CI->isAllOnesValue()) return markConstant(IV, &I, NonOverdefVal->getConstant()); } } |