diff options
author | Sanjay Patel <spatel@rotateright.com> | 2015-12-30 22:40:52 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2015-12-30 22:40:52 +0000 |
commit | 41160c2094b458a1bd363d40c47a120c26614300 (patch) | |
tree | ed384aeda11bb3fe3ee1c5f9fff6ea4dcc244607 /llvm/lib/Analysis | |
parent | 934b092186b149b5ba2626badeb3bf7719a8e153 (diff) | |
download | bcm5719-llvm-41160c2094b458a1bd363d40c47a120c26614300.tar.gz bcm5719-llvm-41160c2094b458a1bd363d40c47a120c26614300.zip |
[ValueTracking] fix bug computing isKnownToBeAPowerOfTwo() with arithmetic shift right (PR25900)
This is a fix for:
https://llvm.org/bugs/show_bug.cgi?id=25900
If we think that an arithmetic right shift of a power of two is always a power of two,
an sdiv gets wrongly converted to udiv.
Differential Revision: http://reviews.llvm.org/D15827
llvm-svn: 256655
Diffstat (limited to 'llvm/lib/Analysis')
-rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 314ec9c1886..d6a78411388 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -1743,9 +1743,10 @@ bool isKnownToBeAPowerOfTwo(Value *V, bool OrZero, unsigned Depth, return false; Value *X = nullptr, *Y = nullptr; - // A shift of a power of two is a power of two or zero. + // A shift left or a logical shift right of a power of two is a power of two + // or zero. if (OrZero && (match(V, m_Shl(m_Value(X), m_Value())) || - match(V, m_Shr(m_Value(X), m_Value())))) + match(V, m_LShr(m_Value(X), m_Value())))) return isKnownToBeAPowerOfTwo(X, /*OrZero*/ true, Depth, Q, DL); if (ZExtInst *ZI = dyn_cast<ZExtInst>(V)) |