Skip to content

Commit d66a7b3

Browse files
vladimirradosavljevicakiramenai
authored andcommitted
[EVM] Set that staticcall can't change storage
From the description, staticcall can't change storage, so update the code to ensure no storage modifications occur during staticcall. Signed-off-by: Vladimir Radosavljevic <[email protected]>
1 parent 1e506a0 commit d66a7b3

File tree

3 files changed

+20
-23
lines changed

3 files changed

+20
-23
lines changed

llvm/lib/Target/EVM/EVMAliasAnalysis.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ ModRefInfo EVMAAResult::getModRefInfo(const CallBase *Call,
109109
unsigned AS = Loc.Ptr->getType()->getPointerAddressSpace();
110110
switch (II->getIntrinsicID()) {
111111
case Intrinsic::evm_return:
112+
case Intrinsic::evm_staticcall:
112113
if (AS == EVMAS::AS_STORAGE || AS == EVMAS::AS_TSTORAGE)
113114
return ModRefInfo::Ref;
114115
break;
@@ -117,7 +118,6 @@ ModRefInfo EVMAAResult::getModRefInfo(const CallBase *Call,
117118
case Intrinsic::evm_call:
118119
case Intrinsic::evm_callcode:
119120
case Intrinsic::evm_delegatecall:
120-
case Intrinsic::evm_staticcall:
121121
if (AS == EVMAS::AS_STORAGE || AS == EVMAS::AS_TSTORAGE)
122122
return ModRefInfo::ModRef;
123123
break;

llvm/test/CodeGen/EVM/aa-eval.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -343,8 +343,8 @@ define i256 @test_as1_alias_call(ptr addrspace(1) %ptr1) {
343343
}
344344

345345
; CHECK-LABEL: Function: test_as6_as5_alias_staticcall
346-
; CHECK: Both ModRef: Ptr: i256* %ptr1 <-> %ret = call i256 @llvm.evm.staticcall
347-
; CHECK: Both ModRef: Ptr: i256* %ptr2 <-> %ret = call i256 @llvm.evm.staticcall
346+
; CHECK: Just Ref: Ptr: i256* %ptr1 <-> %ret = call i256 @llvm.evm.staticcall
347+
; CHECK: Just Ref: Ptr: i256* %ptr2 <-> %ret = call i256 @llvm.evm.staticcall
348348
define i256 @test_as6_as5_alias_staticcall(ptr addrspace(5) %ptr1) {
349349
store i256 1, ptr addrspace(5) %ptr1, align 32
350350
%ptr2 = inttoptr i256 32 to ptr addrspace(6)

llvm/test/CodeGen/EVM/aa-memory-opt.ll

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,23 @@ define i256 @test_as6_large() {
285285
ret i256 %ret
286286
}
287287

288+
define i256 @test_opt_staticcall(ptr addrspace(5) %ptr1, ptr addrspace(6) %ptr2) {
289+
; CHECK-LABEL: define noundef i256 @test_opt_staticcall
290+
; CHECK-SAME: (ptr addrspace(5) nocapture writeonly [[PTR1:%.*]], ptr addrspace(6) nocapture writeonly [[PTR2:%.*]]) local_unnamed_addr #[[ATTR3]] {
291+
; CHECK-NEXT: store i256 1, ptr addrspace(5) [[PTR1]], align 32
292+
; CHECK-NEXT: store i256 2, ptr addrspace(6) [[PTR2]], align 32
293+
; CHECK-NEXT: [[TMP1:%.*]] = tail call i256 @llvm.evm.staticcall(i256 1, i256 1, ptr addrspace(1) null, i256 1, ptr addrspace(1) null, i256 1)
294+
; CHECK-NEXT: ret i256 3
295+
;
296+
store i256 1, ptr addrspace(5) %ptr1, align 32
297+
store i256 2, ptr addrspace(6) %ptr2, align 32
298+
call i256 @llvm.evm.staticcall(i256 1, i256 1, ptr addrspace(1) null, i256 1, ptr addrspace(1) null, i256 1)
299+
%ret1 = load i256, ptr addrspace(5) %ptr1
300+
%ret2 = load i256, ptr addrspace(6) %ptr2
301+
%ret = add i256 %ret1, %ret2
302+
ret i256 %ret
303+
}
304+
288305
; Verify that in the following tests all load operations are preserved.
289306

290307
define i256 @test_noopt_create(ptr addrspace(5) %ptr1, ptr addrspace(6) %ptr2) {
@@ -347,26 +364,6 @@ define i256 @test_noopt_call(ptr addrspace(5) %ptr1, ptr addrspace(6) %ptr2) {
347364
ret i256 %ret
348365
}
349366

350-
define i256 @test_noopt_staticcall(ptr addrspace(5) %ptr1, ptr addrspace(6) %ptr2) {
351-
; CHECK-LABEL: define i256 @test_noopt_staticcall
352-
; CHECK-SAME: (ptr addrspace(5) nocapture [[PTR1:%.*]], ptr addrspace(6) nocapture [[PTR2:%.*]]) local_unnamed_addr #[[ATTR3]] {
353-
; CHECK-NEXT: store i256 1, ptr addrspace(5) [[PTR1]], align 32
354-
; CHECK-NEXT: store i256 2, ptr addrspace(6) [[PTR2]], align 32
355-
; CHECK-NEXT: [[TMP1:%.*]] = tail call i256 @llvm.evm.staticcall(i256 1, i256 1, ptr addrspace(1) null, i256 1, ptr addrspace(1) null, i256 1)
356-
; CHECK-NEXT: [[RET1:%.*]] = load i256, ptr addrspace(5) [[PTR1]], align 32
357-
; CHECK-NEXT: [[RET2:%.*]] = load i256, ptr addrspace(6) [[PTR2]], align 32
358-
; CHECK-NEXT: [[RET:%.*]] = add i256 [[RET2]], [[RET1]]
359-
; CHECK-NEXT: ret i256 [[RET]]
360-
;
361-
store i256 1, ptr addrspace(5) %ptr1, align 32
362-
store i256 2, ptr addrspace(6) %ptr2, align 32
363-
call i256 @llvm.evm.staticcall(i256 1, i256 1, ptr addrspace(1) null, i256 1, ptr addrspace(1) null, i256 1)
364-
%ret1 = load i256, ptr addrspace(5) %ptr1
365-
%ret2 = load i256, ptr addrspace(6) %ptr2
366-
%ret = add i256 %ret1, %ret2
367-
ret i256 %ret
368-
}
369-
370367
define i256 @test_noopt_callcode(ptr addrspace(5) %ptr1, ptr addrspace(6) %ptr2) {
371368
; CHECK-LABEL: define i256 @test_noopt_callcode
372369
; CHECK-SAME: (ptr addrspace(5) nocapture [[PTR1:%.*]], ptr addrspace(6) nocapture [[PTR2:%.*]]) local_unnamed_addr #[[ATTR3]] {

0 commit comments

Comments
 (0)