mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
8c1c53f697
We can sharpen the range of a AddRec if we know that it does not self-wrap and know the symbolic iteration count in the loop. If we can evaluate the value of AddRec on the last iteration and prove that at least one its intermediate value lies between start and end, then no-wrap flag allows us to conclude that all of them also lie between start and end. So the estimate of range can be improved to union of ranges of start and end. Switched off by default, can be turned on by flag. Differential Revision: https://reviews.llvm.org/D89381 Reviewed By: lebedev.ri, nikic
94 lines
5.6 KiB
LLVM
94 lines
5.6 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
|
|
; RUN: opt < %s -S -scalar-evolution-use-expensive-range-sharpening -analyze -scalar-evolution -enable-new-pm=0 | FileCheck %s
|
|
; RUN: opt < %s -S -scalar-evolution-use-expensive-range-sharpening -passes='print<scalar-evolution>' 2>&1 | FileCheck %s
|
|
|
|
define i32 @test_01(i32 %start, i32* %p, i32* %q) {
|
|
; CHECK-LABEL: 'test_01'
|
|
; CHECK-NEXT: Classifying expressions for: @test_01
|
|
; CHECK-NEXT: %0 = zext i32 %start to i64
|
|
; CHECK-NEXT: --> (zext i32 %start to i64) U: [0,4294967296) S: [0,4294967296)
|
|
; CHECK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.next, %backedge ], [ %0, %entry ]
|
|
; CHECK-NEXT: --> {(zext i32 %start to i64),+,-1}<nsw><%loop> U: [0,4294967296) S: [0,4294967296) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
|
|
; CHECK-NEXT: %iv = phi i32 [ %start, %entry ], [ %iv.next, %backedge ]
|
|
; CHECK-NEXT: --> {%start,+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
|
|
; CHECK-NEXT: %iv.next = add i32 %iv, -1
|
|
; CHECK-NEXT: --> {(-1 + %start),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
|
|
; CHECK-NEXT: %index = zext i32 %iv.next to i64
|
|
; CHECK-NEXT: --> (zext i32 {(-1 + %start),+,-1}<%loop> to i64) U: [0,4294967296) S: [0,4294967296) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
|
|
; CHECK-NEXT: %store.addr = getelementptr i32, i32* %p, i64 %index
|
|
; CHECK-NEXT: --> ((4 * (zext i32 {(-1 + %start),+,-1}<%loop> to i64))<nuw><nsw> + %p) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
|
|
; CHECK-NEXT: %load.addr = getelementptr i32, i32* %q, i64 %index
|
|
; CHECK-NEXT: --> ((4 * (zext i32 {(-1 + %start),+,-1}<%loop> to i64))<nuw><nsw> + %q) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
|
|
; CHECK-NEXT: %stop = load i32, i32* %load.addr, align 4
|
|
; CHECK-NEXT: --> %stop U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
|
|
; CHECK-NEXT: %indvars.iv.next = add nsw i64 %indvars.iv, -1
|
|
; CHECK-NEXT: --> {(-1 + (zext i32 %start to i64))<nsw>,+,-1}<nsw><%loop> U: [-4294967296,4294967295) S: [-1,4294967295) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
|
|
; CHECK-NEXT: Determining loop execution counts for: @test_01
|
|
; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
|
|
; CHECK-NEXT: exit count for loop: (zext i32 %start to i64)
|
|
; CHECK-NEXT: exit count for backedge: ***COULDNOTCOMPUTE***
|
|
; CHECK-NEXT: Loop %loop: max backedge-taken count is 4294967295
|
|
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
|
|
;
|
|
entry:
|
|
%0 = zext i32 %start to i64
|
|
br label %loop
|
|
|
|
loop: ; preds = %backedge, %entry
|
|
%indvars.iv = phi i64 [ %indvars.iv.next, %backedge ], [ %0, %entry ]
|
|
%iv = phi i32 [ %start, %entry ], [ %iv.next, %backedge ]
|
|
%cond = icmp eq i64 %indvars.iv, 0
|
|
br i1 %cond, label %exit, label %backedge
|
|
|
|
backedge: ; preds = %loop
|
|
%iv.next = add i32 %iv, -1
|
|
%index = zext i32 %iv.next to i64
|
|
%store.addr = getelementptr i32, i32* %p, i64 %index
|
|
store i32 1, i32* %store.addr, align 4
|
|
%load.addr = getelementptr i32, i32* %q, i64 %index
|
|
%stop = load i32, i32* %load.addr, align 4
|
|
%loop.cond = icmp eq i32 %stop, 0
|
|
%indvars.iv.next = add nsw i64 %indvars.iv, -1
|
|
br i1 %loop.cond, label %loop, label %failure
|
|
|
|
exit: ; preds = %loop
|
|
ret i32 0
|
|
|
|
failure: ; preds = %backedge
|
|
unreachable
|
|
}
|
|
|
|
; Check that we do not mess up with wrapping ranges.
|
|
define i32 @test_02(i32 %start, i32* %p, i32* %q) {
|
|
; CHECK-LABEL: 'test_02'
|
|
; CHECK-NEXT: Classifying expressions for: @test_02
|
|
; CHECK-NEXT: %zext = zext i32 %start to i64
|
|
; CHECK-NEXT: --> (zext i32 %start to i64) U: [0,4294967296) S: [0,4294967296)
|
|
; CHECK-NEXT: %shl = shl i64 %zext, 31
|
|
; CHECK-NEXT: --> (2147483648 * (zext i32 %start to i64))<nuw><nsw> U: [0,9223372034707292161) S: [0,9223372034707292161)
|
|
; CHECK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.next, %loop ], [ %shl, %entry ]
|
|
; CHECK-NEXT: --> {(2147483648 * (zext i32 %start to i64))<nuw><nsw>,+,-1}<nsw><%loop> U: [-9223372036854775808,9223372034707292161) S: [-9223372036854775808,9223372034707292161) Exits: -9223372036854775806 LoopDispositions: { %loop: Computable }
|
|
; CHECK-NEXT: %indvars.iv.next = add nsw i64 %indvars.iv, -1
|
|
; CHECK-NEXT: --> {(-1 + (2147483648 * (zext i32 %start to i64))<nuw><nsw>)<nsw>,+,-1}<nw><%loop> U: full-set S: full-set Exits: -9223372036854775807 LoopDispositions: { %loop: Computable }
|
|
; CHECK-NEXT: Determining loop execution counts for: @test_02
|
|
; CHECK-NEXT: Loop %loop: backedge-taken count is (9223372036854775806 + (2147483648 * (zext i32 %start to i64))<nuw><nsw>)<nuw>
|
|
; CHECK-NEXT: Loop %loop: max backedge-taken count is -2147483650
|
|
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (9223372036854775806 + (2147483648 * (zext i32 %start to i64))<nuw><nsw>)<nuw>
|
|
; CHECK-NEXT: Predicates:
|
|
; CHECK: Loop %loop: Trip multiple is 1
|
|
;
|
|
entry:
|
|
%zext = zext i32 %start to i64
|
|
%shl = shl i64 %zext, 31
|
|
br label %loop
|
|
|
|
loop: ; preds = %backedge, %entry
|
|
%indvars.iv = phi i64 [ %indvars.iv.next, %loop ], [ %shl, %entry ]
|
|
%cond = icmp eq i64 %indvars.iv, -9223372036854775806
|
|
%indvars.iv.next = add nsw i64 %indvars.iv, -1
|
|
br i1 %cond, label %exit, label %loop
|
|
|
|
exit: ; preds = %loop
|
|
ret i32 0
|
|
}
|