Skip to content

Commit 17c0d5a

Browse files
vladimirradosavljevicakiramenai
authored andcommitted
[EraVM] Add pre-commit test for Enable CSE between sub and cmp
Signed-off-by: Vladimir Radosavljevic <[email protected]>
1 parent 0f08c51 commit 17c0d5a

File tree

1 file changed

+159
-0
lines changed

1 file changed

+159
-0
lines changed
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2+
; RUN: llc -O3 < %s | FileCheck %s
3+
4+
target datalayout = "E-p:256:256-i256:256:256-S32-a:256:256"
5+
target triple = "eravm"
6+
7+
declare void @use(i256)
8+
9+
define i256 @test_small_imm(i256 %a) {
10+
; CHECK-LABEL: test_small_imm:
11+
; CHECK: ; %bb.0:
12+
; CHECK-NEXT: sub.s 10, r1, r3
13+
; CHECK-NEXT: mul 10, r1, r2, r4
14+
; CHECK-NEXT: sub.s! 10, r1, r1
15+
; CHECK-NEXT: add.ge r3, r0, r2
16+
; CHECK-NEXT: add r2, r0, r1
17+
; CHECK-NEXT: ret
18+
%sub = sub i256 %a, 10
19+
%mul = mul i256 %a, 10
20+
%cmp = icmp ult i256 %a, 10
21+
%select = select i1 %cmp, i256 %mul, i256 %sub
22+
ret i256 %select
23+
}
24+
25+
define i256 @test_large_imm(i256 %a) {
26+
; CHECK-LABEL: test_large_imm:
27+
; CHECK: ; %bb.0:
28+
; CHECK-NEXT: add @CPI1_0[0], r1, r3
29+
; CHECK-NEXT: mul @CPI1_1[0], r1, r2, r4
30+
; CHECK-NEXT: sub.s! @CPI1_1[0], r1, r1
31+
; CHECK-NEXT: add.ge r3, r0, r2
32+
; CHECK-NEXT: add r2, r0, r1
33+
; CHECK-NEXT: ret
34+
%sub = sub i256 %a, 123456789
35+
%mul = mul i256 %a, 123456789
36+
%cmp = icmp ult i256 %a, 123456789
37+
%select = select i1 %cmp, i256 %mul, i256 %sub
38+
ret i256 %select
39+
}
40+
41+
define i256 @test_reg(i256 %a, i256 %b) {
42+
; CHECK-LABEL: test_reg:
43+
; CHECK: ; %bb.0:
44+
; CHECK-NEXT: sub r1, r2, r4
45+
; CHECK-NEXT: mul r1, r2, r3, r5
46+
; CHECK-NEXT: sub! r1, r2, r1
47+
; CHECK-NEXT: add.ge r4, r0, r3
48+
; CHECK-NEXT: add r3, r0, r1
49+
; CHECK-NEXT: ret
50+
%sub = sub i256 %a, %b
51+
%mul = mul i256 %a, %b
52+
%cmp = icmp ult i256 %a, %b
53+
%select = select i1 %cmp, i256 %mul, i256 %sub
54+
ret i256 %select
55+
}
56+
57+
define i256 @test_in_different_bb(i256 %a, i256 %b) {
58+
; CHECK-LABEL: test_in_different_bb:
59+
; CHECK: ; %bb.0:
60+
; CHECK-NEXT: sub! r1, r2, r3
61+
; CHECK-NEXT: sub.ge r1, r2, r1
62+
; CHECK-NEXT: add.lt r0, r0, r1
63+
; CHECK-NEXT: ret
64+
%cmp = icmp ult i256 %a, %b
65+
br i1 %cmp, label %bb1, label %bb2
66+
67+
bb1:
68+
ret i256 0
69+
70+
bb2:
71+
%sub = sub i256 %a, %b
72+
ret i256 %sub
73+
}
74+
75+
define i256 @test_with_call(i256 %a, i256 %b) {
76+
; CHECK-LABEL: test_with_call:
77+
; CHECK: ; %bb.0:
78+
; CHECK-NEXT: nop stack+=[2 + r0]
79+
; CHECK-NEXT: add r2, r0, stack-[1] ; 32-byte Folded Spill
80+
; CHECK-NEXT: add r1, r0, stack-[2] ; 32-byte Folded Spill
81+
; CHECK-NEXT: sub! r1, r2, r3
82+
; CHECK-NEXT: add 10, r0, r1
83+
; CHECK-NEXT: add.lt 15, r0, r1
84+
; CHECK-NEXT: near_call r0, @use, @DEFAULT_UNWIND
85+
; CHECK-NEXT: add stack-[1], r0, r2 ; 32-byte Folded Reload
86+
; CHECK-NEXT: sub stack-[2], r2, r1
87+
; CHECK-NEXT: ret
88+
%cmp = icmp ult i256 %a, %b
89+
%select = select i1 %cmp, i256 15, i256 10
90+
call void @use(i256 %select)
91+
%sub = sub i256 %a, %b
92+
ret i256 %sub
93+
}
94+
95+
; Test that cmp is not eliminated, since we don't preserve flags after the call.
96+
define i256 @test_with_call_not(i256 %a) {
97+
; CHECK-LABEL: test_with_call_not:
98+
; CHECK: ; %bb.0:
99+
; CHECK-NEXT: nop stack+=[1 + r0]
100+
; CHECK-NEXT: add r1, r0, stack-[1] ; 32-byte Folded Spill
101+
; CHECK-NEXT: sub.s 10, r1, r1
102+
; CHECK-NEXT: near_call r0, @use, @DEFAULT_UNWIND
103+
; CHECK-NEXT: add stack-[1], r0, r1 ; 32-byte Folded Reload
104+
; CHECK-NEXT: sub.s! 10, r1, r1
105+
; CHECK-NEXT: add 10, r0, r1
106+
; CHECK-NEXT: add.lt 15, r0, r1
107+
; CHECK-NEXT: ret
108+
%sub = sub i256 %a, 10
109+
call void @use(i256 %sub)
110+
%cmp = icmp ult i256 %a, 10
111+
%select = select i1 %cmp, i256 15, i256 10
112+
ret i256 %select
113+
}
114+
115+
define i256 @test_elim_identical_cmps(i256 %a, ptr addrspace(1) %ptr) {
116+
; CHECK-LABEL: test_elim_identical_cmps:
117+
; CHECK: ; %bb.0:
118+
; CHECK-NEXT: sub.s! 10, r1, r3
119+
; CHECK-NEXT: add 10, r0, r3
120+
; CHECK-NEXT: add.lt 15, r0, r3
121+
; CHECK-NEXT: sub r3, r1, r1
122+
; CHECK-NEXT: st.1 r2, r1
123+
; CHECK-NEXT: add 15, r0, r1
124+
; CHECK-NEXT: add.lt 10, r0, r1
125+
; CHECK-NEXT: ret
126+
%cmp1 = icmp ult i256 %a, 10
127+
%select1 = select i1 %cmp1, i256 15, i256 10
128+
%sub = sub i256 %select1, %a
129+
store i256 %sub, ptr addrspace(1) %ptr
130+
%cmp2 = icmp ult i256 %a, 10
131+
%select2 = select i1 %cmp2, i256 10, i256 15
132+
ret i256 %select2
133+
}
134+
135+
define i256 @test_dont_elim_identical_cmps(i256 %a, ptr addrspace(1) %ptr) {
136+
; CHECK-LABEL: test_dont_elim_identical_cmps:
137+
; CHECK: ; %bb.0:
138+
; CHECK-NEXT: nop stack+=[1 + r0]
139+
; CHECK-NEXT: add r1, r0, stack-[1] ; 32-byte Folded Spill
140+
; CHECK-NEXT: sub.s! 10, r1, r3
141+
; CHECK-NEXT: add 10, r0, r3
142+
; CHECK-NEXT: add.lt 15, r0, r3
143+
; CHECK-NEXT: sub r3, r1, r1
144+
; CHECK-NEXT: st.1 r2, r1
145+
; CHECK-NEXT: near_call r0, @use, @DEFAULT_UNWIND
146+
; CHECK-NEXT: add stack-[1], r0, r1 ; 32-byte Folded Reload
147+
; CHECK-NEXT: sub.s! 10, r1, r1
148+
; CHECK-NEXT: add 15, r0, r1
149+
; CHECK-NEXT: add.lt 10, r0, r1
150+
; CHECK-NEXT: ret
151+
%cmp1 = icmp ult i256 %a, 10
152+
%select1 = select i1 %cmp1, i256 15, i256 10
153+
%sub = sub i256 %select1, %a
154+
store i256 %sub, ptr addrspace(1) %ptr
155+
call void @use(i256 %sub)
156+
%cmp2 = icmp ult i256 %a, 10
157+
%select2 = select i1 %cmp2, i256 10, i256 15
158+
ret i256 %select2
159+
}

0 commit comments

Comments
 (0)