Skip to content

Commit 30dcc33

Browse files
committed
[FuncAttrs] Add pre-commit tests. NFC.
1 parent 7f69c8b commit 30dcc33

File tree

1 file changed

+145
-0
lines changed

1 file changed

+145
-0
lines changed
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt < %s -passes='function-attrs' -S | FileCheck %s
3+
4+
define i32 @test_ret_constant() {
5+
; CHECK-LABEL: define i32 @test_ret_constant(
6+
; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
7+
; CHECK-NEXT: ret i32 0
8+
;
9+
ret i32 0
10+
}
11+
12+
define i32 @test_ret_poison() {
13+
; CHECK-LABEL: define i32 @test_ret_poison(
14+
; CHECK-SAME: ) #[[ATTR0]] {
15+
; CHECK-NEXT: ret i32 poison
16+
;
17+
ret i32 poison
18+
}
19+
20+
define i32 @test_ret_undef() {
21+
; CHECK-LABEL: define i32 @test_ret_undef(
22+
; CHECK-SAME: ) #[[ATTR0]] {
23+
; CHECK-NEXT: ret i32 undef
24+
;
25+
ret i32 undef
26+
}
27+
28+
define i32 @test_ret_param(i32 %x) {
29+
; CHECK-LABEL: define i32 @test_ret_param(
30+
; CHECK-SAME: i32 returned [[X:%.*]]) #[[ATTR0]] {
31+
; CHECK-NEXT: ret i32 [[X]]
32+
;
33+
ret i32 %x
34+
}
35+
36+
define i32 @test_ret_noundef_param(i32 noundef %x) {
37+
; CHECK-LABEL: define i32 @test_ret_noundef_param(
38+
; CHECK-SAME: i32 noundef returned [[X:%.*]]) #[[ATTR0]] {
39+
; CHECK-NEXT: ret i32 [[X]]
40+
;
41+
ret i32 %x
42+
}
43+
44+
define i32 @test_ret_noundef_expr(i32 noundef %x) {
45+
; CHECK-LABEL: define i32 @test_ret_noundef_expr(
46+
; CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0]] {
47+
; CHECK-NEXT: [[Y:%.*]] = add i32 [[X]], 1
48+
; CHECK-NEXT: ret i32 [[Y]]
49+
;
50+
%y = add i32 %x, 1
51+
ret i32 %y
52+
}
53+
54+
define i32 @test_ret_create_poison_expr(i32 noundef %x) {
55+
; CHECK-LABEL: define i32 @test_ret_create_poison_expr(
56+
; CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0]] {
57+
; CHECK-NEXT: [[Y:%.*]] = add nsw i32 [[X]], 1
58+
; CHECK-NEXT: ret i32 [[Y]]
59+
;
60+
%y = add nsw i32 %x, 1
61+
ret i32 %y
62+
}
63+
64+
define i32 @test_ret_freezed(i32 noundef %x) {
65+
; CHECK-LABEL: define i32 @test_ret_freezed(
66+
; CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0]] {
67+
; CHECK-NEXT: [[Y:%.*]] = add nsw i32 [[X]], 1
68+
; CHECK-NEXT: [[Z:%.*]] = freeze i32 [[Y]]
69+
; CHECK-NEXT: ret i32 [[Z]]
70+
;
71+
%y = add nsw i32 %x, 1
72+
%z = freeze i32 %y
73+
ret i32 %z
74+
}
75+
76+
define i32 @test_ret_control_flow(i32 noundef %x) {
77+
; CHECK-LABEL: define i32 @test_ret_control_flow(
78+
; CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0]] {
79+
; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[X]], 0
80+
; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
81+
; CHECK: if.then:
82+
; CHECK-NEXT: ret i32 2
83+
; CHECK: if.else:
84+
; CHECK-NEXT: [[RET:%.*]] = add i32 [[X]], 1
85+
; CHECK-NEXT: ret i32 [[RET]]
86+
;
87+
%cond = icmp eq i32 %x, 0
88+
br i1 %cond, label %if.then, label %if.else
89+
if.then:
90+
ret i32 2
91+
if.else:
92+
%ret = add i32 %x, 1
93+
ret i32 %ret
94+
}
95+
96+
define i32 @test_ret_control_flow_may_poison(i32 noundef %x) {
97+
; CHECK-LABEL: define i32 @test_ret_control_flow_may_poison(
98+
; CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0]] {
99+
; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[X]], 0
100+
; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
101+
; CHECK: if.then:
102+
; CHECK-NEXT: ret i32 2
103+
; CHECK: if.else:
104+
; CHECK-NEXT: [[RET:%.*]] = add nsw i32 [[X]], 1
105+
; CHECK-NEXT: ret i32 [[RET]]
106+
;
107+
%cond = icmp eq i32 %x, 0
108+
br i1 %cond, label %if.then, label %if.else
109+
if.then:
110+
ret i32 2
111+
if.else:
112+
%ret = add nsw i32 %x, 1
113+
ret i32 %ret
114+
}
115+
116+
; TODO: use context-sensitive analysis
117+
define i32 @test_ret_control_flow_never_poison(i32 noundef %x) {
118+
; CHECK-LABEL: define i32 @test_ret_control_flow_never_poison(
119+
; CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0]] {
120+
; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[X]], 2147483647
121+
; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
122+
; CHECK: if.then:
123+
; CHECK-NEXT: ret i32 2
124+
; CHECK: if.else:
125+
; CHECK-NEXT: [[RET:%.*]] = add nsw i32 [[X]], 1
126+
; CHECK-NEXT: ret i32 [[RET]]
127+
;
128+
%cond = icmp eq i32 %x, 2147483647
129+
br i1 %cond, label %if.then, label %if.else
130+
if.then:
131+
ret i32 2
132+
if.else:
133+
%ret = add nsw i32 %x, 1
134+
ret i32 %ret
135+
}
136+
137+
define i32 @test_noundef_prop() {
138+
; CHECK-LABEL: define i32 @test_noundef_prop(
139+
; CHECK-SAME: ) #[[ATTR0]] {
140+
; CHECK-NEXT: [[RET:%.*]] = call i32 @test_ret_constant()
141+
; CHECK-NEXT: ret i32 [[RET]]
142+
;
143+
%ret = call i32 @test_ret_constant()
144+
ret i32 %ret
145+
}

0 commit comments

Comments
 (0)