Skip to content

Commit 1f9de23

Browse files
committed
[SCEVExp] Add additional tests for hoisting IVs with NSW flags.
1 parent ea4d22f commit 1f9de23

File tree

1 file changed

+88
-0
lines changed

1 file changed

+88
-0
lines changed

llvm/test/Transforms/IndVarSimplify/iv-poison.ll

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,91 @@ bb1: ; preds = %bb1, %bb
2929
common.ret: ; preds = %bb1
3030
ret i2 %i2
3131
}
32+
33+
define i4 @iv_hoist_nsw_poison2(i4 %0, i4 %end, i4 %start) {
34+
; CHECK-LABEL: @iv_hoist_nsw_poison2(
35+
; CHECK-NEXT: entry:
36+
; CHECK-NEXT: br label [[LOOP:%.*]]
37+
; CHECK: loop:
38+
; CHECK-NEXT: [[IV_0:%.*]] = phi i4 [ [[START:%.*]], [[ENTRY:%.*]] ], [ [[IV_0_NEXT:%.*]], [[LOOP]] ]
39+
; CHECK-NEXT: [[IV_0_NEXT]] = add i4 [[IV_0]], 1
40+
; CHECK-NEXT: [[DOTNOT_NOT:%.*]] = icmp ult i4 [[IV_0]], [[END:%.*]]
41+
; CHECK-NEXT: br i1 [[DOTNOT_NOT]], label [[EXIT:%.*]], label [[LOOP]]
42+
; CHECK: exit:
43+
; CHECK-NEXT: [[IV_1_NEXT_LCSSA:%.*]] = phi i4 [ [[IV_0_NEXT]], [[LOOP]] ]
44+
; CHECK-NEXT: ret i4 [[IV_1_NEXT_LCSSA]]
45+
;
46+
entry:
47+
br label %loop
48+
49+
loop:
50+
%iv.0 = phi i4 [ %start, %entry ], [ %iv.0.next, %loop ]
51+
%iv.1 = phi i4 [ %start, %entry ], [ %iv.1.next, %loop ]
52+
%iv.0.next = add i4 %iv.0, 1
53+
%iv.1.next = add nsw i4 %iv.1, 1
54+
%.not.not = icmp ult i4 %iv.0, %end
55+
br i1 %.not.not, label %exit, label %loop
56+
57+
exit:
58+
ret i4 %iv.1.next
59+
}
60+
61+
define i2 @iv_hoist_both_adds_nsw(i2 %arg) {
62+
; CHECK-LABEL: @iv_hoist_both_adds_nsw(
63+
; CHECK-NEXT: bb:
64+
; CHECK-NEXT: br label [[LOOP:%.*]]
65+
; CHECK: loop:
66+
; CHECK-NEXT: [[IV_0:%.*]] = phi i2 [ 1, [[BB:%.*]] ], [ [[IV_0_NEXT:%.*]], [[LOOP]] ]
67+
; CHECK-NEXT: [[IV_0_NEXT]] = add nuw i2 [[IV_0]], 1
68+
; CHECK-NEXT: [[DOTNOT_NOT:%.*]] = icmp ult i2 1, [[ARG:%.*]]
69+
; CHECK-NEXT: br i1 [[DOTNOT_NOT]], label [[EXIT:%.*]], label [[LOOP]]
70+
; CHECK: exit:
71+
; CHECK-NEXT: [[IV_1_NEXT_LCSSA:%.*]] = phi i2 [ [[IV_0_NEXT]], [[LOOP]] ]
72+
; CHECK-NEXT: ret i2 [[IV_1_NEXT_LCSSA]]
73+
;
74+
bb:
75+
br label %loop
76+
77+
loop:
78+
%iv.0 = phi i2 [ 1, %bb ], [ %iv.0.next, %loop ]
79+
%iv.1 = phi i2 [ 1, %bb ], [ %iv.1.next, %loop ]
80+
%iv.0.next = add nsw i2 %iv.0, 1
81+
%iv.1.next = add nsw i2 %iv.1, 1
82+
%.not.not = icmp ult i2 %iv.0, %arg
83+
br i1 %.not.not, label %exit, label %loop
84+
85+
exit:
86+
ret i2 %iv.1.next
87+
}
88+
89+
define i4 @iv_hoist_nsw_poison_extra_use(i4 %0, i4 %end, i4 %start) {
90+
; CHECK-LABEL: @iv_hoist_nsw_poison_extra_use(
91+
; CHECK-NEXT: entry:
92+
; CHECK-NEXT: br label [[LOOP:%.*]]
93+
; CHECK: loop:
94+
; CHECK-NEXT: [[IV_0:%.*]] = phi i4 [ [[START:%.*]], [[ENTRY:%.*]] ], [ [[IV_0_NEXT:%.*]], [[LOOP]] ]
95+
; CHECK-NEXT: [[IV_0_NEXT]] = add i4 [[IV_0]], 1
96+
; CHECK-NEXT: call void @use(i4 [[IV_0_NEXT]])
97+
; CHECK-NEXT: [[DOTNOT_NOT:%.*]] = icmp ult i4 [[IV_0]], [[END:%.*]]
98+
; CHECK-NEXT: br i1 [[DOTNOT_NOT]], label [[EXIT:%.*]], label [[LOOP]]
99+
; CHECK: exit:
100+
; CHECK-NEXT: [[IV_1_NEXT_LCSSA:%.*]] = phi i4 [ [[IV_0_NEXT]], [[LOOP]] ]
101+
; CHECK-NEXT: ret i4 [[IV_1_NEXT_LCSSA]]
102+
;
103+
entry:
104+
br label %loop
105+
106+
loop:
107+
%iv.0 = phi i4 [ %start, %entry ], [ %iv.0.next, %loop ]
108+
%iv.1 = phi i4 [ %start, %entry ], [ %iv.1.next, %loop ]
109+
%iv.0.next = add i4 %iv.0, 1
110+
call void @use(i4 %iv.0.next)
111+
%iv.1.next = add nsw i4 %iv.1, 1
112+
%.not.not = icmp ult i4 %iv.0, %end
113+
br i1 %.not.not, label %exit, label %loop
114+
115+
exit:
116+
ret i4 %iv.1.next
117+
}
118+
119+
declare void @use(i4)

0 commit comments

Comments
 (0)