Skip to content

Commit b7adba8

Browse files
committed
[LICM] Add must exec hoisting test with commuted operands (NFC)
1 parent 3a25e35 commit b7adba8

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

llvm/test/Transforms/LICM/hoist-mustexec.ll

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,63 @@ fail:
217217
ret i32 -1
218218
}
219219

220+
; Same as previous case, with commuted icmp.
221+
; FIXME: The load should get hoisted here as well.
222+
define i32 @test3_commuted(ptr noalias nocapture readonly %a) nounwind uwtable {
223+
; CHECK-LABEL: define i32 @test3_commuted(
224+
; CHECK-SAME: ptr noalias nocapture readonly [[A:%.*]]) #[[ATTR1]] {
225+
; CHECK-NEXT: entry:
226+
; CHECK-NEXT: [[LEN:%.*]] = load i32, ptr [[A]], align 4, !range [[RNG0]]
227+
; CHECK-NEXT: [[IS_ZERO:%.*]] = icmp eq i32 [[LEN]], 0
228+
; CHECK-NEXT: br i1 [[IS_ZERO]], label [[FAIL:%.*]], label [[PREHEADER:%.*]]
229+
; CHECK: preheader:
230+
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
231+
; CHECK: for.body:
232+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[PREHEADER]] ], [ [[INC:%.*]], [[CONTINUE:%.*]] ]
233+
; CHECK-NEXT: [[ACC:%.*]] = phi i32 [ 0, [[PREHEADER]] ], [ [[ADD:%.*]], [[CONTINUE]] ]
234+
; CHECK-NEXT: [[R_CHK:%.*]] = icmp uge i32 [[LEN]], [[IV]]
235+
; CHECK-NEXT: br i1 [[R_CHK]], label [[CONTINUE]], label [[FAIL_LOOPEXIT:%.*]]
236+
; CHECK: continue:
237+
; CHECK-NEXT: [[I1:%.*]] = load i32, ptr [[A]], align 4
238+
; CHECK-NEXT: [[ADD]] = add nsw i32 [[I1]], [[ACC]]
239+
; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[IV]], 1
240+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000
241+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]]
242+
; CHECK: for.cond.cleanup:
243+
; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[CONTINUE]] ]
244+
; CHECK-NEXT: ret i32 [[ADD_LCSSA]]
245+
; CHECK: fail.loopexit:
246+
; CHECK-NEXT: br label [[FAIL]]
247+
; CHECK: fail:
248+
; CHECK-NEXT: call void @f()
249+
; CHECK-NEXT: ret i32 -1
250+
;
251+
entry:
252+
%len = load i32, ptr %a, align 4, !range !{i32 0, i32 512}
253+
%is.zero = icmp eq i32 %len, 0
254+
br i1 %is.zero, label %fail, label %preheader
255+
preheader:
256+
br label %for.body
257+
for.body:
258+
%iv = phi i32 [ 0, %preheader ], [ %inc, %continue ]
259+
%acc = phi i32 [ 0, %preheader ], [ %add, %continue ]
260+
%r.chk = icmp uge i32 %len, %iv
261+
br i1 %r.chk, label %continue, label %fail
262+
continue:
263+
%i1 = load i32, ptr %a, align 4
264+
%add = add nsw i32 %i1, %acc
265+
%inc = add nuw nsw i32 %iv, 1
266+
%exitcond = icmp eq i32 %inc, 1000
267+
br i1 %exitcond, label %for.cond.cleanup, label %for.body
268+
269+
for.cond.cleanup:
270+
ret i32 %add
271+
272+
fail:
273+
call void @f()
274+
ret i32 -1
275+
}
276+
220277
; requires fact length is non-zero
221278
define i32 @test4(ptr noalias nocapture readonly %a) nounwind uwtable {
222279
; CHECK-LABEL: define i32 @test4(

0 commit comments

Comments
 (0)