Skip to content

Commit 0929302

Browse files
committed
[Test] Precommit negative test on add/sub hoisting
Should not optimize here because no-overflow is not proved.
1 parent 243df83 commit 0929302

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

llvm/test/Transforms/LICM/hoist-add-sub.ll

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,57 @@ failed:
114114
ret i32 -2
115115
}
116116

117+
; Range info is missing for x, cannot prove no-overflow. Should not hoist.
118+
define i32 @test_01_neg(ptr %p, ptr %x_p, ptr %length_p) {
119+
; CHECK-LABEL: define i32 @test_01_neg
120+
; CHECK-SAME: (ptr [[P:%.*]], ptr [[X_P:%.*]], ptr [[LENGTH_P:%.*]]) {
121+
; CHECK-NEXT: entry:
122+
; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[X_P]], align 4
123+
; CHECK-NEXT: [[LENGTH:%.*]] = load i32, ptr [[LENGTH_P]], align 4, !range [[RNG0]]
124+
; CHECK-NEXT: br label [[LOOP:%.*]]
125+
; CHECK: loop:
126+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]
127+
; CHECK-NEXT: [[ARITH:%.*]] = sub nsw i32 [[X]], [[IV]]
128+
; CHECK-NEXT: [[X_CHECK:%.*]] = icmp slt i32 [[ARITH]], 4
129+
; CHECK-NEXT: br i1 [[X_CHECK]], label [[OUT_OF_BOUNDS:%.*]], label [[BACKEDGE]]
130+
; CHECK: backedge:
131+
; CHECK-NEXT: [[EL_PTR:%.*]] = getelementptr i32, ptr [[P]], i32 [[IV]]
132+
; CHECK-NEXT: store i32 1, ptr [[EL_PTR]], align 4
133+
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 4
134+
; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp slt i32 [[IV_NEXT]], [[LENGTH]]
135+
; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]]
136+
; CHECK: exit:
137+
; CHECK-NEXT: [[IV_NEXT_LCSSA:%.*]] = phi i32 [ [[IV_NEXT]], [[BACKEDGE]] ]
138+
; CHECK-NEXT: ret i32 [[IV_NEXT_LCSSA]]
139+
; CHECK: out_of_bounds:
140+
; CHECK-NEXT: ret i32 -1
141+
;
142+
entry:
143+
%x = load i32, ptr %x_p
144+
%length = load i32, ptr %length_p, !range !0
145+
br label %loop
146+
147+
loop:
148+
%iv = phi i32 [0, %entry], [%iv.next, %backedge]
149+
%arith = sub nsw i32 %x, %iv
150+
%x_check = icmp slt i32 %arith, 4
151+
br i1 %x_check, label %out_of_bounds, label %backedge
152+
153+
backedge:
154+
%el.ptr = getelementptr i32, ptr %p, i32 %iv
155+
store i32 1, ptr %el.ptr
156+
%iv.next = add nuw nsw i32 %iv, 4
157+
%loop_cond = icmp slt i32 %iv.next, %length
158+
br i1 %loop_cond, label %loop, label %exit
159+
160+
exit:
161+
ret i32 %iv.next
162+
163+
out_of_bounds:
164+
ret i32 -1
165+
}
166+
167+
117168
; TODO: x + iv < 4 ==> iv < 4 - x
118169
define i32 @test_02(ptr %p, ptr %x_p, ptr %length_p) {
119170
; CHECK-LABEL: define i32 @test_02

0 commit comments

Comments
 (0)