blob: 0b431d6d90edef55171fdc33c54f82e7666ec770 [file] [log] [blame]
Chandler Carruth4d1d34f2012-03-14 23:19:53 +00001; RUN: opt -inline < %s -S -o - -inline-threshold=10 | FileCheck %s
2
3define 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
15define 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
22then:
23 ret i32 3
24
25else:
26 %t = load i32* %begin
27 ret i32 %t
28}
29
30define 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
43define 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
50then:
51 ret i32 3
52
53else:
54 %t = load i32* %begin
55 ret i32 %t
56}