mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-07-26 06:38:42 +00:00
3a0d72457b
The optimization to skip cloning the destination object on partial stores when the buffer is already owned by the current memory view mutated obj.buffer.buf in place. The previous v.buf clone only handled the case where the store value itself aliased that buffer; it did not cover the more common case where an earlier partial load had returned a slice into the same buffer. The in-place store would then corrupt the previously loaded value, breaking code such as cloudflare/bn256 where the gfP arithmetic loads, computes, and stores within the same global during package initialization. Fix this in load instead: when the source object is owned by the current memory view, copy the loaded slice so the returned value is independent of the live buffer. The v.buf clone in store is no longer needed and is removed. Updates the regression test added in the previous commit to reflect the corrected behavior.
14 lines
470 B
LLVM
14 lines
470 B
LLVM
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64--linux"
|
|
|
|
@overlap.buf = local_unnamed_addr global [4 x i8] c"\01\01\02\09"
|
|
@alias.src = local_unnamed_addr global [4 x i8] c"\05\06\07\08"
|
|
@alias.dst = local_unnamed_addr global [2 x i8] c"\09\07"
|
|
@reload.buf = local_unnamed_addr global [4 x i8] c"c\02\03\09"
|
|
@reload.out = local_unnamed_addr global [2 x i8] c"\01\02"
|
|
|
|
define void @runtime.initAll() unnamed_addr {
|
|
entry:
|
|
ret void
|
|
}
|