Skip to content

Commit 14f5e70

Browse files
vladimirradosavljevicakiramenai
authored andcommitted
[EVM][InlineCost] Add pre-commit tests for Set threshold to a small value when BB is unreachable-terminated
Add positive and negative tests to show why in some cases is preferable to inline when BB is unreachable-terminated. Functions callee_inline is taken from real world example where inlining this function reduces one SLOAD after optimizations (we have the same load from the callers and in the callee). Signed-off-by: Vladimir Radosavljevic <[email protected]>
1 parent f5cf52c commit 14f5e70

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
; RUN: opt -passes=inline -S < %s | FileCheck %s
2+
3+
target datalayout = "E-p:256:256-i256:256:256-S256-a:256:256"
4+
target triple = "evm"
5+
6+
; CHECK-LABEL: define private void @callee_inline
7+
define private void @callee_inline(i256 %arg) {
8+
entry:
9+
%itptr = inttoptr i256 %arg to ptr addrspace(5)
10+
%load = load i256, ptr addrspace(5) %itptr, align 1
11+
%and = and i256 %load, 1461501637330902918203684832716283019655932542975
12+
%cmp = icmp eq i256 %and, 0
13+
br i1 %cmp, label %bb1, label %bb2
14+
15+
bb1:
16+
store i256 32754936060235842233766999496646880210696060726502698976450834618736336437248, ptr addrspace(1) null, align 32
17+
tail call void @llvm.evm.revert(ptr addrspace(1) null, i256 32)
18+
unreachable
19+
20+
bb2:
21+
ret void
22+
}
23+
24+
; CHECK-LABEL: define void @caller_inline1
25+
define void @caller_inline1(i256 %arg) {
26+
entry:
27+
; CHECK: call void @callee_inline(i256 %arg)
28+
call void @callee_inline(i256 %arg)
29+
%itptr = inttoptr i256 %arg to ptr addrspace(5)
30+
%load = load i256, ptr addrspace(5) %itptr, align 1
31+
store i256 %load, ptr addrspace(1) null, align 32
32+
call void @llvm.evm.return(ptr addrspace(1) null, i256 32)
33+
unreachable
34+
}
35+
36+
; CHECK-LABEL: define void @caller_inline2
37+
define void @caller_inline2(i256 %arg1, i256 %arg2) {
38+
entry:
39+
; CHECK: call void @callee_inline(i256 %arg2)
40+
call void @callee_inline(i256 %arg2)
41+
%itptr = inttoptr i256 %arg2 to ptr addrspace(5)
42+
%load = load i256, ptr addrspace(5) %itptr, align 1
43+
store i256 %load, ptr addrspace(1) null, align 32
44+
call void @llvm.evm.return(ptr addrspace(1) null, i256 32)
45+
unreachable
46+
}
47+
48+
; CHECK-LABEL: define private void @callee_noinline
49+
define private void @callee_noinline() {
50+
entry:
51+
store i256 128, ptr addrspace(5) inttoptr (i256 32 to ptr addrspace(5)), align 32
52+
store i256 128, ptr addrspace(5) inttoptr (i256 64 to ptr addrspace(5)), align 32
53+
store i256 128, ptr addrspace(5) inttoptr (i256 96 to ptr addrspace(5)), align 32
54+
store i256 128, ptr addrspace(5) inttoptr (i256 128 to ptr addrspace(5)), align 32
55+
store i256 128, ptr addrspace(5) inttoptr (i256 160 to ptr addrspace(5)), align 32
56+
store i256 128, ptr addrspace(5) inttoptr (i256 192 to ptr addrspace(5)), align 32
57+
store i256 128, ptr addrspace(5) inttoptr (i256 224 to ptr addrspace(5)), align 32
58+
store i256 128, ptr addrspace(5) inttoptr (i256 256 to ptr addrspace(5)), align 32
59+
store i256 128, ptr addrspace(5) inttoptr (i256 288 to ptr addrspace(5)), align 32
60+
ret void
61+
}
62+
63+
; CHECK-LABEL: define void @caller_noinline1
64+
define void @caller_noinline1() {
65+
entry:
66+
; CHECK: call void @callee_noinline()
67+
call void @callee_noinline()
68+
call void @llvm.evm.return(ptr addrspace(1) null, i256 0)
69+
unreachable
70+
}
71+
72+
; CHECK-LABEL: define void @caller_noinline2
73+
define void @caller_noinline2() {
74+
entry:
75+
; CHECK: call void @callee_noinline()
76+
call void @callee_noinline()
77+
call void @llvm.evm.return(ptr addrspace(1) null, i256 0)
78+
unreachable
79+
}

0 commit comments

Comments
 (0)