| ; 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:%.*]] = ptrtoaddr 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:%.*]] = ptrtoaddr 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 | |
| } |