[llvm] r233225 - [ValueTracking] Fix PR23011.
Sanjoy Das
sanjoy at playingwithpointers.com
Wed Mar 25 15:33:53 PDT 2015
Author: sanjoy
Date: Wed Mar 25 17:33:53 2015
New Revision: 233225
URL: http://llvm.org/viewvc/llvm-project?rev=233225&view=rev
Log:
[ValueTracking] Fix PR23011.
Summary:
`ComputeNumSignBits` returns incorrect results for `srem` instructions.
This change fixes the issue and adds a test case.
Reviewers: nadav, nicholas, atrick
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D8600
Added:
llvm/trunk/test/Analysis/ValueTracking/pr23011.ll
Modified:
llvm/trunk/lib/Analysis/ValueTracking.cpp
Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=233225&r1=233224&r2=233225&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ValueTracking.cpp (original)
+++ llvm/trunk/lib/Analysis/ValueTracking.cpp Wed Mar 25 17:33:53 2015
@@ -1914,8 +1914,9 @@ unsigned ComputeNumSignBits(Value *V, co
case Instruction::SRem: {
const APInt *Denominator;
- // srem X, C -> we know that the result is within 0..C-1 when C is a
- // positive constant and the sign bits are at most TypeBits - log2(C).
+ // srem X, C -> we know that the result is within [-C+1,C) when C is a
+ // positive constant. This let us put a lower bound on the number of sign
+ // bits.
if (match(U->getOperand(1), m_APInt(Denominator))) {
// Ignore non-positive denominator.
@@ -1928,11 +1929,19 @@ unsigned ComputeNumSignBits(Value *V, co
ComputeNumSignBits(U->getOperand(0), DL, Depth + 1, Q);
// Calculate the leading sign bit constraints by examining the
- // denominator. The remainder is in the range 0..C-1, which is
- // calculated by the log2(denominator). The sign bits are the bit-width
- // minus this value. The result of this subtraction has to be positive.
- unsigned ResBits = TyBits - Denominator->logBase2();
+ // denominator. Given that the denominator is positive, there are two
+ // cases:
+ //
+ // 1. the numerator is positive. The result range is [0,C) and [0,C) u<
+ // (1 << ceilLogBase2(C)).
+ //
+ // 2. the numerator is negative. Then the result range is (-C,0] and
+ // integers in (-C,0] are either 0 or >u (-1 << ceilLogBase2(C)).
+ //
+ // Thus a lower bound on the number of sign bits is `TyBits -
+ // ceilLogBase2(C)`.
+ unsigned ResBits = TyBits - Denominator->ceilLogBase2();
return std::max(NumrBits, ResBits);
}
break;
Added: llvm/trunk/test/Analysis/ValueTracking/pr23011.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ValueTracking/pr23011.ll?rev=233225&view=auto
==============================================================================
--- llvm/trunk/test/Analysis/ValueTracking/pr23011.ll (added)
+++ llvm/trunk/test/Analysis/ValueTracking/pr23011.ll Wed Mar 25 17:33:53 2015
@@ -0,0 +1,15 @@
+; RUN: opt -indvars -S < %s | FileCheck %s
+
+declare { i8, i1 } @llvm.smul.with.overflow.i8(i8, i8) nounwind readnone
+
+define i1 @test1(i8 %x) {
+ entry:
+; CHECK-LABEL: @test1
+ %rem = srem i8 %x, 15
+ %t = call { i8, i1 } @llvm.smul.with.overflow.i8(i8 %rem, i8 %rem)
+; CHECK: %t = call { i8, i1 } @llvm.smul.with.overflow.i8(i8 %rem, i8 %rem)
+; CHECK: %obit = extractvalue { i8, i1 } %t, 1
+; CHECK: ret i1 %obit
+ %obit = extractvalue { i8, i1 } %t, 1
+ ret i1 %obit
+}
More information about the llvm-commits
mailing list