[AArch64][SVEIntrinsicOpts] Fix: predicated SVE mul/fmul are not commutative
authorIgor Kirillov <Igor.Kirillov@arm.com>
Wed, 24 Nov 2021 17:23:24 +0000 (17:23 +0000)
committerIgor Kirillov <Igor.Kirillov@arm.com>
Fri, 26 Nov 2021 12:41:27 +0000 (12:41 +0000)
commit08d45e6f4da03836dc2380b7bae650ae80cfae35
treebd493094940aef93ece3dc5fdf4f783498215481
parenta3b099b68c0c156aa8ed9ec81c5dfdf150c6329c
[AArch64][SVEIntrinsicOpts] Fix: predicated SVE mul/fmul are not commutative

We can not swap multiplicand and multiplier because the sve intrinsics
are predicated. Imagine lanes in vectors having the following values:
         pg = 0
         multiplicand = 1 (from dup)
         multiplier = 2
The resulting value should be 1, but if we swap multiplicand and multiplier it will become 2,
which is incorrect.

Differential Revision: https://reviews.llvm.org/D114577
llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-fmul-idempotency.ll
llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-mul-idempotency.ll