Author: Amr Hesham
Date: 2025-07-11T19:18:08+02:00
New Revision: df10df8b0caec9e649dd8c4415610038b7926060

URL: 
https://github.com/llvm/llvm-project/commit/df10df8b0caec9e649dd8c4415610038b7926060
DIFF: 
https://github.com/llvm/llvm-project/commit/df10df8b0caec9e649dd8c4415610038b7926060.diff

LOG: [CIR] Fold ComplexImagOp from ComplexCreateOp (#148010)

Folding ComplexImagOp if the operand is ComplexCreateOp, inspired by
MLIR Complex dialect

https://github.com/llvm/llvm-project/issues/141365

Added: 
    

Modified: 
    clang/lib/CIR/Dialect/IR/CIRDialect.cpp
    clang/test/CIR/Transforms/complex-imag-fold.cir

Removed: 
    


################################################################################
diff  --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp 
b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
index 8512b229c2663..9069c9b37a424 100644
--- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
+++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
@@ -2084,6 +2084,10 @@ LogicalResult cir::ComplexImagOp::verify() {
 }
 
 OpFoldResult cir::ComplexImagOp::fold(FoldAdaptor adaptor) {
+  if (auto complexCreateOp =
+          dyn_cast_or_null<cir::ComplexCreateOp>(getOperand().getDefiningOp()))
+    return complexCreateOp.getOperand(1);
+
   auto complex =
       mlir::cast_if_present<cir::ConstComplexAttr>(adaptor.getOperand());
   return complex ? complex.getImag() : nullptr;

diff  --git a/clang/test/CIR/Transforms/complex-imag-fold.cir 
b/clang/test/CIR/Transforms/complex-imag-fold.cir
index 0d9a4e43142a3..56e062d5285a2 100644
--- a/clang/test/CIR/Transforms/complex-imag-fold.cir
+++ b/clang/test/CIR/Transforms/complex-imag-fold.cir
@@ -1,4 +1,4 @@
-// RUN: cir-opt %s -cir-canonicalize -o - | FileCheck %s
+// RUN: cir-opt %s -cir-canonicalize -split-input-file -o - | FileCheck %s
 
 !s32i = !cir.int<s, 32>
 
@@ -21,3 +21,19 @@ module {
   // CHECK: }
 
 }
+
+// -----
+
+!s32i = !cir.int<s, 32>
+
+module {
+  cir.func dso_local @fold_complex_imag_from_create_test(%arg0: !s32i, %arg1: 
!s32i) -> !s32i {
+    %0 = cir.complex.create %arg0, %arg1 : !s32i -> !cir.complex<!s32i>
+    %1 = cir.complex.imag %0 : !cir.complex<!s32i> -> !s32i
+    cir.return %1 : !s32i
+  }
+
+  // CHECK: cir.func dso_local 
@fold_complex_imag_from_create_test(%[[ARG_0:.*]]: !s32i, %[[ARG_1:.*]]: !s32i) 
-> !s32i {
+  // CHECK:   cir.return %[[ARG_1]] : !s32i
+  // CHECK: }
+}


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to