From 5342d392aa7c0b389d8c3590d351b2c754cc4587 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Sat, 18 May 2019 14:53:50 +0200 Subject: [PATCH] interp: improve scan for loads During a scan, consider loads from dirty globals to be dirty and check whether they have any local side effects. This fixes a problem with the new volatile operations that are now in methods on registers instead of being emitted inline as volatile instructions. --- interp/scan.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/interp/scan.go b/interp/scan.go index 96e61526..1d5476ab 100644 --- a/interp/scan.go +++ b/interp/scan.go @@ -109,7 +109,16 @@ func (e *Eval) hasSideEffects(fn llvm.Value) *sideEffectResult { default: panic("unreachable") } - case llvm.Load, llvm.Store: + case llvm.Load: + if inst.IsVolatile() { + result.updateSeverity(sideEffectLimited) + } + if _, ok := e.dirtyGlobals[inst.Operand(0)]; ok { + if e.hasLocalSideEffects(dirtyLocals, inst) { + result.updateSeverity(sideEffectLimited) + } + } + case llvm.Store: if inst.IsVolatile() { result.updateSeverity(sideEffectLimited) }