RFR: 8308340: C2: Idealize Fma nodes [v5]
Fei Gao
fgao at openjdk.org
Mon Jul 24 04:12:02 UTC 2023
> Some platforms, like aarch64, ppc, and riscv, support fusing `Math.fma(-a, b, c)` or `Math.fma(a, -b, c)` by generating partially symmetric match rules like:
>
>
> match(Set dst (FmaF src3 (Binary (NegF src1) src2)));
> match(Set dst (FmaF src3 (Binary src1 (NegF src2))));
>
>
> Since `Fma` is partially commutative, the patch is to convert `Math.fma(-a, b, c)` to `Math.fma(b, -a, c)` in gvn phase, making node patterns canonical. Then we can remove redundant rules.
>
> Also, we should guarantee that C2 generates `Fma` nodes only on platforms supporting `Fma` instructions before matcher, so we can remove all `predicate(UseFMA)` for all `Fma` rules.
>
> After the patch, the code size of libjvm.so on aarch64 platform decreased by 63.4k.
>
> The patch passed all tier 1 - 3 on aarch64 and x86 platforms.
Fei Gao has updated the pull request with a new target base due to a merge or a rebase. The pull request now contains six commits:
- Merge branch 'master' into fg8308340
- Merge branch 'master' into fg8308340
- Merge branch 'master' into fg8308340
- Move check for UseFMA from c2compiler.cpp to Matcher::match_rule_supported in .ad files
- Merge branch 'master' into fg8308340
- 8308340: C2: Idealize Fma nodes
Some platforms, like aarch64, ppc, and riscv, support fusing
`Math.fma(-a, b, c)` or `Math.fma(a, -b, c)` by generating
partially symmetric match rules like:
```
match(Set dst (FmaF src3 (Binary (NegF src1) src2)));
match(Set dst (FmaF src3 (Binary src1 (NegF src2))));
```
Since `Fma` is partially communitive, the patch is to convert
`Math.fma(-a, b, c)` to `Math.fma(b, -a, c)` in gvn phase,
making node patterns canonical. Then we can remove redundant
rules.
Also, we should guarantee that C2 generates `Fma` nodes only on
platforms supporting `Fma` instructions before matcher, so we
can remove all `predicate(UseFMA)` for all `Fma` rules.
After the patch, the code size of libjvm.so on aarch64 platform
decreased by 63.4k.
The patch passed all tier 1 - 3 on aarch64 and x86 platforms.
-------------
Changes: https://git.openjdk.org/jdk/pull/14576/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=14576&range=04
Stats: 608 lines in 20 files changed: 389 ins; 118 del; 101 mod
Patch: https://git.openjdk.org/jdk/pull/14576.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/14576/head:pull/14576
PR: https://git.openjdk.org/jdk/pull/14576
More information about the hotspot-compiler-dev
mailing list