Skip to content

Commit 761c31e

Browse files
authored
[FunctionSpecialization][nfc] Add a test for zero function entry count (#160156)
This test is a follow up to 7d748a9 which fixes an assertion crash that occurs if the profile count is 0. Additionally, modify `profile-counts.ll` to use `update_test_checks.py`.
1 parent c075fee commit 761c31e

File tree

1 file changed

+77
-20
lines changed

1 file changed

+77
-20
lines changed
Lines changed: 77 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,40 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --version 6
12
; RUN: opt -passes="ipsccp<func-spec>" -force-specialization -S < %s | FileCheck %s
23
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
34

45
@A = external dso_local constant i32, align 4
56
@B = external dso_local constant i32, align 4
67

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+
;.
812
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+
;
934
entry:
1035
%tobool = icmp ne i32 %x, 0
11-
; CHECK: br i1 %tobool, label %if.then, label %if.else, !prof ![[BRANCH_PROF:[0-9]]]
1236
br i1 %tobool, label %if.then, label %if.else, !prof !1
1337

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)
1838
if.then:
1939
%call = call i32 @foo(i32 %x, ptr @A)
2040
%call1 = call i32 @foo(i32 %y, ptr @B)
@@ -23,36 +43,73 @@ if.then:
2343
%add1 = add i32 %add, %call2
2444
br label %return
2545

26-
; CHECK: if.else:
27-
; CHECK: call i32 @foo.specialized.2(i32 %y, ptr @B)
2846
if.else:
2947
%call3 = call i32 @foo(i32 %y, ptr @B)
3048
br label %return
3149

32-
; CHECK: return:
33-
; CHECK: call i32 @foo(i32 %x, ptr %z)
3450
return:
3551
%retval.0 = phi i32 [ %add1, %if.then ], [ %call3, %if.else ]
3652
%call4 = call i32 @foo(i32 %x, ptr %z);
3753
%add2 = add i32 %retval.0, %call4
3854
ret i32 %add2
3955
}
4056

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+
;
4598
entry:
4699
%0 = load i32, ptr %b, align 4
47100
%add = add nsw i32 %x, %0
48101
ret i32 %add
49102
}
50103

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}
56104
!0 = !{!"function_entry_count", i64 1000}
57105
!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

Comments
 (0)