@@ -4,7 +4,7 @@ define i64 @main() {
44; CHECK: define i64 @main
55; CHECK-NEXT: entry:
66; 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)
7+ ; CHECK-NEXT: [[C2:%.*]] = call i64 @foo.specialized.3 (i1 false, i64 4, i64 -1)
88; CHECK-NEXT: ret i64 8
99;
1010entry:
@@ -15,27 +15,6 @@ entry:
1515}
1616
1717define internal i64 @foo (i1 %flag , i64 %m , i64 %n ) {
18- ;
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 poison
28- ;
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 poison
38- ;
3918entry:
4019 br i1 %flag , label %plus , label %minus
4120
@@ -55,21 +34,61 @@ merge:
5534}
5635
5736define internal i64 @binop (i64 %x , i64 %y ) {
37+ entry:
38+ %z = add i64 %x , %y
39+ ret i64 %z
40+ }
41+
42+ define internal i64 @bar (i64 %n ) {
43+ entry:
44+ %cmp = icmp sgt i64 %n , 3
45+ br i1 %cmp , label %if.then , label %if.else
46+
47+ if.then:
48+ %res0 = sdiv i64 %n , 2
49+ br label %if.end
50+
51+ if.else:
52+ %res1 = mul i64 %n , 2
53+ br label %if.end
54+
55+ if.end:
56+ %res = phi i64 [ %res0 , %if.then ], [ %res1 , %if.else ]
57+ ret i64 %res
58+ }
59+
60+ ;
61+ ; CHECK: define internal i64 @foo.specialized.1
62+ ; CHECK-NEXT: entry:
63+ ; CHECK-NEXT: br label %plus
64+ ; CHECK: plus:
65+ ; CHECK-NEXT: [[N0:%.*]] = call i64 @binop.specialized.2(i64 3, i64 1)
66+ ; CHECK-NEXT: [[RES0:%.*]] = call i64 @bar.specialized.6(i64 4)
67+ ; CHECK-NEXT: br label %merge
68+ ; CHECK: merge:
69+ ; CHECK-NEXT: ret i64 poison
70+ ;
5871;
59- ; CHECK: define internal i64 @binop.specialized.3
72+ ; CHECK: define internal i64 @binop.specialized.2
6073; CHECK-NEXT: entry:
6174; CHECK-NEXT: ret i64 poison
6275;
76+ ;
77+ ; CHECK: define internal i64 @foo.specialized.3
78+ ; CHECK-NEXT: entry:
79+ ; CHECK-NEXT: br label %minus
80+ ; CHECK: minus:
81+ ; CHECK-NEXT: [[N1:%.*]] = call i64 @binop.specialized.4(i64 4, i64 -1)
82+ ; CHECK-NEXT: [[RES1:%.*]] = call i64 @bar.specialized.5(i64 3)
83+ ; CHECK-NEXT: br label %merge
84+ ; CHECK: merge:
85+ ; CHECK-NEXT: ret i64 poison
86+ ;
87+ ;
6388; CHECK: define internal i64 @binop.specialized.4
6489; CHECK-NEXT: entry:
6590; CHECK-NEXT: ret i64 poison
6691;
67- entry:
68- %z = add i64 %x , %y
69- ret i64 %z
70- }
71-
72- define internal i64 @bar (i64 %n ) {
7392;
7493; CHECK: define internal i64 @bar.specialized.5
7594; CHECK-NEXT: entry:
@@ -87,20 +106,3 @@ define internal i64 @bar(i64 %n) {
87106; CHECK: if.end:
88107; CHECK-NEXT: ret i64 poison
89108;
90- entry:
91- %cmp = icmp sgt i64 %n , 3
92- br i1 %cmp , label %if.then , label %if.else
93-
94- if.then:
95- %res0 = sdiv i64 %n , 2
96- br label %if.end
97-
98- if.else:
99- %res1 = mul i64 %n , 2
100- br label %if.end
101-
102- if.end:
103- %res = phi i64 [ %res0 , %if.then ], [ %res1 , %if.else ]
104- ret i64 %res
105- }
106-
0 commit comments