0b431d6d90edef55171fdc33c54f82e7666ec770
[oota-llvm.git] / test / Transforms / Inline / ptr-diff.ll
1 ; RUN: opt -inline < %s -S -o - -inline-threshold=10 | FileCheck %s
2
3 define i32 @outer1() {
4 ; CHECK: @outer1
5 ; CHECK-NOT: call
6 ; CHECK: ret i32
7
8   %ptr = alloca i32
9   %ptr1 = getelementptr inbounds i32* %ptr, i32 0
10   %ptr2 = getelementptr inbounds i32* %ptr, i32 42
11   %result = call i32 @inner1(i32* %ptr1, i32* %ptr2)
12   ret i32 %result
13 }
14
15 define i32 @inner1(i32* %begin, i32* %end) {
16   %begin.i = ptrtoint i32* %begin to i32
17   %end.i = ptrtoint i32* %end to i32
18   %distance = sub i32 %end.i, %begin.i
19   %icmp = icmp sle i32 %distance, 42
20   br i1 %icmp, label %then, label %else
21
22 then:
23   ret i32 3
24
25 else:
26   %t = load i32* %begin
27   ret i32 %t
28 }
29
30 define i32 @outer2(i32* %ptr) {
31 ; Test that an inbounds GEP disables this -- it isn't safe in general as
32 ; wrapping changes the behavior of lessthan and greaterthan comparisions.
33 ; CHECK: @outer2
34 ; CHECK: call i32 @inner2
35 ; CHECK: ret i32
36
37   %ptr1 = getelementptr i32* %ptr, i32 0
38   %ptr2 = getelementptr i32* %ptr, i32 42
39   %result = call i32 @inner2(i32* %ptr1, i32* %ptr2)
40   ret i32 %result
41 }
42
43 define i32 @inner2(i32* %begin, i32* %end) {
44   %begin.i = ptrtoint i32* %begin to i32
45   %end.i = ptrtoint i32* %end to i32
46   %distance = sub i32 %end.i, %begin.i
47   %icmp = icmp sle i32 %distance, 42
48   br i1 %icmp, label %then, label %else
49
50 then:
51   ret i32 3
52
53 else:
54   %t = load i32* %begin
55   ret i32 %t
56 }