Skip to content

Conversation

@tomeksowi
Copy link
Member

Add atomic instructions (RV64A) to JIT.
Intrinsify calls to Interlocked.ExchangeAdd|Exchange|And|Or|CompareExchange.

Part of #84834
cc @wscho77 @HJLeee @JongHeonChoi @t-mustafin @alpencolt @gbalykov @clamp03 @sirntar @yurai007

@ghost ghost added community-contribution Indicates that the PR has been added by a community member area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Sep 15, 2023
@ghost
Copy link

ghost commented Sep 15, 2023

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

Add atomic instructions (RV64A) to JIT.
Intrinsify calls to Interlocked.ExchangeAdd|Exchange|And|Or|CompareExchange.

Part of #84834
cc @wscho77 @HJLeee @JongHeonChoi @t-mustafin @alpencolt @gbalykov @clamp03 @sirntar @yurai007

Author: tomeksowi
Assignees: -
Labels:

area-CodeGen-coreclr, community-contribution

Milestone: -

@clamp03 clamp03 added the arch-riscv Related to the RISC-V architecture label Sep 15, 2023
@tomeksowi
Copy link
Member Author

@jakobbotsch @jkotas PR ready for review.

@tomeksowi tomeksowi marked this pull request as ready for review September 15, 2023 11:34
@tomeksowi
Copy link
Member Author

@jakobbotsch @jkotas Could you look at this, please?

@jkotas jkotas requested a review from jakobbotsch September 19, 2023 18:49
@jkotas
Copy link
Member

jkotas commented Sep 19, 2023

cc @dotnet/jit-contrib

Copy link
Member

@clamp03 clamp03 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you share tests to fix?
Please check the style and naming of existing sources? Please~~~

@tomeksowi
Copy link
Member Author

tomeksowi commented Sep 20, 2023

Could you share tests to fix? Please check the style and naming of existing sources? Please~~~

I stumbled on lack of atomics in JIT looking for NYI_RISCV64 assertions. I constructed a testing playlist for it by grepping for Interlocked.* in C# tests:

