llvm-project/llvm/include/llvm/CodeGen/ComplexDeinterleavingPass.h
Nicholas Guy b3eede5e1f
Add support for single reductions in ComplexDeinterleavingPass (#112875)
The Complex Deinterleaving pass assumes that all values emitted will
result in complex numbers, this patch aims to remove that assumption and
adds support for emitting just the real or imaginary components, not
both.
2024-12-18 10:34:26 +00:00

60 lines
1.5 KiB
C++

//===- ComplexDeinterleavingPass.h - Complex Deinterleaving Pass *- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This pass implements generation of target-specific intrinsics to support
// handling of complex number arithmetic and deinterleaving.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CODEGEN_COMPLEXDEINTERLEAVING_H
#define LLVM_CODEGEN_COMPLEXDEINTERLEAVING_H
#include "llvm/IR/PassManager.h"
namespace llvm {
class Function;
class TargetMachine;
struct ComplexDeinterleavingPass
: public PassInfoMixin<ComplexDeinterleavingPass> {
private:
TargetMachine *TM;
public:
ComplexDeinterleavingPass(TargetMachine *TM) : TM(TM) {}
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
};
enum class ComplexDeinterleavingOperation {
CAdd,
CMulPartial,
CDot,
// The following 'operations' are used to represent internal states. Backends
// are not expected to try and support these in any capacity.
Deinterleave,
Splat,
Symmetric,
ReductionPHI,
ReductionOperation,
ReductionSelect,
ReductionSingle
};
enum class ComplexDeinterleavingRotation {
Rotation_0 = 0,
Rotation_90 = 1,
Rotation_180 = 2,
Rotation_270 = 3,
};
} // namespace llvm
#endif // LLVM_CODEGEN_COMPLEXDEINTERLEAVING_H