diff options
author | Max Kazantsev <max.kazantsev@azul.com> | 2018-07-19 01:46:21 +0000 |
---|---|---|
committer | Max Kazantsev <max.kazantsev@azul.com> | 2018-07-19 01:46:21 +0000 |
commit | d41faecc4969a3c707f98a9925f6c88e895f9bde (patch) | |
tree | cebcafe57c0f57e8f9a300c746dbdb9be6fc0222 /llvm/lib/Analysis/ScalarEvolution.cpp | |
parent | 6b87e0c18f049172b33144f561cf4baa8b225d8d (diff) | |
download | bcm5719-llvm-d41faecc4969a3c707f98a9925f6c88e895f9bde.tar.gz bcm5719-llvm-d41faecc4969a3c707f98a9925f6c88e895f9bde.zip |
[SCEV] Fix buggy behavior in getAddExpr with truncs
SCEV tries to constant-fold arguments of trunc operands in SCEVAddExpr, and when it does
that, it passes wrong flags into the recursion. It is only valid to pass flags that are proved for
narrow type into a computation in wider type if we can prove that trunc instruction doesn't
actually change the value. If it did lose some meaningful bits, we may end up proving wrong
no-wrap flags for sum of arguments of trunc.
In the provided test we end up with `nuw` where it shouldn't be because of this bug.
The solution is to conservatively pass `SCEV::FlagAnyWrap` which is always a valid thing to do.
Reviewed By: sanjoy
Differential Revision: https://reviews.llvm.org/D49471
llvm-svn: 337435
Diffstat (limited to 'llvm/lib/Analysis/ScalarEvolution.cpp')
-rw-r--r-- | llvm/lib/Analysis/ScalarEvolution.cpp | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 6480c2c076d..08f0d2939be 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -2413,7 +2413,7 @@ const SCEV *ScalarEvolution::getAddExpr(SmallVectorImpl<const SCEV *> &Ops, } if (Ok) { // Evaluate the expression in the larger type. - const SCEV *Fold = getAddExpr(LargeOps, Flags, Depth + 1); + const SCEV *Fold = getAddExpr(LargeOps, SCEV::FlagAnyWrap, Depth + 1); // If it folds to something simple, use it. Otherwise, don't. if (isa<SCEVConstant>(Fold) || isa<SCEVUnknown>(Fold)) return getTruncateExpr(Fold, Ty); |