Skip to content

Commit 927e3aa

Browse files
committed
[CVP] Add tests for adding nneg flag to uitofp and converting sitofp -> uitofp nneg; NFC
1 parent ea9f339 commit 927e3aa

File tree

2 files changed

+406
-0
lines changed

2 files changed

+406
-0
lines changed
Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -passes=correlated-propagation -S | FileCheck %s
3+
4+
declare void @use.f32(float)
5+
6+
define void @test1_fptosi(i32 %n) {
7+
; CHECK-LABEL: @test1_fptosi(
8+
; CHECK-NEXT: entry:
9+
; CHECK-NEXT: br label [[FOR_COND:%.*]]
10+
; CHECK: for.cond:
11+
; CHECK-NEXT: [[A:%.*]] = phi i32 [ [[N:%.*]], [[ENTRY:%.*]] ], [ [[EXT:%.*]], [[FOR_BODY:%.*]] ]
12+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A]], -1
13+
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
14+
; CHECK: for.body:
15+
; CHECK-NEXT: [[EXT_WIDE:%.*]] = sitofp i32 [[A]] to float
16+
; CHECK-NEXT: call void @use.f32(float [[EXT_WIDE]])
17+
; CHECK-NEXT: [[EXT]] = fptosi float [[EXT_WIDE]] to i32
18+
; CHECK-NEXT: br label [[FOR_COND]]
19+
; CHECK: for.end:
20+
; CHECK-NEXT: ret void
21+
;
22+
entry:
23+
br label %for.cond
24+
25+
for.cond: ; preds = %for.body, %entry
26+
%a = phi i32 [ %n, %entry ], [ %ext, %for.body ]
27+
%cmp = icmp sgt i32 %a, -1
28+
br i1 %cmp, label %for.body, label %for.end
29+
30+
for.body: ; preds = %for.cond
31+
%ext.wide = sitofp i32 %a to float
32+
call void @use.f32(float %ext.wide)
33+
%ext = fptosi float %ext.wide to i32
34+
br label %for.cond
35+
36+
for.end: ; preds = %for.cond
37+
ret void
38+
}
39+
40+
define void @test1_fptoui(i32 %n) {
41+
; CHECK-LABEL: @test1_fptoui(
42+
; CHECK-NEXT: entry:
43+
; CHECK-NEXT: br label [[FOR_COND:%.*]]
44+
; CHECK: for.cond:
45+
; CHECK-NEXT: [[A:%.*]] = phi i32 [ [[N:%.*]], [[ENTRY:%.*]] ], [ [[EXT:%.*]], [[FOR_BODY:%.*]] ]
46+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A]], -1
47+
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
48+
; CHECK: for.body:
49+
; CHECK-NEXT: [[EXT_WIDE:%.*]] = sitofp i32 [[A]] to float
50+
; CHECK-NEXT: call void @use.f32(float [[EXT_WIDE]])
51+
; CHECK-NEXT: [[EXT]] = fptoui float [[EXT_WIDE]] to i32
52+
; CHECK-NEXT: br label [[FOR_COND]]
53+
; CHECK: for.end:
54+
; CHECK-NEXT: ret void
55+
;
56+
entry:
57+
br label %for.cond
58+
59+
for.cond: ; preds = %for.body, %entry
60+
%a = phi i32 [ %n, %entry ], [ %ext, %for.body ]
61+
%cmp = icmp sgt i32 %a, -1
62+
br i1 %cmp, label %for.body, label %for.end
63+
64+
for.body: ; preds = %for.cond
65+
%ext.wide = sitofp i32 %a to float
66+
call void @use.f32(float %ext.wide)
67+
%ext = fptoui float %ext.wide to i32
68+
br label %for.cond
69+
70+
for.end: ; preds = %for.cond
71+
ret void
72+
}
73+
74+
;; Negative test to show transform doesn't happen unless n >= 0.
75+
define void @test2(i32 %n) {
76+
; CHECK-LABEL: @test2(
77+
; CHECK-NEXT: entry:
78+
; CHECK-NEXT: br label [[FOR_COND:%.*]]
79+
; CHECK: for.cond:
80+
; CHECK-NEXT: [[A:%.*]] = phi i32 [ [[N:%.*]], [[ENTRY:%.*]] ], [ [[EXT:%.*]], [[FOR_BODY:%.*]] ]
81+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A]], -2
82+
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
83+
; CHECK: for.body:
84+
; CHECK-NEXT: [[EXT_WIDE:%.*]] = sitofp i32 [[A]] to float
85+
; CHECK-NEXT: call void @use.f32(float [[EXT_WIDE]])
86+
; CHECK-NEXT: [[EXT]] = fptosi float [[EXT_WIDE]] to i32
87+
; CHECK-NEXT: br label [[FOR_COND]]
88+
; CHECK: for.end:
89+
; CHECK-NEXT: ret void
90+
;
91+
entry:
92+
br label %for.cond
93+
94+
for.cond: ; preds = %for.body, %entry
95+
%a = phi i32 [ %n, %entry ], [ %ext, %for.body ]
96+
%cmp = icmp sgt i32 %a, -2
97+
br i1 %cmp, label %for.body, label %for.end
98+
99+
for.body: ; preds = %for.cond
100+
%ext.wide = sitofp i32 %a to float
101+
call void @use.f32(float %ext.wide)
102+
%ext = fptosi float %ext.wide to i32
103+
br label %for.cond
104+
105+
for.end: ; preds = %for.cond
106+
ret void
107+
}
108+
109+
;; Non looping test case.
110+
define void @test3(i32 %n) {
111+
; CHECK-LABEL: @test3(
112+
; CHECK-NEXT: entry:
113+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[N:%.*]], -1
114+
; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
115+
; CHECK: bb:
116+
; CHECK-NEXT: [[EXT_WIDE:%.*]] = sitofp i32 [[N]] to float
117+
; CHECK-NEXT: call void @use.f32(float [[EXT_WIDE]])
118+
; CHECK-NEXT: br label [[EXIT]]
119+
; CHECK: exit:
120+
; CHECK-NEXT: ret void
121+
;
122+
entry:
123+
%cmp = icmp sgt i32 %n, -1
124+
br i1 %cmp, label %bb, label %exit
125+
126+
bb:
127+
%ext.wide = sitofp i32 %n to float
128+
call void @use.f32(float %ext.wide)
129+
br label %exit
130+
131+
exit:
132+
ret void
133+
}
134+
135+
;; Non looping negative test case.
136+
define void @test4(i32 %n) {
137+
; CHECK-LABEL: @test4(
138+
; CHECK-NEXT: entry:
139+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[N:%.*]], -2
140+
; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
141+
; CHECK: bb:
142+
; CHECK-NEXT: [[EXT_WIDE:%.*]] = sitofp i32 [[N]] to float
143+
; CHECK-NEXT: call void @use.f32(float [[EXT_WIDE]])
144+
; CHECK-NEXT: br label [[EXIT]]
145+
; CHECK: exit:
146+
; CHECK-NEXT: ret void
147+
;
148+
entry:
149+
%cmp = icmp sgt i32 %n, -2
150+
br i1 %cmp, label %bb, label %exit
151+
152+
bb:
153+
%ext.wide = sitofp i32 %n to float
154+
call void @use.f32(float %ext.wide)
155+
br label %exit
156+
157+
exit:
158+
ret void
159+
}
160+
161+
define float @may_including_undef(i1 %c.1, i1 %c.2) {
162+
; CHECK-LABEL: @may_including_undef(
163+
; CHECK-NEXT: br i1 [[C_1:%.*]], label [[TRUE_1:%.*]], label [[FALSE:%.*]]
164+
; CHECK: true.1:
165+
; CHECK-NEXT: br i1 [[C_2:%.*]], label [[TRUE_2:%.*]], label [[EXIT:%.*]]
166+
; CHECK: true.2:
167+
; CHECK-NEXT: br label [[EXIT]]
168+
; CHECK: false:
169+
; CHECK-NEXT: br label [[EXIT]]
170+
; CHECK: exit:
171+
; CHECK-NEXT: [[P:%.*]] = phi i32 [ 0, [[TRUE_1]] ], [ 1, [[TRUE_2]] ], [ undef, [[FALSE]] ]
172+
; CHECK-NEXT: [[EXT:%.*]] = sitofp i32 [[P]] to float
173+
; CHECK-NEXT: ret float [[EXT]]
174+
;
175+
br i1 %c.1, label %true.1, label %false
176+
177+
true.1:
178+
br i1 %c.2, label %true.2, label %exit
179+
180+
true.2:
181+
br label %exit
182+
183+
false:
184+
br label %exit
185+
186+
exit:
187+
%p = phi i32 [ 0, %true.1 ], [ 1, %true.2], [ undef, %false ]
188+
%ext = sitofp i32 %p to float
189+
ret float %ext
190+
}
191+
192+
define double @test_infer_at_use(i32 noundef %n) {
193+
; CHECK-LABEL: @test_infer_at_use(
194+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[N:%.*]], -1
195+
; CHECK-NEXT: [[EXT:%.*]] = sitofp i32 [[N]] to double
196+
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], double [[EXT]], double 0.000000e+00
197+
; CHECK-NEXT: ret double [[SELECT]]
198+
;
199+
%cmp = icmp sgt i32 %n, -1
200+
%ext = sitofp i32 %n to double
201+
%select = select i1 %cmp, double %ext, double 0.0
202+
ret double %select
203+
}

0 commit comments

Comments
 (0)