[clang] b73ae4e - [CIR] Extract base classes for complex ops (#185262)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Mar 8 03:44:58 PDT 2026
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;
}
//===----------------------------------------------------------------------===//
More information about the cfe-commits
mailing list