diff options
author | Mikhail Gudim <mgudim@gmail.com> | 2025-02-22 12:11:33 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-02-22 06:11:33 -0500 |
commit | f5d153ef26a9a206ab6eb4307de24c16b600c0d9 (patch) | |
tree | f9f623f9509364d746a1290cbc4d3c37ab6db0eb /llvm/lib/Transforms/Utils/LoopUtils.cpp | |
parent | 8d5c1e61c60e944c9bd91ab4e8e0dce9799e501a (diff) | |
download | llvm-f5d153ef26a9a206ab6eb4307de24c16b600c0d9.zip llvm-f5d153ef26a9a206ab6eb4307de24c16b600c0d9.tar.gz llvm-f5d153ef26a9a206ab6eb4307de24c16b600c0d9.tar.bz2 |
[VectorCombine] Fold binary op of reductions. (#121567)
Replace binary of of two reductions with one reduction of the binary op
applied to vectors. For example:
```
%v0_red = tail call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %v0)
%v1_red = tail call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %v1)
%res = add i32 %v0_red, %v1_red
```
gets transformed to:
```
%1 = add <16 x i32> %v0, %v1
%res = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %1)
```
Diffstat (limited to 'llvm/lib/Transforms/Utils/LoopUtils.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/LoopUtils.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopUtils.cpp b/llvm/lib/Transforms/Utils/LoopUtils.cpp index 45915c10..0506ea9 100644 --- a/llvm/lib/Transforms/Utils/LoopUtils.cpp +++ b/llvm/lib/Transforms/Utils/LoopUtils.cpp @@ -957,6 +957,7 @@ constexpr Intrinsic::ID llvm::getReductionIntrinsicID(RecurKind RK) { } } +// This is the inverse to getReductionForBinop unsigned llvm::getArithmeticReductionInstruction(Intrinsic::ID RdxID) { switch (RdxID) { case Intrinsic::vector_reduce_fadd: @@ -986,6 +987,25 @@ unsigned llvm::getArithmeticReductionInstruction(Intrinsic::ID RdxID) { } } +// This is the inverse to getArithmeticReductionInstruction +Intrinsic::ID llvm::getReductionForBinop(Instruction::BinaryOps Opc) { + switch (Opc) { + default: + break; + case Instruction::Add: + return Intrinsic::vector_reduce_add; + case Instruction::Mul: + return Intrinsic::vector_reduce_mul; + case Instruction::And: + return Intrinsic::vector_reduce_and; + case Instruction::Or: + return Intrinsic::vector_reduce_or; + case Instruction::Xor: + return Intrinsic::vector_reduce_xor; + } + return Intrinsic::not_intrinsic; +} + Intrinsic::ID llvm::getMinMaxReductionIntrinsicOp(Intrinsic::ID RdxID) { switch (RdxID) { default: |