[llvm] [RISCV] Add isel special case for (and (shl X, c2), c1) -> (slli_uw (srli x, c4-c2), c4). (PR #91638)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Thu May 9 12:15:16 PDT 2024


dtcxzyw wrote:

> > Emm, #91626 seems to perform better than this patch. BTW this patch converts some `slli` insts into `slli.uw`, which makes them less compressible.
> 
> Can you get reproducers?

godbolt: https://godbolt.org/z/sMv9fzWbY
```
; llc -mtriple=riscv64 -mattr=+c,+m,+zba -o -
define i64 @func0000000000000000(i64 %0) #0 {
entry:
  %1 = mul i64 %0, 100
  %2 = udiv i64 %1, 70
  %3 = shl i64 %2, 32
  ret i64 %3
}
```

Before:
```
func0000000000000000:                   # @func0000000000000000
        lui     a1, %hi(.LCPI0_0)
        ld      a1, %lo(.LCPI0_0)(a1)
        li      a2, 100
        mul     a0, a0, a2
        mulhu   a0, a0, a1
        srli    a0, a0, 6
        slli    a0, a0, 32
        ret
```

After:
```
func0000000000000000:                   # @func0000000000000000
	lui	a1, %hi(.LCPI1_0)
	ld	a1, %lo(.LCPI1_0)(a1)
	li	a2, 100
 	mul	a0, a0, a2
 	mulhu	a0, a0, a1
 	srli	a0, a0, 6
 	slli.uw	a0, a0, 32 *!!!*
 	ret
```

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


More information about the llvm-commits mailing list