| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt -passes='indvars' -S %s | FileCheck %s |
| |
| target datalayout = "e-p:64:64-p1:64:64:64:32" |
| target triple = "x86_64-unknown-linux" |
| |
| define ptr addrspace(1) @exit_value_narrow_address(ptr addrspace(1) %start, ptr addrspace(1) %end) { |
| ; CHECK-LABEL: define ptr addrspace(1) @exit_value_narrow_address( |
| ; CHECK-SAME: ptr addrspace(1) [[START:%.*]], ptr addrspace(1) [[END:%.*]]) { |
| ; CHECK-NEXT: [[ENTRY:.*]]: |
| ; CHECK-NEXT: [[START2:%.*]] = ptrtoaddr ptr addrspace(1) [[START]] to i32 |
| ; CHECK-NEXT: [[END1:%.*]] = ptrtoaddr ptr addrspace(1) [[END]] to i32 |
| ; CHECK-NEXT: [[PRE:%.*]] = icmp ult ptr addrspace(1) [[START]], [[END]] |
| ; CHECK-NEXT: br i1 [[PRE]], label %[[LOOP_PREHEADER:.*]], label %[[EXIT:.*]] |
| ; CHECK: [[LOOP_PREHEADER]]: |
| ; CHECK-NEXT: br label %[[LOOP:.*]] |
| ; CHECK: [[LOOP]]: |
| ; CHECK-NEXT: br i1 false, label %[[LOOP]], label %[[EXIT_LOOPEXIT:.*]] |
| ; CHECK: [[EXIT_LOOPEXIT]]: |
| ; CHECK-NEXT: [[TMP0:%.*]] = sub i32 [[END1]], [[START2]] |
| ; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr addrspace(1) [[START]], i32 [[TMP0]] |
| ; CHECK-NEXT: br label %[[EXIT]] |
| ; CHECK: [[EXIT]]: |
| ; CHECK-NEXT: [[RES:%.*]] = phi ptr addrspace(1) [ [[START]], %[[ENTRY]] ], [ [[SCEVGEP]], %[[EXIT_LOOPEXIT]] ] |
| ; CHECK-NEXT: ret ptr addrspace(1) [[RES]] |
| ; |
| entry: |
| %pre = icmp ult ptr addrspace(1) %start, %end |
| br i1 %pre, label %loop, label %exit |
| |
| loop: |
| %p = phi ptr addrspace(1) [ %start, %entry ], [ %p.next, %loop ] |
| %p.next = getelementptr inbounds i8, ptr addrspace(1) %p, i64 1 |
| %c = icmp ult ptr addrspace(1) %p.next, %end |
| br i1 %c, label %loop, label %exit |
| |
| exit: |
| %res = phi ptr addrspace(1) [ %start, %entry ], [ %p.next, %loop ] |
| ret ptr addrspace(1) %res |
| } |