1
+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --version 6
1
2
; RUN: opt -passes="ipsccp<func-spec>" -force-specialization -S < %s | FileCheck %s
2
3
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
3
4
4
5
@A = external dso_local constant i32 , align 4
5
6
@B = external dso_local constant i32 , align 4
6
7
7
- ; CHECK: define dso_local i32 @bar(i32 %x, i32 %y, ptr %z) !prof ![[BAR_PROF:[0-9]]] {
8
+ ;.
9
+ ; CHECK: @A = external dso_local constant i32, align 4
10
+ ; CHECK: @B = external dso_local constant i32, align 4
11
+ ;.
8
12
define dso_local i32 @bar (i32 %x , i32 %y , ptr %z ) !prof !0 {
13
+ ; CHECK-LABEL: define dso_local i32 @bar(
14
+ ; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], ptr [[Z:%.*]]) !prof [[PROF0:![0-9]+]] {
15
+ ; CHECK-NEXT: [[ENTRY:.*:]]
16
+ ; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[X]], 0
17
+ ; CHECK-NEXT: br i1 [[TOBOOL]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]], !prof [[PROF1:![0-9]+]]
18
+ ; CHECK: [[IF_THEN]]:
19
+ ; CHECK-NEXT: [[CALL:%.*]] = call i32 @foo.specialized.1(i32 [[X]], ptr @A)
20
+ ; CHECK-NEXT: [[CALL1:%.*]] = call i32 @foo.specialized.2(i32 [[Y]], ptr @B)
21
+ ; CHECK-NEXT: [[CALL2:%.*]] = call i32 @foo.specialized.2(i32 [[Y]], ptr @B)
22
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[CALL]], [[CALL1]]
23
+ ; CHECK-NEXT: [[ADD1:%.*]] = add i32 [[ADD]], [[CALL2]]
24
+ ; CHECK-NEXT: br label %[[RETURN:.*]]
25
+ ; CHECK: [[IF_ELSE]]:
26
+ ; CHECK-NEXT: [[CALL3:%.*]] = call i32 @foo.specialized.2(i32 [[Y]], ptr @B)
27
+ ; CHECK-NEXT: br label %[[RETURN]]
28
+ ; CHECK: [[RETURN]]:
29
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[ADD1]], %[[IF_THEN]] ], [ [[CALL3]], %[[IF_ELSE]] ]
30
+ ; CHECK-NEXT: [[CALL4:%.*]] = call i32 @foo(i32 [[X]], ptr [[Z]])
31
+ ; CHECK-NEXT: [[ADD2:%.*]] = add i32 [[RETVAL_0]], [[CALL4]]
32
+ ; CHECK-NEXT: ret i32 [[ADD2]]
33
+ ;
9
34
entry:
10
35
%tobool = icmp ne i32 %x , 0
11
- ; CHECK: br i1 %tobool, label %if.then, label %if.else, !prof ![[BRANCH_PROF:[0-9]]]
12
36
br i1 %tobool , label %if.then , label %if.else , !prof !1
13
37
14
- ; CHECK: if.then:
15
- ; CHECK: call i32 @foo.specialized.1(i32 %x, ptr @A)
16
- ; CHECK: call i32 @foo.specialized.2(i32 %y, ptr @B)
17
- ; CHECK: call i32 @foo.specialized.2(i32 %y, ptr @B)
18
38
if.then:
19
39
%call = call i32 @foo (i32 %x , ptr @A )
20
40
%call1 = call i32 @foo (i32 %y , ptr @B )
@@ -23,36 +43,73 @@ if.then:
23
43
%add1 = add i32 %add , %call2
24
44
br label %return
25
45
26
- ; CHECK: if.else:
27
- ; CHECK: call i32 @foo.specialized.2(i32 %y, ptr @B)
28
46
if.else:
29
47
%call3 = call i32 @foo (i32 %y , ptr @B )
30
48
br label %return
31
49
32
- ; CHECK: return:
33
- ; CHECK: call i32 @foo(i32 %x, ptr %z)
34
50
return:
35
51
%retval.0 = phi i32 [ %add1 , %if.then ], [ %call3 , %if.else ]
36
52
%call4 = call i32 @foo (i32 %x , ptr %z );
37
53
%add2 = add i32 %retval.0 , %call4
38
54
ret i32 %add2
39
55
}
40
56
41
- ; CHECK: define internal i32 @foo(i32 %x, ptr %b) !prof ![[FOO_UNSPEC_PROF:[0-9]]]
42
- ; CHECK: define internal i32 @foo.specialized.1(i32 %x, ptr %b) !prof ![[FOO_SPEC_1_PROF:[0-9]]]
43
- ; CHECK: define internal i32 @foo.specialized.2(i32 %x, ptr %b) !prof ![[FOO_SPEC_2_PROF:[0-9]]]
44
- define internal i32 @foo (i32 %x , ptr %b ) !prof !2 {
57
+ define dso_local i32 @baz (i32 %x , i32 %y ) !prof !2 {
58
+ ; CHECK-LABEL: define dso_local i32 @baz(
59
+ ; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) !prof [[PROF2:![0-9]+]] {
60
+ ; CHECK-NEXT: [[ENTRY:.*:]]
61
+ ; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[X]], 0
62
+ ; CHECK-NEXT: br i1 [[TOBOOL]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
63
+ ; CHECK: [[IF_THEN]]:
64
+ ; CHECK-NEXT: [[CALL:%.*]] = call i32 @foo.specialized.1(i32 [[X]], ptr @A)
65
+ ; CHECK-NEXT: br label %[[RETURN:.*]]
66
+ ; CHECK: [[IF_ELSE]]:
67
+ ; CHECK-NEXT: [[CALL1:%.*]] = call i32 @foo.specialized.2(i32 [[Y]], ptr @B)
68
+ ; CHECK-NEXT: br label %[[RETURN]]
69
+ ; CHECK: [[RETURN]]:
70
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[CALL]], %[[IF_THEN]] ], [ [[CALL1]], %[[IF_ELSE]] ]
71
+ ; CHECK-NEXT: ret i32 [[RETVAL_0]]
72
+ ;
73
+ entry:
74
+ %tobool = icmp ne i32 %x , 0
75
+ br i1 %tobool , label %if.then , label %if.else
76
+
77
+ if.then:
78
+ %call = call i32 @foo (i32 %x , ptr @A )
79
+ br label %return
80
+
81
+ if.else:
82
+ %call1 = call i32 @foo (i32 %y , ptr @B )
83
+ br label %return
84
+
85
+ return:
86
+ %retval.0 = phi i32 [ %call , %if.then ], [ %call1 , %if.else ]
87
+ ret i32 %retval.0
88
+ }
89
+
90
+ define internal i32 @foo (i32 %x , ptr %b ) !prof !3 {
91
+ ; CHECK-LABEL: define internal i32 @foo(
92
+ ; CHECK-SAME: i32 [[X:%.*]], ptr [[B:%.*]]) !prof [[PROF3:![0-9]+]] {
93
+ ; CHECK-NEXT: [[ENTRY:.*:]]
94
+ ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[B]], align 4
95
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[X]], [[TMP0]]
96
+ ; CHECK-NEXT: ret i32 [[ADD]]
97
+ ;
45
98
entry:
46
99
%0 = load i32 , ptr %b , align 4
47
100
%add = add nsw i32 %x , %0
48
101
ret i32 %add
49
102
}
50
103
51
- ; CHECK: ![[BAR_PROF]] = !{!"function_entry_count", i64 1000}
52
- ; CHECK: ![[BRANCH_PROF]] = !{!"branch_weights", i32 1, i32 3}
53
- ; CHECK: ![[FOO_UNSPEC_PROF]] = !{!"function_entry_count", i64 500}
54
- ; CHECK: ![[FOO_SPEC_1_PROF]] = !{!"function_entry_count", i64 250}
55
- ; CHECK: ![[FOO_SPEC_2_PROF]] = !{!"function_entry_count", i64 1250}
56
104
!0 = !{!"function_entry_count" , i64 1000 }
57
105
!1 = !{!"branch_weights" , i32 1 , i32 3 }
58
- !2 = !{!"function_entry_count" , i64 2000 }
106
+ !2 = !{!"function_entry_count" , i64 0 }
107
+ !3 = !{!"function_entry_count" , i64 2000 }
108
+ ;.
109
+ ; CHECK: [[PROF0]] = !{!"function_entry_count", i64 1000}
110
+ ; CHECK: [[PROF1]] = !{!"branch_weights", i32 1, i32 3}
111
+ ; CHECK: [[PROF2]] = !{!"function_entry_count", i64 0}
112
+ ; CHECK: [[PROF3]] = !{!"function_entry_count", i64 500}
113
+ ; CHECK: [[META4:![0-9]+]] = !{!"function_entry_count", i64 250}
114
+ ; CHECK: [[META5:![0-9]+]] = !{!"function_entry_count", i64 1250}
115
+ ;.
0 commit comments