[LoongArch] Optimize conditional selection of integer
authorWeining Lu <luweining@loongson.cn>
Tue, 20 Jun 2023 13:50:54 +0000 (21:50 +0800)
committerWeining Lu <luweining@loongson.cn>
Tue, 20 Jun 2023 13:54:40 +0000 (21:54 +0800)
commit3dd319ecf3be64598ea84d1730033854cade7123
tree07975b197136d286e0df31493461b846098da266
parent699addeff03515928b5e655b45199cda172a7893
[LoongArch] Optimize conditional selection of integer

This patch optimizes code generation by leveraging the zeroing behavior of the `maskeqz`/`masknez` instructions.

```
int sel(int a, int b)
{
    return (a < b) ? a : 0;
}
```

```
slt $a1,$a0,$a1
masknez $a2,$r0,$a1
maskeqz $a0,$a0,$a1
or $a0,$a0,$a2
```

=>

```
slt $a1,$a0,$a1
maskeqz $a0,$a0,$a1
```

Reviewed By: SixWeining

Differential Revision: https://reviews.llvm.org/D153193
llvm/lib/Target/LoongArch/LoongArchInstrInfo.td
llvm/test/CodeGen/LoongArch/atomicrmw-uinc-udec-wrap.ll
llvm/test/CodeGen/LoongArch/ir-instruction/select-bare-int.ll