blob: 2cdfea4dc0c20f6b54a60771be5055dfd04c8daf [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -S -passes=indvars < %s | FileCheck %s
define ptr @callbr_result_exit_value(ptr %a0) {
; CHECK-LABEL: define ptr @callbr_result_exit_value(
; CHECK-SAME: ptr [[A0:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[A02:%.*]] = ptrtoint ptr [[A0]] to i64
; CHECK-NEXT: [[OUT:%.*]] = callbr ptr asm "", "=r,!i"()
; CHECK-NEXT: to label %[[D:.*]] [label %[[INDIRECT:.*]]]
; CHECK: [[INDIRECT]]:
; CHECK-NEXT: ret ptr null
; CHECK: [[D]]:
; CHECK-NEXT: [[CMP0:%.*]] = icmp eq ptr [[A0]], [[OUT]]
; CHECK-NEXT: br i1 [[CMP0]], label %[[END:.*]], label %[[LOOP_PREHEADER:.*]]
; CHECK: [[LOOP_PREHEADER]]:
; CHECK-NEXT: br label %[[LOOP:.*]]
; CHECK: [[LOOP]]:
; CHECK-NEXT: br i1 true, label %[[EXIT:.*]], label %[[LOOP]]
; CHECK: [[EXIT]]:
; CHECK-NEXT: [[OUT1:%.*]] = ptrtoint ptr [[OUT]] to i64
; CHECK-NEXT: [[DIFF:%.*]] = sub i64 [[OUT1]], [[A02]]
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[A0]], i64 [[DIFF]]
; CHECK-NEXT: ret ptr [[SCEVGEP]]
; CHECK: [[END]]:
; CHECK-NEXT: ret ptr [[A0]]
;
entry:
%out = callbr ptr asm "", "=r,!i"()
to label %d [label %indirect]
indirect:
ret ptr null
d:
%cmp0 = icmp eq ptr %a0, %out
br i1 %cmp0, label %end, label %loop
loop:
%iv = phi ptr [ %a0, %d ], [ %inc, %loop ]
%inc = getelementptr inbounds i8, ptr %iv, i64 1
%cmp = icmp eq ptr %inc, %out
br i1 %cmp, label %exit, label %loop
exit:
%lcssa = phi ptr [ %inc, %loop ]
ret ptr %lcssa
end:
ret ptr %a0
}