Author: Henrich Lauko Date: 2026-03-08T11:44:54+01:00 New Revision: b73ae4eea84d44731c1b1e9d4e7b7462b515aee3
URL: https://github.com/llvm/llvm-project/commit/b73ae4eea84d44731c1b1e9d4e7b7462b515aee3 DIFF: https://github.com/llvm/llvm-project/commit/b73ae4eea84d44731c1b1e9d4e7b7462b515aee3.diff LOG: [CIR] Extract base classes for complex ops (#185262) Extract CIR_ComplexPartOp for ComplexRealOp/ComplexImagOp, CIR_ComplexPartPtrOp for ComplexRealPtrOp/ComplexImagPtrOp, CIR_ComplexBinOp for ComplexAddOp/ComplexSubOp, and CIR_ComplexRangeBinOp for ComplexMulOp/ComplexDivOp to eliminate duplicated arguments, results, format, and traits. Added: Modified: clang/include/clang/CIR/Dialect/IR/CIROps.td Removed: ################################################################################ diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td index 79eef71229192..7f52be17d30f8 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIROps.td +++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td @@ -4964,24 +4964,10 @@ def CIR_ComplexCreateOp : CIR_Op<"complex.create", [Pure, SameTypeOperands]> { } //===----------------------------------------------------------------------===// -// ComplexRealOp +// ComplexRealOp and ComplexImagOp //===----------------------------------------------------------------------===// -def CIR_ComplexRealOp : CIR_Op<"complex.real", [Pure]> { - let summary = "Extract the real part of a complex value"; - let description = [{ - `cir.complex.real` operation takes an operand of `!cir.complex`, `cir.int`, - `!cir.bool` or `!cir.float`. If the operand is `!cir.complex`, the real - part of it will be returned, otherwise the value returned unmodified. - - Example: - - ```mlir - %real = cir.complex.real %complex : !cir.complex<!cir.float> -> !cir.float - %real = cir.complex.real %scalar : !cir.float -> !cir.float - ``` - }]; - +class CIR_ComplexPartOp<string mnemonic> : CIR_Op<mnemonic, [Pure]> { let results = (outs CIR_AnyIntOrBoolOrFloatType:$result); let arguments = (ins CIR_AnyComplexOrIntOrBoolOrFloatType:$operand); @@ -4994,16 +4980,28 @@ def CIR_ComplexRealOp : CIR_Op<"complex.real", [Pure]> { let hasFolder = 1; } -//===----------------------------------------------------------------------===// -// ComplexImagOp -//===----------------------------------------------------------------------===// +def CIR_ComplexRealOp : CIR_ComplexPartOp<"complex.real"> { + let summary = "Extract the real part of a complex value"; + let description = [{ + `cir.complex.real` operation takes an operand of `!cir.complex`, `cir.int`, + `!cir.bool` or `!cir.float`. If the operand is `!cir.complex`, the real + part of it will be returned, otherwise the value returned unmodified. + + Example: -def CIR_ComplexImagOp : CIR_Op<"complex.imag", [Pure]> { + ```mlir + %real = cir.complex.real %complex : !cir.complex<!cir.float> -> !cir.float + %real = cir.complex.real %scalar : !cir.float -> !cir.float + ``` + }]; +} + +def CIR_ComplexImagOp : CIR_ComplexPartOp<"complex.imag"> { let summary = "Extract the imaginary part of a complex value"; let description = [{ `cir.complex.imag` operation takes an operand of `!cir.complex`, `!cir.int` - `!cir.bool` or `!cir.float`. If the operand is `!cir.complex`, the imag - part of it will be returned, otherwise a zero value will be returned. + `!cir.bool` or `!cir.float`. If the operand is `!cir.complex`, the imag + part of it will be returned, otherwise a zero value will be returned. Example: @@ -5012,24 +5010,25 @@ def CIR_ComplexImagOp : CIR_Op<"complex.imag", [Pure]> { %imag = cir.complex.imag %scalar : !cir.float -> !cir.float ``` }]; +} - let results = (outs CIR_AnyIntOrBoolOrFloatType:$result); - let arguments = (ins CIR_AnyComplexOrIntOrBoolOrFloatType:$operand); +//===----------------------------------------------------------------------===// +// ComplexRealPtrOp and ComplexImagPtrOp +//===----------------------------------------------------------------------===// + +class CIR_ComplexPartPtrOp<string mnemonic> : CIR_Op<mnemonic, [Pure]> { + let arguments = (ins CIR_PtrToComplexType:$operand); + let results = (outs CIR_PtrToIntOrFloatType:$result); let assemblyFormat = [{ - $operand `:` qualified(type($operand)) `->` qualified(type($result)) - attr-dict + $operand `:` + qualified(type($operand)) `->` qualified(type($result)) attr-dict }]; let hasVerifier = 1; - let hasFolder = 1; } -//===----------------------------------------------------------------------===// -// ComplexRealPtrOp -//===----------------------------------------------------------------------===// - -def CIR_ComplexRealPtrOp : CIR_Op<"complex.real_ptr", [Pure]> { +def CIR_ComplexRealPtrOp : CIR_ComplexPartPtrOp<"complex.real_ptr"> { let summary = "Derive a pointer to the real part of a complex value"; let description = [{ `cir.complex.real_ptr` operation takes a pointer operand that points to a @@ -5043,23 +5042,9 @@ def CIR_ComplexRealPtrOp : CIR_Op<"complex.real_ptr", [Pure]> { -> !cir.ptr<!cir.double> ``` }]; - - let results = (outs CIR_PtrToIntOrFloatType:$result); - let arguments = (ins CIR_PtrToComplexType:$operand); - - let assemblyFormat = [{ - $operand `:` - qualified(type($operand)) `->` qualified(type($result)) attr-dict - }]; - - let hasVerifier = 1; } -//===----------------------------------------------------------------------===// -// ComplexImagPtrOp -//===----------------------------------------------------------------------===// - -def CIR_ComplexImagPtrOp : CIR_Op<"complex.imag_ptr", [Pure]> { +def CIR_ComplexImagPtrOp : CIR_ComplexPartPtrOp<"complex.imag_ptr"> { let summary = "Derive a pointer to the imaginary part of a complex value"; let description = [{ `cir.complex.imag_ptr` operation takes a pointer operand that points to a @@ -5073,25 +5058,23 @@ def CIR_ComplexImagPtrOp : CIR_Op<"complex.imag_ptr", [Pure]> { -> !cir.ptr<!cir.double> ``` }]; +} - let arguments = (ins CIR_PtrToComplexType:$operand); - let results = (outs CIR_PtrToIntOrFloatType:$result); +//===----------------------------------------------------------------------===// +// ComplexAddOp and ComplexSubOp +//===----------------------------------------------------------------------===// + +class CIR_ComplexBinOp<string mnemonic> + : CIR_Op<mnemonic, [Pure, SameOperandsAndResultType]> { + let arguments = (ins CIR_ComplexType:$lhs, CIR_ComplexType:$rhs); + let results = (outs CIR_ComplexType:$result); let assemblyFormat = [{ - $operand `:` - qualified(type($operand)) `->` qualified(type($result)) attr-dict + $lhs `,` $rhs `:` qualified(type($result)) attr-dict }]; - - let hasVerifier = 1; } -//===----------------------------------------------------------------------===// -// ComplexAddOp -//===----------------------------------------------------------------------===// - -def CIR_ComplexAddOp : CIR_Op<"complex.add", [ - Pure, SameOperandsAndResultType -]> { +def CIR_ComplexAddOp : CIR_ComplexBinOp<"complex.add"> { let summary = "Complex addition"; let description = [{ The `cir.complex.add` operation takes two complex numbers and returns @@ -5103,23 +5086,9 @@ def CIR_ComplexAddOp : CIR_Op<"complex.add", [ %2 = cir.complex.add %0, %1 : !cir.complex<!cir.float> ``` }]; - - let arguments = (ins CIR_ComplexType:$lhs, CIR_ComplexType:$rhs); - - let results = (outs CIR_ComplexType:$result); - - let assemblyFormat = [{ - $lhs `,` $rhs `:` qualified(type($result)) attr-dict - }]; } -//===----------------------------------------------------------------------===// -// ComplexSubOp -//===----------------------------------------------------------------------===// - -def CIR_ComplexSubOp : CIR_Op<"complex.sub", [ - Pure, SameOperandsAndResultType -]> { +def CIR_ComplexSubOp : CIR_ComplexBinOp<"complex.sub"> { let summary = "Complex subtraction"; let description = [{ The `cir.complex.sub` operation takes two complex numbers and returns @@ -5131,18 +5100,10 @@ def CIR_ComplexSubOp : CIR_Op<"complex.sub", [ %2 = cir.complex.sub %0, %1 : !cir.complex<!cir.float> ``` }]; - - let arguments = (ins CIR_ComplexType:$lhs, CIR_ComplexType:$rhs); - - let results = (outs CIR_ComplexType:$result); - - let assemblyFormat = [{ - $lhs `,` $rhs `:` qualified(type($result)) attr-dict - }]; } //===----------------------------------------------------------------------===// -// ComplexMulOp & ComplexDivOp +// ComplexMulOp and ComplexDivOp //===----------------------------------------------------------------------===// def CIR_ComplexRangeKind : CIR_I32EnumAttr< @@ -5153,9 +5114,24 @@ def CIR_ComplexRangeKind : CIR_I32EnumAttr< I32EnumAttrCase<"Basic", 3, "basic">, ]>; -def CIR_ComplexMulOp : CIR_Op<"complex.mul", [ - Pure, SameOperandsAndResultType -]> { +class CIR_ComplexRangeBinOp<string mnemonic> + : CIR_Op<mnemonic, [Pure, SameOperandsAndResultType]> { + let arguments = (ins + CIR_ComplexType:$lhs, + CIR_ComplexType:$rhs, + CIR_ComplexRangeKind:$range + ); + + let results = (outs CIR_ComplexType:$result); + + let assemblyFormat = [{ + $lhs `,` $rhs `range` `(` $range `)` `:` qualified(type($result)) attr-dict + }]; + + let hasLLVMLowering = false; +} + +def CIR_ComplexMulOp : CIR_ComplexRangeBinOp<"complex.mul"> { let summary = "Complex multiplication"; let description = [{ The `cir.complex.mul` operation takes two complex numbers and returns @@ -5176,25 +5152,9 @@ def CIR_ComplexMulOp : CIR_Op<"complex.mul", [ %2 = cir.complex.mul %0, %1 range(full) : !cir.complex<!cir.float> ``` }]; - - let arguments = (ins - CIR_ComplexType:$lhs, - CIR_ComplexType:$rhs, - CIR_ComplexRangeKind:$range - ); - - let results = (outs CIR_ComplexType:$result); - - let assemblyFormat = [{ - $lhs `,` $rhs `range` `(` $range `)` `:` qualified(type($result)) attr-dict - }]; - - let hasLLVMLowering = false; } -def CIR_ComplexDivOp : CIR_Op<"complex.div", [ - Pure, SameOperandsAndResultType -]> { +def CIR_ComplexDivOp : CIR_ComplexRangeBinOp<"complex.div"> { let summary = "Complex division"; let description = [{ The `cir.complex.div` operation takes two complex numbers and returns @@ -5220,20 +5180,6 @@ def CIR_ComplexDivOp : CIR_Op<"complex.div", [ %2 = cir.complex.div %0, %1 range(full) : !cir.complex<!cir.float> ``` }]; - - let arguments = (ins - CIR_ComplexType:$lhs, - CIR_ComplexType:$rhs, - CIR_ComplexRangeKind:$range - ); - - let results = (outs CIR_ComplexType:$result); - - let assemblyFormat = [{ - $lhs `,` $rhs `range` `(` $range `)` `:` qualified(type($result)) attr-dict - }]; - - let hasLLVMLowering = false; } //===----------------------------------------------------------------------===// _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
