Skip to content

Commit 40b322b

Browse files
committed
[SCEV] Add tests for missed NSW preservation during loop guard handling.
Add test coverage for missed simplification.
1 parent 665af09 commit 40b322b

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

llvm/test/Analysis/ScalarEvolution/backedge-taken-count-guard-info.ll

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,38 @@ exit:
6969
ret void
7070
}
7171

72+
declare void @use(i32)
73+
74+
define void @rewrite_preserve_add_nsw(i32 %a) {
75+
; CHECK-LABEL: 'rewrite_preserve_add_nsw'
76+
; CHECK-NEXT: Classifying expressions for: @rewrite_preserve_add_nsw
77+
; CHECK-NEXT: %add = add nsw i32 %a, 4
78+
; CHECK-NEXT: --> (4 + %a)<nsw> U: [-2147483644,-2147483648) S: [-2147483644,-2147483648)
79+
; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
80+
; CHECK-NEXT: --> {0,+,1}<nuw><%loop> U: [0,-2147483648) S: [0,-2147483648) Exits: (0 smax (4 + %a)<nsw>) LoopDispositions: { %loop: Computable }
81+
; CHECK-NEXT: %iv.next = add i32 %iv, 1
82+
; CHECK-NEXT: --> {1,+,1}<nuw><%loop> U: [1,-2147483647) S: [1,-2147483647) Exits: (1 + (0 smax (4 + %a)<nsw>))<nuw> LoopDispositions: { %loop: Computable }
83+
; CHECK-NEXT: Determining loop execution counts for: @rewrite_preserve_add_nsw
84+
; CHECK-NEXT: Loop %loop: backedge-taken count is (0 smax (4 + %a)<nsw>)
85+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 2147483647
86+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (0 smax (4 + %a)<nsw>)
87+
; CHECK-NEXT: Loop %loop: Trip multiple is 1
88+
;
89+
entry:
90+
%add = add nsw i32 %a, 4
91+
call void @use(i32 noundef %add)
92+
%pre = icmp sgt i32 %a, -4
93+
br i1 %pre, label %loop, label %exit
94+
95+
loop:
96+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
97+
call void @clobber()
98+
%iv.next = add i32 %iv, 1
99+
%ec = icmp slt i32 %iv, %add
100+
br i1 %ec, label %loop, label %exit
101+
102+
exit:
103+
ret void
104+
}
105+
72106
declare void @clobber()
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -passes=indvars -S %s | FileCheck %s
3+
4+
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128-Fn32"
5+
6+
define void @rewrite_preserve_add_nsw(i32 %a) {
7+
; CHECK-LABEL: define void @rewrite_preserve_add_nsw(
8+
; CHECK-SAME: i32 [[A:%.*]]) {
9+
; CHECK-NEXT: entry:
10+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 4
11+
; CHECK-NEXT: call void @use(i32 noundef [[ADD]])
12+
; CHECK-NEXT: [[PRE:%.*]] = icmp sgt i32 [[A]], -4
13+
; CHECK-NEXT: br i1 [[PRE]], label [[LOOP_PREHEADER:%.*]], label [[EXIT:%.*]]
14+
; CHECK: loop.preheader:
15+
; CHECK-NEXT: [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[ADD]], i32 0)
16+
; CHECK-NEXT: [[TMP0:%.*]] = add nuw i32 [[SMAX]], 1
17+
; CHECK-NEXT: br label [[LOOP:%.*]]
18+
; CHECK: loop:
19+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[LOOP_PREHEADER]] ]
20+
; CHECK-NEXT: call void @clobber()
21+
; CHECK-NEXT: [[IV_NEXT]] = add nuw i32 [[IV]], 1
22+
; CHECK-NEXT: [[EC:%.*]] = icmp ne i32 [[IV_NEXT]], [[TMP0]]
23+
; CHECK-NEXT: br i1 [[EC]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]]
24+
; CHECK: exit.loopexit:
25+
; CHECK-NEXT: br label [[EXIT]]
26+
; CHECK: exit:
27+
; CHECK-NEXT: ret void
28+
;
29+
entry:
30+
%add = add nsw i32 %a, 4
31+
call void @use(i32 noundef %add)
32+
%pre = icmp sgt i32 %a, -4
33+
br i1 %pre, label %loop, label %exit
34+
35+
loop:
36+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
37+
call void @clobber()
38+
%iv.next = add i32 %iv, 1
39+
%ec = icmp slt i32 %iv, %add
40+
br i1 %ec, label %loop, label %exit
41+
42+
exit:
43+
ret void
44+
}
45+
46+
declare void @clobber()
47+
declare void @use(i32)

0 commit comments

Comments
 (0)