================ @@ -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) { ---------------- xlauko wrote:
```suggestion void LoweringPreparePass::runOnOp(mlir::Operation *op) { ``` https://github.com/llvm/llvm-project/pull/148857 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits