| ; 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 |
| } |