Commit 7d6e72f
[RISCV][GlobalISel] Lower G_ATOMICRMW_SUB via G_ATOMICRMW_ADD (llvm#155972)
RISCV does not provide a native atomic subtract instruction, so this
patch lowers `G_ATOMICRMW_SUB` by negating the RHS value and performing
an atomic add. The legalization rules in `RISCVLegalizerInfo` are
updated accordingly, with libcall fallbacks when `StdExtA` is not
available, and intrinsic legalization is extended to support
`riscv_masked_atomicrmw_sub`.
For example, lowering
`%1 = atomicrmw sub ptr %a, i32 1 seq_cst`
on riscv32a produces:
```
li a1, -1
amoadd.w.aqrl a0, a1, (a0)
```
On riscv64a, where the RHS type is narrower than XLEN, it currently
produces:
```
li a1, 1
neg a1, a1
amoadd.w.aqrl a0, a1, (a0)
```
There is still a constant-folding or InstConbiner gap. For instance,
lowering
```
%b = sub i32 %x, %y
%1 = atomicrmw sub ptr %a, i32 %b seq_cst
```
generates:
```
subw a1, a1, a2
neg a1, a1
amoadd.w.aqrl a0, a1, (a0)
```
This sequence could be optimized further to eliminate the redundant neg.
Addressing this may require improvements in the Combiner or Peephole
Optimizer in future work.
---------
Co-authored-by: Kane Wang <[email protected]>1 parent fee17b3 commit 7d6e72f
File tree
13 files changed
+1766
-695
lines changed- llvm
- lib
- CodeGen/GlobalISel
- Target/RISCV/GISel
- test/CodeGen/RISCV/GlobalISel
- instruction-select
- legalizer
13 files changed
+1766
-695
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4773 | 4773 | | |
4774 | 4774 | | |
4775 | 4775 | | |
| 4776 | + | |
| 4777 | + | |
| 4778 | + | |
| 4779 | + | |
| 4780 | + | |
| 4781 | + | |
| 4782 | + | |
| 4783 | + | |
| 4784 | + | |
| 4785 | + | |
4776 | 4786 | | |
4777 | 4787 | | |
4778 | 4788 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
700 | 700 | | |
701 | 701 | | |
702 | 702 | | |
| 703 | + | |
| 704 | + | |
| 705 | + | |
| 706 | + | |
| 707 | + | |
703 | 708 | | |
704 | 709 | | |
705 | 710 | | |
| |||
738 | 743 | | |
739 | 744 | | |
740 | 745 | | |
| 746 | + | |
741 | 747 | | |
742 | 748 | | |
743 | 749 | | |
| |||
0 commit comments