Comments (5)
The LLVM IR is:
store atomic i32 0, i32* %lk release, align 4
ret i32 undef
from nyuzitoolchain.
Because the action for ISD::ATOMIC_STORE is expand, it gets turned into an AtomicSwap:
Legalizing: t4: ch = AtomicStore<Volatile ST4[%lk]> t0, t2, Constant:i32<0>
Trying to expand node
Succesfully expanded node
... replacing: t4: ch = AtomicStore<Volatile ST4[%lk]> t0, t2, Constant:i32<0>
with: t9: i32,ch = AtomicSwap<Volatile ST4[%lk]> t0, t2, Constant:i32<0>
This has a custom emitter, which calls the common EmitAtomicBinary.
case Nyuzi::ATOMIC_SWAP:
return EmitAtomicBinary(MI, BB, 0);
When the third parameter is zero, this doesn't emit the swap, but erroneously just copies the old value:
if (Opcode != 0) {
....
} else
NewValue = OldValue; // This is just swap: use old value
from nyuzitoolchain.
Can reproduce issue by fixing test:
--- a/test/CodeGen/Nyuzi/atomics.ll
+++ b/test/CodeGen/Nyuzi/atomics.ll
@@ -127,8 +127,9 @@ define i32 @atomic_xchg(i32* %ptr, i32 %value) { ; CHECK-LABEL: atomic_xchg:
; CHECK: load_sync [[OLDVAL:s[0-9]+]], (s0)
; CHECK: move s{{[0-9]+}}, [[OLDVAL]]
- ; CHECK: store_sync [[OLDVAL]], (s0)
- ; CHECK: bz [[OLDVAL]],
+ ; CHECK: move [[NEWVAL:s[0-9]+]], s1
+ ; CHECK: store_sync [[NEWVAL]], (s0)
+ ; CHECK: bz [[NEWVAL]],
ret i32 %tmp
}
from nyuzitoolchain.
Also, using load/store sync is overkill for this. An store/membar would do the job more efficiently.
from nyuzitoolchain.
I didn't do the work to make this just be a store. I'll file another bug for that.
from nyuzitoolchain.
Related Issues (20)
- Optimize __sync_lock_release
- Optimizations disabled for compiler-rt
- Loop vectorizer bloats code in some cases HOT 2
- calloc() can return memory that is not zeroed HOT 2
- Support full hex file format in elf2hex HOT 2
- An error occurs when running ninja build on centos7 HOT 26
- Automated builds
- Ninja crash while building
- cmake build error HOT 1
- Does not build with latest cmake HOT 1
- Support for Address Sanitizer
- Fix asm constraint checking for Nyuzi
- Assert with missing operand
- Assembler assert with exponent format floating point HOT 1
- Run gcc torture test against toolchain implementation
- Add sigils for assembly?
- Switch to global instruction selection
- Use function to expand integer rem/dev in-line instead of calling rtlib function
- llvm-lit broken
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from nyuzitoolchain.