[llvm] [RISCV] Remove `AND` mask generated by `( zext ( atomic_load ) )` by replacing the load with `zextload` for orderings not stronger then monotonic. (PR #136502)

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 23 09:51:57 PDT 2025


Jan =?utf-8?q?Górski?= <jan.a.gorski at wp.pl>
Message-ID:
In-Reply-To: <llvm.org/llvm/llvm-project/pull/136502 at github.com>


topperc wrote:

> For _testing purposes only_ I reverted the changes from this patch and made such change:
> 
> ```
> diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
> index 53244a990a86..bb247574a5f2 100644
> --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
> +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
> @@ -386,6 +386,7 @@ SDValue DAGTypeLegalizer::PromoteIntRes_Atomic0(AtomicSDNode *N) {
>      switch (TLI.getExtendForAtomicOps()) {
>      case ISD::SIGN_EXTEND:
>        ExtType = ISD::SEXTLOAD;
> +      ExtType = ISD::ZEXTLOAD;
>        break;
>      case ISD::ZERO_EXTEND:
>        ExtType = ISD::ZEXTLOAD;
> ```
> 
> just to check what is generated for a following snippet (the code from original [issue](https://github.com/llvm/llvm-project/issues/131476)):
> 
> ```c
> #include <stdbool.h>
> extern bool t1;
> bool test1(void) {
>     return __atomic_load_n(&t1, __ATOMIC_RELAXED);
> }
> ```
> 
> I run:
> 
> ```shell
> ./bin/clang --target=riscv64 -O1 -S -emit-llvm atomic-ops-load.c -o test.ll
> ./bin/llc -filetype=asm test.ll -o test.s -O1 -mtriple=riscv64 --print-after-isel -debug 2> result.txt
> ```
> 
> I got following instructions:
> 
> ```
> test1:                                  # @test1
> # %bb.0:                                # %entry
>         lui     a0, %hi(t1)
>         lb      a0, %lo(t1)(a0)
>         ret
> .Lfunc_end0:
> ```
> 
> with debug file info that I attached to this comment: [result.txt](https://github.com/user-attachments/files/19862687/result.txt). I think the main thing from it is the following info:
> 
> ```
> ISEL: Starting selection on root node: t9: i64,ch = AtomicLoad<(dereferenceable load monotonic (s8) from @t1), zext from i8> t0, t15
> ISEL: Starting pattern match
>   Initial Opcode index to 1152977
>   TypeSwitch[i64] from 1152986 to 1152989
>   Morphed node: t9: i64,ch = LB<Mem:(dereferenceable load monotonic (s8) from @t1)> t14, TargetGlobalAddress:i64<ptr @t1> 0 [TF=3], t0
> ISEL: Match complete!
> ```
> 
> It seems to me that changing extention type of ISD::ATOMIC_LOAD is not enough. Does this imply that there should be a match for `(zext(atomic_load))` in tablegen that would catch this pattern?

I just posted https://github.com/llvm/llvm-project/pull/137019 to check the extension type in isel patterns. Once that's in we can add new predicates for zextload.

https://github.com/llvm/llvm-project/pull/136502


More information about the llvm-commits mailing list