CoreMangLib/system/threading/interlocked/InterlockedAdd1/InterlockedAdd1.sh
CoreMangLib/system/threading/interlocked/InterlockedAdd2/InterlockedAdd2.sh
CoreMangLib/system/threading/interlocked/InterlockedCompareExchange1/InterlockedCompareExchange1.sh
CoreMangLib/system/threading/interlocked/InterlockedCompareExchange5/InterlockedCompareExchange5.sh
CoreMangLib/system/threading/interlocked/InterlockedCompareExchange6/InterlockedCompareExchange6.sh
CoreMangLib/system/threading/interlocked/InterlockedCompareExchange7/InterlockedCompareExchange7.sh
CoreMangLib/system/threading/interlocked/InterlockedDecrement1/InterlockedDecrement1.sh
CoreMangLib/system/threading/interlocked/InterlockedDecrement2/InterlockedDecrement2.sh
CoreMangLib/system/threading/interlocked/InterlockedExchange1/InterlockedExchange1.sh
CoreMangLib/system/threading/interlocked/InterlockedExchange5/InterlockedExchange5.sh
CoreMangLib/system/threading/interlocked/InterlockedExchange6/InterlockedExchange6.sh
CoreMangLib/system/threading/interlocked/InterlockedExchange7/InterlockedExchange7.sh
CoreMangLib/system/threading/interlocked/InterlockedIncrement1/InterlockedIncrement1.sh
CoreMangLib/system/threading/interlocked/InterlockedIncrement2/InterlockedIncrement2.sh
GC/API/NoGCRegion/Callback/Callback.sh
GC/Stress/Framework/ReliabilityFramework/ReliabilityFramework.sh
Interop/COM/ComWrappers/API/ComWrappersTests/ComWrappersTests.sh
JIT/Directed/intrinsic/interlocked/cmpxchg/cmpxchg.sh
JIT/Directed/intrinsic/interlocked/cse_cmpxchg/cse_cmpxchg.sh
JIT/Directed/intrinsic/interlocked/IntrinsicTest_Overflow/IntrinsicTest_Overflow.sh
JIT/Directed/intrinsic/interlocked/nullchecksuppress/nullchecksuppress.sh
JIT/Directed/intrinsic/interlocked/regalloc1/regalloc1.sh
JIT/Directed/intrinsic/interlocked/regalloc2/regalloc2.sh
JIT/Performance/CodeQuality/BenchmarksGame/fannkuch-redux/fannkuch-redux-9/fannkuch-redux-9.sh
JIT/Performance/CodeQuality/SIMD/RayTracer/RayTracer/RayTracer.sh
JIT/Regression/CLR-x86-JIT/v2.1/b610562/b610562/b610562.sh
JIT/Regression/Dev11/External/dev11_154899/DynamicStaticAlignment/DynamicStaticAlignment.sh
JIT/Regression/JitBlue/GitHub_10714/GitHub_10714/GitHub_10714.sh
JIT/Regression/JitBlue/GitHub_12398/Github_12398/Github_12398.sh
JIT/Regression/JitBlue/GitHub_18887/GitHub_18887/GitHub_18887.sh
JIT/Regression/JitBlue/GitHub_19171/GitHub_19171/GitHub_19171.sh
JIT/Regression/JitBlue/GitHub_19583/GitHub_19583/GitHub_19583.sh
JIT/Stress/ABI/stubs_do/stubs_do.sh
baseservices/exceptions/simple/ParallelCrash/ParallelCrash.sh
baseservices/invalid_operations/InvalidOperations/InvalidOperations.sh
baseservices/threading/generics/syncdelegate/GThread01_syncdelegate/GThread01_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread02_syncdelegate/GThread02_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread03_syncdelegate/GThread03_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread04_syncdelegate/GThread04_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread05_syncdelegate/GThread05_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread06_syncdelegate/GThread06_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread07_syncdelegate/GThread07_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread08_syncdelegate/GThread08_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread09_syncdelegate/GThread09_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread10_syncdelegate/GThread10_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread11_syncdelegate/GThread11_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread12_syncdelegate/GThread12_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread13_syncdelegate/GThread13_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread14_syncdelegate/GThread14_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread15_syncdelegate/GThread15_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread16_syncdelegate/GThread16_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread17_syncdelegate/GThread17_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread18_syncdelegate/GThread18_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread19_syncdelegate/GThread19_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread20_syncdelegate/GThread20_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread21_syncdelegate/GThread21_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread22_syncdelegate/GThread22_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread23_syncdelegate/GThread23_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread24_syncdelegate/GThread24_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread25_syncdelegate/GThread25_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread26_syncdelegate/GThread26_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread27_syncdelegate/GThread27_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread28_syncdelegate/GThread28_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread29_syncdelegate/GThread29_syncdelegate.sh
baseservices/threading/generics/syncdelegate/GThread30_syncdelegate/GThread30_syncdelegate.sh
baseservices/threading/generics/threadstart/GThread01_threadstart/GThread01_threadstart.sh
baseservices/threading/generics/threadstart/GThread02_threadstart/GThread02_threadstart.sh
baseservices/threading/generics/threadstart/GThread03_threadstart/GThread03_threadstart.sh
baseservices/threading/generics/threadstart/GThread04_threadstart/GThread04_threadstart.sh
baseservices/threading/generics/threadstart/GThread05_threadstart/GThread05_threadstart.sh
baseservices/threading/generics/threadstart/GThread06_threadstart/GThread06_threadstart.sh
baseservices/threading/generics/threadstart/GThread07_threadstart/GThread07_threadstart.sh
baseservices/threading/generics/threadstart/GThread08_threadstart/GThread08_threadstart.sh
baseservices/threading/generics/threadstart/GThread09_threadstart/GThread09_threadstart.sh
baseservices/threading/generics/threadstart/GThread10_threadstart/GThread10_threadstart.sh
baseservices/threading/generics/threadstart/GThread11_threadstart/GThread11_threadstart.sh
baseservices/threading/generics/threadstart/GThread12_threadstart/GThread12_threadstart.sh
baseservices/threading/generics/threadstart/GThread13_threadstart/GThread13_threadstart.sh
baseservices/threading/generics/threadstart/GThread14_threadstart/GThread14_threadstart.sh
baseservices/threading/generics/threadstart/GThread15_threadstart/GThread15_threadstart.sh
baseservices/threading/generics/threadstart/GThread16_threadstart/GThread16_threadstart.sh
baseservices/threading/generics/threadstart/GThread17_threadstart/GThread17_threadstart.sh
baseservices/threading/generics/threadstart/GThread18_threadstart/GThread18_threadstart.sh
baseservices/threading/generics/threadstart/GThread19_threadstart/GThread19_threadstart.sh
baseservices/threading/generics/threadstart/GThread20_threadstart/GThread20_threadstart.sh
baseservices/threading/generics/threadstart/GThread21_threadstart/GThread21_threadstart.sh
baseservices/threading/generics/threadstart/GThread22_threadstart/GThread22_threadstart.sh
baseservices/threading/generics/threadstart/GThread23_threadstart/GThread23_threadstart.sh
baseservices/threading/generics/threadstart/GThread24_threadstart/GThread24_threadstart.sh
baseservices/threading/generics/threadstart/GThread25_threadstart/GThread25_threadstart.sh
baseservices/threading/generics/threadstart/GThread26_threadstart/GThread26_threadstart.sh
baseservices/threading/generics/threadstart/GThread27_threadstart/GThread27_threadstart.sh
baseservices/threading/generics/threadstart/GThread28_threadstart/GThread28_threadstart.sh
baseservices/threading/generics/threadstart/GThread29_threadstart/GThread29_threadstart.sh
baseservices/threading/generics/threadstart/GThread30_threadstart/GThread30_threadstart.sh
baseservices/threading/generics/TimerCallback/thread01_TimerCallback/thread01_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread02_TimerCallback/thread02_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread03_TimerCallback/thread03_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread04_TimerCallback/thread04_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread05_TimerCallback/thread05_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread06_TimerCallback/thread06_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread07_TimerCallback/thread07_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread08_TimerCallback/thread08_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread09_TimerCallback/thread09_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread10_TimerCallback/thread10_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread11_TimerCallback/thread11_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread12_TimerCallback/thread12_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread13_TimerCallback/thread13_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread14_TimerCallback/thread14_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread15_TimerCallback/thread15_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread16_TimerCallback/thread16_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread17_TimerCallback/thread17_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread18_TimerCallback/thread18_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread19_TimerCallback/thread19_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread20_TimerCallback/thread20_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread21_TimerCallback/thread21_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread22_TimerCallback/thread22_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread23_TimerCallback/thread23_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread24_TimerCallback/thread24_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread25_TimerCallback/thread25_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread26_TimerCallback/thread26_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread27_TimerCallback/thread27_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread28_TimerCallback/thread28_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread29_TimerCallback/thread29_TimerCallback.sh
baseservices/threading/generics/TimerCallback/thread30_TimerCallback/thread30_TimerCallback.sh
baseservices/threading/generics/TimerCallback/tighttimercallback/tighttimercallback.sh
baseservices/threading/generics/WaitCallback/thread01_WaitCallback/thread01_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread02_WaitCallback/thread02_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread03_WaitCallback/thread03_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread04_WaitCallback/thread04_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread05_WaitCallback/thread05_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread06_WaitCallback/thread06_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread07_WaitCallback/thread07_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread08_WaitCallback/thread08_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread09_WaitCallback/thread09_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread10_WaitCallback/thread10_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread11_WaitCallback/thread11_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread12_WaitCallback/thread12_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread13_WaitCallback/thread13_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread14_WaitCallback/thread14_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread15_WaitCallback/thread15_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread16_WaitCallback/thread16_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread17_WaitCallback/thread17_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread18_WaitCallback/thread18_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread19_WaitCallback/thread19_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread20_WaitCallback/thread20_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread21_WaitCallback/thread21_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread22_WaitCallback/thread22_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread23_WaitCallback/thread23_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread24_WaitCallback/thread24_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread25_WaitCallback/thread25_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread26_WaitCallback/thread26_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread27_WaitCallback/thread27_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread28_WaitCallback/thread28_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread29_WaitCallback/thread29_WaitCallback.sh
baseservices/threading/generics/WaitCallback/thread30_WaitCallback/thread30_WaitCallback.sh
baseservices/threading/regressions/13662/13662-a/13662-a.sh
baseservices/threading/regressions/13662/13662-simple/13662-simple.sh
baseservices/threading/regressions/30032/30032/30032.sh
Loader/classloader/regressions/523654/test532654_b/test532654_b.sh
Regressions/coreclr/1514/InterlockExchange/InterlockExchange.sh
Regressions/coreclr/GitHub_45929/test45929/test45929.sh
tracing/eventlistener/eventlistenerenabledisable/eventlistenerenabledisable.sh
tracing/eventlistener/EventListenerThreadPool/EventListenerThreadPool.sh
tracing/eventpipe/enabledisable/enabledisable/enabledisable.sh

