mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-17 21:29:20 +00:00
arbitrary iteration. The patch: 1) changes SCEVSDivExpr into SCEVUDivExpr, 2) replaces PartialFact() function with BinomialCoefficient(); the computations (essentially, the division) in BinomialCoefficient() are performed with the apprioprate bitwidth necessary to avoid overflow; unsigned division is used instead of the signed one. Computations in BinomialCoefficient() require support from the code generator for APInts. Currently, we use a hack rounding up the neccessary bitwidth to the nearest power of 2. The hack is easy to turn off in future. One remaining issue: we assume the divisor of the binomial coefficient formula can be computed accurately using 16 bits. It means we can handle AddRecs of length up to 9. In future, we should use APInts to evaluate the divisor. Thanks to Nicholas for cooperation! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46955 91177308-0d34-0410-b5e6-96231b3b80d8
25 lines
602 B
LLVM
25 lines
602 B
LLVM
; RUN: llvm-as < %s | opt -indvars | llvm-dis | grep printd | grep 1206807378
|
|
; PR1798
|
|
|
|
declare void @printd(i32)
|
|
|
|
define i32 @test() {
|
|
entry:
|
|
br label %bb6
|
|
|
|
bb: ; preds = %bb6
|
|
%tmp3 = add i32 %x.0, %i.0 ; <i32> [#uses=1]
|
|
%tmp5 = add i32 %i.0, 1 ; <i32> [#uses=1]
|
|
br label %bb6
|
|
|
|
bb6: ; preds = %bb, %entry
|
|
%i.0 = phi i32 [ 0, %entry ], [ %tmp5, %bb ] ; <i32> [#uses=3]
|
|
%x.0 = phi i32 [ 0, %entry ], [ %tmp3, %bb ] ; <i32> [#uses=3]
|
|
%tmp8 = icmp slt i32 %i.0, 123456789 ; <i1> [#uses=1]
|
|
br i1 %tmp8, label %bb, label %bb10
|
|
|
|
bb10: ; preds = %bb6
|
|
call void @printd(i32 %x.0)
|
|
ret i32 0
|
|
}
|