blob: 39e25cb5d627e1444535ae23184e9fa60a33185a [file] [log] [blame]
Chris Lattnerc6b3b252009-10-27 05:39:41 +00001; RUN: opt < %s -inline -scalarrepl -S | FileCheck %s
Kenneth Uildriks90fedc62009-11-03 15:29:06 +00002target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
Chris Lattnere2d78962002-06-24 17:46:05 +00003
Chris Lattner58ee24c2009-10-27 05:35:35 +00004define i32 @test1f(i32 %i) {
Tanya Lattner5640bd12008-03-01 09:15:35 +00005 ret i32 %i
Chris Lattnere2d78962002-06-24 17:46:05 +00006}
7
Chris Lattner58ee24c2009-10-27 05:35:35 +00008define i32 @test1(i32 %W) {
9 %X = call i32 @test1f(i32 7)
10 %Y = add i32 %X, %W
Tanya Lattner5640bd12008-03-01 09:15:35 +000011 ret i32 %Y
Chris Lattner58ee24c2009-10-27 05:35:35 +000012; CHECK: @test1(
13; CHECK-NEXT: %Y = add i32 7, %W
14; CHECK-NEXT: ret i32 %Y
Chris Lattnere2d78962002-06-24 17:46:05 +000015}
Tanya Lattner5640bd12008-03-01 09:15:35 +000016
Chris Lattnerc6b3b252009-10-27 05:39:41 +000017
18
19; rdar://7339069
20
21%T = type { i32, i32 }
22
23; CHECK-NOT: @test2f
24define internal %T* @test2f(i1 %cond, %T* %P) {
25 br i1 %cond, label %T, label %F
26
27T:
28 %A = getelementptr %T* %P, i32 0, i32 0
29 store i32 42, i32* %A
30 ret %T* %P
31
32F:
33 ret %T* %P
34}
35
36define i32 @test2(i1 %cond) {
37 %A = alloca %T
38
39 %B = call %T* @test2f(i1 %cond, %T* %A)
40 %C = getelementptr %T* %B, i32 0, i32 0
41 %D = load i32* %C
42 ret i32 %D
43
44; CHECK: @test2(
45; CHECK-NOT: = alloca
Chris Lattner5e0fef82011-01-14 07:46:33 +000046; CHECK: ret i32
Chris Lattnerc6b3b252009-10-27 05:39:41 +000047}
James Molloy4f6fb952012-12-20 16:04:27 +000048
49declare void @barrier() noduplicate
50
51define internal i32 @f() {
52 call void @barrier() noduplicate
53 ret i32 1
54}
55
56define i32 @g() {
57 call void @barrier() noduplicate
58 ret i32 2
59}
60
61define internal i32 @h() {
62 call void @barrier() noduplicate
63 ret i32 3
64}
65
66define i32 @test3() {
67 %b = call i32 @f()
68 ret i32 %b
69}
70
71; The call to @f cannot be inlined as there is another callsite
72; calling @f, and @f contains a noduplicate call.
73;
74; The call to @g cannot be inlined as it has external linkage.
75;
76; The call to @h *can* be inlined.
77
78; CHECK: @test
79define i32 @test() {
80; CHECK: call i32 @f()
81 %a = call i32 @f()
82; CHECK: call i32 @g()
83 %b = call i32 @g()
84; CHECK-NOT: call i32 @h()
85 %c = call i32 @h()
86
87 %d = add i32 %a, %b
88 %e = add i32 %d, %c
89
90 ret i32 %e
91; CHECK: }
92}