[clang] [CIR] Upstream unary not for ComplexType (PR #148857)
Henrich Lauko via cfe-commits
cfe-commits at lists.llvm.org
Tue Jul 15 07:59:24 PDT 2025
================
@@ -22,15 +24,68 @@ struct LoweringPreparePass : public LoweringPrepareBase<LoweringPreparePass> {
void runOnOperation() override;
void runOnOp(Operation *op);
+ void lowerUnaryOp(UnaryOp op);
};
} // namespace
-void LoweringPreparePass::runOnOp(Operation *op) {}
+void LoweringPreparePass::lowerUnaryOp(UnaryOp op) {
+ mlir::Type ty = op.getType();
+ if (!mlir::isa<cir::ComplexType>(ty))
+ return;
+
+ mlir::Location loc = op.getLoc();
+ cir::UnaryOpKind opKind = op.getKind();
+
+ CIRBaseBuilderTy builder(getContext());
+ builder.setInsertionPointAfter(op);
+
+ mlir::Value operand = op.getInput();
+ mlir::Value operandReal = builder.createComplexReal(loc, operand);
+ mlir::Value operandImag = builder.createComplexImag(loc, operand);
+
+ mlir::Value resultReal;
+ mlir::Value resultImag;
+
+ switch (opKind) {
+ case cir::UnaryOpKind::Inc:
+ case cir::UnaryOpKind::Dec:
+ llvm_unreachable("Complex unary Inc/Dec NYI");
+ break;
+
+ case cir::UnaryOpKind::Plus:
+ case cir::UnaryOpKind::Minus:
+ llvm_unreachable("Complex unary Plus/Minus NYI");
+ break;
+
+ case cir::UnaryOpKind::Not:
+ resultReal = operandReal;
+ resultImag =
+ builder.createUnaryOp(loc, cir::UnaryOpKind::Minus, operandImag);
+ break;
+ }
+
+ auto result = builder.createComplexCreate(loc, resultReal, resultImag);
+ op.replaceAllUsesWith(result);
+ op.erase();
+}
+
+void LoweringPreparePass::runOnOp(Operation *op) {
+ if (auto unary = dyn_cast<UnaryOp>(op)) {
+ lowerUnaryOp(unary);
+ }
+}
void LoweringPreparePass::runOnOperation() {
+ mlir::Operation *op = getOperation();
+
llvm::SmallVector<Operation *> opsToTransform;
+ op->walk([&](Operation *op) {
+ if (isa<UnaryOp>(op))
----------------
xlauko wrote:
```suggestion
if (mlir::isa<cir::UnaryOp>(op))
```
https://github.com/llvm/llvm-project/pull/148857
More information about the cfe-commits
mailing list