Skip to content

Commit 073552c

Browse files
committed
[EarlyCSE] Add tests for de-duplication of callsites with differing attrs; NFC
1 parent e343af7 commit 073552c

File tree

1 file changed

+127
-0
lines changed

1 file changed

+127
-0
lines changed
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes --check-globals all --version 5
2+
; RUN: opt -S -passes=early-cse < %s | FileCheck %s
3+
4+
declare i8 @baz(i8, i8) readnone
5+
declare i8 @buz(i8, i8)
6+
define i8 @same_parent_combine_diff_attrs(i8 %x, i8 %y) {
7+
; CHECK-LABEL: define i8 @same_parent_combine_diff_attrs(
8+
; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
9+
; CHECK-NEXT: [[C1:%.*]] = call i8 @baz(i8 [[X]], i8 noundef [[Y]])
10+
; CHECK-NEXT: [[C0:%.*]] = call i8 @baz(i8 noundef [[X]], i8 noundef [[Y]])
11+
; CHECK-NEXT: [[R:%.*]] = call i8 @buz(i8 [[C0]], i8 [[C1]])
12+
; CHECK-NEXT: ret i8 [[R]]
13+
;
14+
%c1 = call i8 @baz(i8 %x, i8 noundef %y)
15+
%c0 = call i8 @baz(i8 noundef %x, i8 noundef %y)
16+
%r = call i8 @buz(i8 %c0, i8 %c1)
17+
ret i8 %r
18+
19+
}
20+
21+
define i8 @diff_parent_combine_diff_attrs(i1 %c, i8 %x, i8 %y) {
22+
; CHECK-LABEL: define i8 @diff_parent_combine_diff_attrs(
23+
; CHECK-SAME: i1 [[C:%.*]], i8 [[X:%.*]], i8 [[Y:%.*]]) {
24+
; CHECK-NEXT: [[C1:%.*]] = call i8 @baz(i8 [[X]], i8 noundef [[Y]])
25+
; CHECK-NEXT: br i1 [[C]], label %[[T:.*]], label %[[F:.*]]
26+
; CHECK: [[T]]:
27+
; CHECK-NEXT: [[C0:%.*]] = call i8 @baz(i8 noundef [[X]], i8 noundef [[Y]])
28+
; CHECK-NEXT: [[R:%.*]] = call i8 @buz(i8 [[C0]], i8 [[C1]])
29+
; CHECK-NEXT: ret i8 [[R]]
30+
; CHECK: [[F]]:
31+
; CHECK-NEXT: [[R2:%.*]] = add i8 [[C1]], 4
32+
; CHECK-NEXT: ret i8 [[R2]]
33+
;
34+
%c1 = call i8 @baz(i8 %x, i8 noundef %y)
35+
br i1 %c, label %T, label %F
36+
T:
37+
%c0 = call i8 @baz(i8 noundef %x, i8 noundef %y)
38+
%r = call i8 @buz(i8 %c0, i8 %c1)
39+
ret i8 %r
40+
F:
41+
%r2 = add i8 %c1, 4
42+
ret i8 %r2
43+
}
44+
45+
define i8 @same_parent_combine_diff_attrs_todo(i8 %x, i8 %y) {
46+
; CHECK-LABEL: define i8 @same_parent_combine_diff_attrs_todo(
47+
; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
48+
; CHECK-NEXT: [[C1:%.*]] = call i8 @baz(i8 [[X]], i8 noundef [[Y]])
49+
; CHECK-NEXT: [[C0:%.*]] = call i8 @baz(i8 noundef [[X]], i8 noundef [[Y]]) #[[ATTR1:[0-9]+]]
50+
; CHECK-NEXT: [[R:%.*]] = call i8 @buz(i8 [[C0]], i8 [[C1]])
51+
; CHECK-NEXT: ret i8 [[R]]
52+
;
53+
%c1 = call i8 @baz(i8 %x, i8 noundef %y)
54+
%c0 = call i8 @baz(i8 noundef %x, i8 noundef %y) alwaysinline
55+
%r = call i8 @buz(i8 %c0, i8 %c1)
56+
ret i8 %r
57+
58+
}
59+
60+
define i8 @same_parent_combine_diff_attrs_fail(i8 %x, i8 %y) {
61+
; CHECK-LABEL: define i8 @same_parent_combine_diff_attrs_fail(
62+
; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
63+
; CHECK-NEXT: [[C1:%.*]] = call i8 @baz(i8 [[X]], i8 noundef [[Y]])
64+
; CHECK-NEXT: [[C0:%.*]] = call i8 @baz(i8 noundef [[X]], i8 noundef [[Y]]) #[[ATTR2:[0-9]+]]
65+
; CHECK-NEXT: [[R:%.*]] = call i8 @buz(i8 [[C0]], i8 [[C1]])
66+
; CHECK-NEXT: ret i8 [[R]]
67+
;
68+
%c1 = call i8 @baz(i8 %x, i8 noundef %y)
69+
%c0 = call i8 @baz(i8 noundef %x, i8 noundef %y) strictfp
70+
%r = call i8 @buz(i8 %c0, i8 %c1)
71+
ret i8 %r
72+
73+
}
74+
75+
define i8 @diff_parent_combine_diff_attrs_todo(i1 %c, i8 %x, i8 %y) {
76+
; CHECK-LABEL: define i8 @diff_parent_combine_diff_attrs_todo(
77+
; CHECK-SAME: i1 [[C:%.*]], i8 [[X:%.*]], i8 [[Y:%.*]]) {
78+
; CHECK-NEXT: [[C1:%.*]] = call i8 @baz(i8 [[X]], i8 noundef [[Y]])
79+
; CHECK-NEXT: br i1 [[C]], label %[[T:.*]], label %[[F:.*]]
80+
; CHECK: [[T]]:
81+
; CHECK-NEXT: [[C0:%.*]] = call i8 @baz(i8 noundef [[X]], i8 noundef [[Y]]) #[[ATTR3:[0-9]+]]
82+
; CHECK-NEXT: [[R:%.*]] = call i8 @buz(i8 [[C0]], i8 [[C1]])
83+
; CHECK-NEXT: ret i8 [[R]]
84+
; CHECK: [[F]]:
85+
; CHECK-NEXT: [[R2:%.*]] = add i8 [[C1]], 4
86+
; CHECK-NEXT: ret i8 [[R2]]
87+
;
88+
%c1 = call i8 @baz(i8 %x, i8 noundef %y)
89+
br i1 %c, label %T, label %F
90+
T:
91+
%c0 = call i8 @baz(i8 noundef %x, i8 noundef %y) optnone noinline
92+
%r = call i8 @buz(i8 %c0, i8 %c1)
93+
ret i8 %r
94+
F:
95+
%r2 = add i8 %c1, 4
96+
ret i8 %r2
97+
}
98+
99+
define i8 @diff_parent_combine_diff_attrs_fail(i1 %c, i8 %x, i8 %y) {
100+
; CHECK-LABEL: define i8 @diff_parent_combine_diff_attrs_fail(
101+
; CHECK-SAME: i1 [[C:%.*]], i8 [[X:%.*]], i8 [[Y:%.*]]) {
102+
; CHECK-NEXT: [[C1:%.*]] = call i8 @baz(i8 [[X]], i8 noundef [[Y]])
103+
; CHECK-NEXT: br i1 [[C]], label %[[T:.*]], label %[[F:.*]]
104+
; CHECK: [[T]]:
105+
; CHECK-NEXT: [[C0:%.*]] = call i8 @baz(i8 noundef [[X]], i8 noundef [[Y]]) #[[ATTR2]]
106+
; CHECK-NEXT: [[R:%.*]] = call i8 @buz(i8 [[C0]], i8 [[C1]])
107+
; CHECK-NEXT: ret i8 [[R]]
108+
; CHECK: [[F]]:
109+
; CHECK-NEXT: [[R2:%.*]] = add i8 [[C1]], 4
110+
; CHECK-NEXT: ret i8 [[R2]]
111+
;
112+
%c1 = call i8 @baz(i8 %x, i8 noundef %y)
113+
br i1 %c, label %T, label %F
114+
T:
115+
%c0 = call i8 @baz(i8 noundef %x, i8 noundef %y) strictfp
116+
%r = call i8 @buz(i8 %c0, i8 %c1)
117+
ret i8 %r
118+
F:
119+
%r2 = add i8 %c1, 4
120+
ret i8 %r2
121+
}
122+
;.
123+
; CHECK: attributes #[[ATTR0:[0-9]+]] = { memory(none) }
124+
; CHECK: attributes #[[ATTR1]] = { alwaysinline }
125+
; CHECK: attributes #[[ATTR2]] = { strictfp }
126+
; CHECK: attributes #[[ATTR3]] = { noinline optnone }
127+
;.

0 commit comments

Comments
 (0)