1; RUN: opt -function-specialization -func-specialization-avg-iters-cost=3 -func-specialization-size-threshold=10 -S < %s | FileCheck %s
2
3; Check that the loop depth results in a larger specialization bonus.
4; CHECK: @foo.1(
5; CHECK: @foo.2(
6
7target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
8
9@A = external dso_local constant i32, align 4
10@B = external dso_local constant i32, align 4
11@C = external dso_local constant i32, align 4
12@D = external dso_local constant i32, align 4
13
14declare i1 @cond_begin()
15declare i1 @cond_end()
16declare i1 @getCond()
17
18define internal i32 @foo(i32 %x, i32* %b, i32* %c) {
19entry:
20  br label %loop.entry
21
22loop.entry:
23  br label %loop2.entry
24
25loop2.entry:
26  br label %loop2.body
27
28loop2.body:
29  %0 = load i32, i32* %b, align 4
30  %1 = load i32, i32* %c, align 4
31  %add.0 = add nsw i32 %0, %1
32  %add = add nsw i32 %add.0, %x
33  br label %loop2.end
34
35loop2.end:
36  %cond.end = call i1 @cond_end()
37  br i1 %cond.end, label %loop2.entry, label %loop.end
38
39loop.end:
40  %cond2.end = call i1 @getCond()
41  br i1 %cond2.end, label %loop.entry, label %return
42
43return:
44  ret i32 %add
45}
46
47define dso_local i32 @bar(i32 %x, i32 %y) {
48entry:
49  %tobool = icmp ne i32 %x, 0
50  br i1 %tobool, label %if.then, label %if.else
51
52if.then:
53  %call = call i32 @foo(i32 %x, i32* @A, i32* @C)
54  br label %return
55
56if.else:
57  %call1 = call i32 @foo(i32 %y, i32* @B, i32* @D)
58  br label %return
59
60return:
61  %retval.0 = phi i32 [ %call, %if.then ], [ %call1, %if.else ]
62  ret i32 %retval.0
63}