Follow up to d0858bffa11, add missing REQUIRES x86
[llvm-project.git] / llvm / test / Transforms / FunctionSpecialization / track-return.ll
blob54e5de018f19cd1e40f4b5496dd15d6faea2c331
1 ; RUN: opt -passes="ipsccp<func-spec>" -force-specialization -funcspec-for-literal-constant -funcspec-max-iters=3 -S < %s | FileCheck %s
3 define i64 @main() {
4 ; CHECK:       define i64 @main
5 ; CHECK-NEXT:  entry:
6 ; CHECK-NEXT:    [[C1:%.*]] = call i64 @foo.specialized.1(i1 true, i64 3, i64 1)
7 ; CHECK-NEXT:    [[C2:%.*]] = call i64 @foo.specialized.2(i1 false, i64 4, i64 -1)
8 ; CHECK-NEXT:    ret i64 8
10 entry:
11   %c1 = call i64 @foo(i1 true, i64 3, i64 1)
12   %c2 = call i64 @foo(i1 false, i64 4, i64 -1)
13   %add = add i64 %c1, %c2
14   ret i64 %add
17 define internal i64 @foo(i1 %flag, i64 %m, i64 %n) {
19 ; CHECK:       define internal i64 @foo.specialized.1
20 ; CHECK-NEXT:  entry:
21 ; CHECK-NEXT:    br label %plus
22 ; CHECK:       plus:
23 ; CHECK-NEXT:    [[N0:%.*]] = call i64 @binop.specialized.4(i64 3, i64 1)
24 ; CHECK-NEXT:    [[RES0:%.*]] = call i64 @bar.specialized.6(i64 4)
25 ; CHECK-NEXT:    br label %merge
26 ; CHECK:       merge:
27 ; CHECK-NEXT:    ret i64 undef
29 ; CHECK:       define internal i64 @foo.specialized.2
30 ; CHECK-NEXT:  entry:
31 ; CHECK-NEXT:    br label %minus
32 ; CHECK:       minus:
33 ; CHECK-NEXT:    [[N1:%.*]] = call i64 @binop.specialized.3(i64 4, i64 -1)
34 ; CHECK-NEXT:    [[RES1:%.*]] = call i64 @bar.specialized.5(i64 3)
35 ; CHECK-NEXT:    br label %merge
36 ; CHECK:       merge:
37 ; CHECK-NEXT:    ret i64 undef
39 entry:
40   br i1 %flag, label %plus, label %minus
42 plus:
43   %n0 = call i64 @binop(i64 %m, i64 %n)
44   %res0 = call i64 @bar(i64 %n0)
45   br label %merge
47 minus:
48   %n1 = call i64 @binop(i64 %m, i64 %n)
49   %res1 = call i64 @bar(i64 %n1)
50   br label %merge
52 merge:
53   %res = phi i64 [ %res0, %plus ], [ %res1, %minus]
54   ret i64 %res
57 define internal i64 @binop(i64 %x, i64 %y) {
59 ; CHECK:       define internal i64 @binop.specialized.3
60 ; CHECK-NEXT:  entry:
61 ; CHECK-NEXT:    ret i64 undef
63 ; CHECK:       define internal i64 @binop.specialized.4
64 ; CHECK-NEXT:  entry:
65 ; CHECK-NEXT:    ret i64 undef
67 entry:
68   %z = add i64 %x, %y
69   ret i64 %z
72 define internal i64 @bar(i64 %n) {
74 ; CHECK:       define internal i64 @bar.specialized.5
75 ; CHECK-NEXT:  entry:
76 ; CHECK-NEXT:    br label %if.else
77 ; CHECK:       if.else:
78 ; CHECK-NEXT:    br label %if.end
79 ; CHECK:       if.end:
80 ; CHECK-NEXT:    ret i64 undef
82 ; CHECK:       define internal i64 @bar.specialized.6
83 ; CHECK-NEXT:  entry:
84 ; CHECK-NEXT:    br label %if.then
85 ; CHECK:       if.then:
86 ; CHECK-NEXT:    br label %if.end
87 ; CHECK:       if.end:
88 ; CHECK-NEXT:    ret i64 undef
90 entry:
91   %cmp = icmp sgt i64 %n, 3
92   br i1 %cmp, label %if.then, label %if.else
94 if.then:
95   %res0 = sdiv i64 %n, 2
96   br label %if.end
98 if.else:
99   %res1 = mul i64 %n, 2
100   br label %if.end
102 if.end:
103   %res = phi i64 [ %res0, %if.then ], [ %res1, %if.else]
104   ret i64 %res