blob: fcb9d0a65602e8d581a874e91a48df44d53c8f68 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt -passes='indvars' -S %s | FileCheck %s
target triple = "arm64-apple-macosx"
define i64 @count_then_convert(ptr %end) {
; CHECK-LABEL: define i64 @count_then_convert(
; CHECK-SAME: ptr [[END:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: [[END1:%.*]] = ptrtoaddr ptr [[END]] to i64
; CHECK-NEXT: [[ISEMPTY:%.*]] = icmp eq ptr [[END]], null
; CHECK-NEXT: br i1 [[ISEMPTY]], label %[[EXIT:.*]], label %[[BODY_PH:.*]]
; CHECK: [[BODY_PH]]:
; CHECK-NEXT: br label %[[BODY:.*]]
; CHECK: [[BODY]]:
; CHECK-NEXT: br i1 true, label %[[EXIT_LOOPEXIT:.*]], label %[[BODY]]
; CHECK: [[EXIT_LOOPEXIT]]:
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[END1]], -8
; CHECK-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 3
; CHECK-NEXT: [[TMP2:%.*]] = add nuw nsw i64 [[TMP1]], 1
; CHECK-NEXT: br label %[[EXIT]]
; CHECK: [[EXIT]]:
; CHECK-NEXT: [[CNT:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[TMP2]], %[[EXIT_LOOPEXIT]] ]
; CHECK-NEXT: [[ENDI:%.*]] = ptrtoint ptr [[END]] to i64
; CHECK-NEXT: [[R:%.*]] = or i64 [[CNT]], [[ENDI]]
; CHECK-NEXT: ret i64 [[R]]
;
entry:
%isempty = icmp eq ptr %end, null
br i1 %isempty, label %exit, label %body.ph
body.ph:
br label %body
body:
%p = phi ptr [ null, %body.ph ], [ %pn, %body ]
%n = phi i64 [ 0, %body.ph ], [ %nn, %body ]
%nn = add i64 %n, 1
%pn = getelementptr inbounds nuw i8, ptr %p, i64 8
%done = icmp eq ptr %pn, %end
br i1 %done, label %exit, label %body
exit:
%cnt = phi i64 [ 0, %entry ], [ %nn, %body ]
%endi = ptrtoint ptr %end to i64
%r = or i64 %cnt, %endi
ret i64 %r
}
define i64 @ptrtoint_sub_in_exit(ptr %start, ptr %bound) {
; CHECK-LABEL: define i64 @ptrtoint_sub_in_exit(
; CHECK-SAME: ptr [[START:%.*]], ptr [[BOUND:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: [[START3:%.*]] = ptrtoaddr ptr [[START]] to i64
; CHECK-NEXT: [[BOUND2:%.*]] = ptrtoaddr ptr [[BOUND]] to i64
; CHECK-NEXT: [[TMP0:%.*]] = sub i64 [[BOUND2]], [[START3]]
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[START]], i64 [[TMP0]]
; CHECK-NEXT: br label %[[BODY:.*]]
; CHECK: [[BODY]]:
; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[START]], %[[ENTRY]] ], [ [[PN:%.*]], %[[LATCH:.*]] ]
; CHECK-NEXT: [[C:%.*]] = load i8, ptr [[P]], align 1
; CHECK-NEXT: [[ISC:%.*]] = icmp slt i8 [[C]], -64
; CHECK-NEXT: br i1 [[ISC]], label %[[LATCH]], label %[[EXIT_BYTE:.*]]
; CHECK: [[LATCH]]:
; CHECK-NEXT: [[PN]] = getelementptr inbounds i8, ptr [[P]], i64 -1
; CHECK-NEXT: [[DONE:%.*]] = icmp eq ptr [[PN]], [[BOUND]]
; CHECK-NEXT: br i1 [[DONE]], label %[[EXIT_BOUND:.*]], label %[[BODY]]
; CHECK: [[EXIT_BYTE]]:
; CHECK-NEXT: [[P_LCSSA:%.*]] = phi ptr [ [[P]], %[[BODY]] ]
; CHECK-NEXT: br label %[[EXIT:.*]]
; CHECK: [[EXIT_BOUND]]:
; CHECK-NEXT: br label %[[EXIT]]
; CHECK: [[EXIT]]:
; CHECK-NEXT: [[FINAL:%.*]] = phi ptr [ [[P_LCSSA]], %[[EXIT_BYTE]] ], [ [[SCEVGEP]], %[[EXIT_BOUND]] ]
; CHECK-NEXT: [[FI:%.*]] = ptrtoint ptr [[FINAL]] to i64
; CHECK-NEXT: [[BI:%.*]] = ptrtoint ptr [[BOUND]] to i64
; CHECK-NEXT: [[LEN:%.*]] = sub i64 [[FI]], [[BI]]
; CHECK-NEXT: ret i64 [[LEN]]
;
entry:
br label %body
body:
%p = phi ptr [ %start, %entry ], [ %pn, %latch ]
%c = load i8, ptr %p, align 1
%isc = icmp slt i8 %c, -64
br i1 %isc, label %latch, label %exit.byte
latch:
%pn = getelementptr inbounds i8, ptr %p, i64 -1
%done = icmp eq ptr %pn, %bound
br i1 %done, label %exit.bound, label %body
exit.byte:
br label %exit
exit.bound:
br label %exit
exit:
%final = phi ptr [ %p, %exit.byte ], [ %pn, %exit.bound ]
%fi = ptrtoint ptr %final to i64
%bi = ptrtoint ptr %bound to i64
%len = sub i64 %fi, %bi
ret i64 %len
}