forked from OSchip/llvm-project
Don't claim the udiv created in BypassSlowDivision is exact.
Summary: In BypassSlowDivision's short-dividend path, we would create e.g. udiv exact i32 %a, %b "exact" here means that we are asserting that %a is a multiple of %b. But we have no reason to believe this must be true -- this is just a bug, as far as I can tell. Reviewers: tra Subscribers: jholewinski, llvm-commits Differential Revision: https://reviews.llvm.org/D26097 llvm-svn: 285459
This commit is contained in:
parent
d66d37cbd9
commit
468bf73209
|
@ -120,8 +120,7 @@ static bool insertFastDiv(Instruction *I, IntegerType *BypassType,
|
|||
BypassType);
|
||||
|
||||
// udiv/urem because optimization only handles positive numbers
|
||||
Value *ShortQuotientV = FastBuilder.CreateExactUDiv(ShortDividendV,
|
||||
ShortDivisorV);
|
||||
Value *ShortQuotientV = FastBuilder.CreateUDiv(ShortDividendV, ShortDivisorV);
|
||||
Value *ShortRemainderV = FastBuilder.CreateURem(ShortDividendV,
|
||||
ShortDivisorV);
|
||||
Value *FastQuotientV = FastBuilder.CreateCast(Instruction::ZExt,
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
; RUN: opt -S -codegenprepare < %s | FileCheck %s
|
||||
|
||||
target datalayout = "e-i64:64-v16:16-v32:32-n16:32:64"
|
||||
target triple = "nvptx64-nvidia-cuda"
|
||||
|
||||
; Check that the smaller-width division that the BypassSlowDivision pass
|
||||
; creates is not marked as "exact" (that is, it doesn't claim that the
|
||||
; numerator is a multiple of the denominator).
|
||||
;
|
||||
; CHECK-LABEL: @test
|
||||
define void @test(i64 %a, i64 %b, i64* %retptr) {
|
||||
; CHECK: udiv i32
|
||||
%d = sdiv i64 %a, %b
|
||||
store i64 %d, i64* %retptr
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue