1; RUN: opt -function-specialization -deadargelim -inline -S < %s | FileCheck %s
2
3; CHECK-LABEL: @main(i64 %x, i1 %flag) {
4; CHECK:         entry:
5; CHECK-NEXT:      br i1 %flag, label %plus, label %minus
6; CHECK:         plus:
7; CHECK-NEXT:      [[TMP0:%.+]] = add i64 %x, 1
8; CHECH-NEXT:      br label %merge
9; CHECK:         minus:
10; CHECK-NEXT:      [[TMP1:%.+]] = sub i64 %x, 1
11; CHECK-NEXT:      br label %merge
12; CHECK:         merge:
13; CHECK-NEXT:      [[TMP2:%.+]] = phi i64 [ [[TMP0]], %plus ], [ [[TMP1]], %minus ]
14; CHECK-NEXT:      ret i64 [[TMP2]]
15; CHECK-NEXT:  }
16;
17define i64 @main(i64 %x, i1 %flag) {
18entry:
19  br i1 %flag, label %plus, label %minus
20
21plus:
22  %tmp0 = call i64 @compute(i64 %x, i64 (i64)* @plus)
23  br label %merge
24
25minus:
26  %tmp1 = call i64 @compute(i64 %x, i64 (i64)* @minus)
27  br label %merge
28
29merge:
30  %tmp2 = phi i64 [ %tmp0, %plus ], [ %tmp1, %minus]
31  ret i64 %tmp2
32}
33
34define internal i64 @compute(i64 %x, i64 (i64)* %binop) {
35entry:
36  %tmp0 = call i64 %binop(i64 %x)
37  ret i64 %tmp0
38}
39
40define internal i64 @plus(i64 %x) {
41entry:
42  %tmp0 = add i64 %x, 1
43  ret i64 %tmp0
44}
45
46define internal i64 @minus(i64 %x) {
47entry:
48  %tmp0 = sub i64 %x, 1
49  ret i64 %tmp0
50}
51