Skip to content

Commit d378903

Browse files
[EraVM] Add pre-commit test for Optimize towards branch on zero in EraVMPostCodegenPrepare
Add tests where lshr/add/sub + cmp can be transformed into lshr/add/sub + cmp eq/ne 0. This transformation is beneficial, since lshl/add/sub produce flags and cmp can be combined with them. Signed-off-by: Vladimir Radosavljevic <[email protected]>
1 parent b939bbe commit d378903

File tree

1 file changed

+140
-0
lines changed

1 file changed

+140
-0
lines changed
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
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+
define i256 @lshr(i256 %a) {
8+
; CHECK-LABEL: lshr:
9+
; CHECK: ; %bb.0: ; %entry
10+
; CHECK-NEXT: sub.s! 7, r1, r2
11+
; CHECK-NEXT: shr.s.gt 3, r1, r1
12+
; CHECK-NEXT: add.le r0, r0, r1
13+
; CHECK-NEXT: ret
14+
entry:
15+
%c = icmp ult i256 %a, 8
16+
br i1 %c, label %then, label %else
17+
18+
then:
19+
ret i256 0
20+
21+
else:
22+
%l = lshr i256 %a, 3
23+
ret i256 %l
24+
}
25+
26+
define i256 @lshr_not(i256 %a) {
27+
; CHECK-LABEL: lshr_not:
28+
; CHECK: ; %bb.0: ; %entry
29+
; CHECK-NEXT: sub.s! 7, r1, r2
30+
; CHECK-NEXT: shr.s.gt 4, r1, r1
31+
; CHECK-NEXT: add.le r0, r0, r1
32+
; CHECK-NEXT: ret
33+
entry:
34+
%c = icmp ult i256 %a, 8
35+
br i1 %c, label %then, label %else
36+
37+
then:
38+
ret i256 0
39+
40+
else:
41+
%l = lshr i256 %a, 4
42+
ret i256 %l
43+
}
44+
45+
; Test where overflow intrinsic would be generated if this
46+
; optimization is done in the CodeGenPrepare pass.
47+
define i256 @add_overflow(i256 %a) {
48+
; CHECK-LABEL: add_overflow:
49+
; CHECK: ; %bb.0: ; %entry
50+
; CHECK-NEXT: sub.s! @CPI2_0[0], r1, r2
51+
; CHECK-NEXT: add.ne 1, r1, r1
52+
; CHECK-NEXT: add.eq r0, r0, r1
53+
; CHECK-NEXT: ret
54+
entry:
55+
%c = icmp eq i256 %a, -1
56+
br i1 %c, label %then, label %else
57+
58+
then:
59+
ret i256 0
60+
61+
else:
62+
%l = add i256 %a, 1
63+
ret i256 %l
64+
}
65+
66+
define i256 @add(i256 %a) {
67+
; CHECK-LABEL: add:
68+
; CHECK: ; %bb.0: ; %entry
69+
; CHECK-NEXT: sub.s! 10, r1, r2
70+
; CHECK-NEXT: sub.s.ne 10, r1, r1
71+
; CHECK-NEXT: add.eq r0, r0, r1
72+
; CHECK-NEXT: ret
73+
entry:
74+
%c = icmp eq i256 %a, 10
75+
br i1 %c, label %then, label %else
76+
77+
then:
78+
ret i256 0
79+
80+
else:
81+
%l = add i256 %a, -10
82+
ret i256 %l
83+
}
84+
85+
define i256 @add_not(i256 %a) {
86+
; CHECK-LABEL: add_not:
87+
; CHECK: ; %bb.0: ; %entry
88+
; CHECK-NEXT: sub.s! 10, r1, r2
89+
; CHECK-NEXT: add.ne 10, r1, r1
90+
; CHECK-NEXT: add.eq r0, r0, r1
91+
; CHECK-NEXT: ret
92+
entry:
93+
%c = icmp eq i256 %a, 10
94+
br i1 %c, label %then, label %else
95+
96+
then:
97+
ret i256 0
98+
99+
else:
100+
%l = add i256 %a, 10
101+
ret i256 %l
102+
}
103+
104+
define i256 @sub(i256 %a) {
105+
; CHECK-LABEL: sub:
106+
; CHECK: ; %bb.0: ; %entry
107+
; CHECK-NEXT: sub.s! 10, r1, r2
108+
; CHECK-NEXT: sub.s.ne 10, r1, r1
109+
; CHECK-NEXT: add.eq r0, r0, r1
110+
; CHECK-NEXT: ret
111+
entry:
112+
%c = icmp eq i256 %a, 10
113+
br i1 %c, label %then, label %else
114+
115+
then:
116+
ret i256 0
117+
118+
else:
119+
%l = sub i256 %a, 10
120+
ret i256 %l
121+
}
122+
123+
define i256 @sub_not(i256 %a) {
124+
; CHECK-LABEL: sub_not:
125+
; CHECK: ; %bb.0: ; %entry
126+
; CHECK-NEXT: sub.s! 10, r1, r2
127+
; CHECK-NEXT: add.ne 10, r1, r1
128+
; CHECK-NEXT: add.eq r0, r0, r1
129+
; CHECK-NEXT: ret
130+
entry:
131+
%c = icmp eq i256 %a, 10
132+
br i1 %c, label %then, label %else
133+
134+
then:
135+
ret i256 0
136+
137+
else:
138+
%l = sub i256 %a, -10
139+
ret i256 %l
140+
}

0 commit comments

Comments
 (0)