Yes, I'll adjust style as per remarks in comments.

@jakobbotsch
Copy link
Member

I stumbled on lack of atomics in JIT looking for NYI_RISCV64 assertions. I constructed a testing playlist for it by grepping for Interlocked.* in C# tests:

To be clear, this is just an optimization, right? Not recognizing these as intrinsics should usually just result in the managed fallback, so these tests aren't broken on RISC-V.

@tomeksowi
Copy link
Member Author

I stumbled on lack of atomics in JIT looking for NYI_RISCV64 assertions. I constructed a testing playlist for it by grepping for Interlocked.* in C# tests:

To be clear, this is just an optimization, right? Not recognizing these as intrinsics should usually just result in the managed fallback, so these tests aren't broken on RISC-V.

Exactly.

Copy link
Member

@clamp03 clamp03 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you so much.
I know my initial codes are not good enough. I am so sorry for that. But that is the reason why we need you. Thank you for all your hard work.

@JulieLeeMSFT
Copy link
Member

Please check CI build failures before merging.

@jakobbotsch
Copy link
Member

SPMI failures are the out-of-space ones we have been hitting recently.

@jakobbotsch jakobbotsch merged commit 84a8f67 into dotnet:main Sep 21, 2023
@ghost ghost locked as resolved and limited conversation to collaborators Oct 21, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-riscv Related to the RISC-V architecture area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI community-contribution Indicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants