llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clangir

Author: Amr Hesham (AmrDeveloper)

<details>
<summary>Changes</summary>

Run Lowering preparing pass conditionally if the action is not to emit CIR

---

Patch is 91.48 KiB, truncated to 20.00 KiB below, full version: 
https://github.com/llvm/llvm-project/pull/154107.diff


15 Files Affected:

- (modified) clang/include/clang/CIR/CIRToCIRPasses.h (+5-8) 
- (modified) clang/lib/CIR/FrontendAction/CIRGenAction.cpp (+2-1) 
- (modified) clang/lib/CIR/Lowering/CIRPasses.cpp (+6-7) 
- (modified) clang/test/CIR/CodeGen/array-ctor.cpp (+9-37) 
- (modified) clang/test/CIR/CodeGen/array-dtor.cpp (+7-34) 
- (modified) clang/test/CIR/CodeGen/complex-builtins.cpp (+5-8) 
- (modified) clang/test/CIR/CodeGen/complex-cast.cpp (+29-104) 
- (modified) clang/test/CIR/CodeGen/complex-compound-assignment.cpp (+8-49) 
- (modified) clang/test/CIR/CodeGen/complex-mul-div.cpp (+15-80) 
- (modified) clang/test/CIR/CodeGen/complex-unary.cpp (+46-124) 
- (modified) clang/test/CIR/CodeGen/complex.cpp (+1-2) 
- (modified) clang/test/CIR/CodeGen/destructors.cpp (+13-23) 
- (modified) clang/test/CIR/CodeGenOpenACC/combined-private-clause.cpp (+17-41) 
- (modified) clang/test/CIR/CodeGenOpenACC/compute-private-clause.cpp (+17-41) 
- (modified) clang/test/CIR/CodeGenOpenACC/loop-private-clause.cpp (+17-41) 


``````````diff
diff --git a/clang/include/clang/CIR/CIRToCIRPasses.h 
b/clang/include/clang/CIR/CIRToCIRPasses.h
index 4a23790ee8b76..0229faaaf9fca 100644
--- a/clang/include/clang/CIR/CIRToCIRPasses.h
+++ b/clang/include/clang/CIR/CIRToCIRPasses.h
@@ -15,11 +15,9 @@
 
 #include "mlir/Pass/Pass.h"
 
-#include <memory>
-
 namespace clang {
 class ASTContext;
-}
+} // namespace clang
 
 namespace mlir {
 class MLIRContext;
@@ -29,11 +27,10 @@ class ModuleOp;
 namespace cir {
 
 // Run set of cleanup/prepare/etc passes CIR <-> CIR.
-mlir::LogicalResult runCIRToCIRPasses(mlir::ModuleOp theModule,
-                                      mlir::MLIRContext &mlirCtx,
-                                      clang::ASTContext &astCtx,
-                                      bool enableVerifier,
-                                      bool enableCIRSimplify);
+mlir::LogicalResult
+runCIRToCIRPasses(mlir::ModuleOp theModule, mlir::MLIRContext &mlirCtx,
+                  clang::ASTContext &astCtx, bool enableVerifier,
+                  bool enableCIRSimplify, bool enableLoweringPrepare);
 
 } // namespace cir
 
diff --git a/clang/lib/CIR/FrontendAction/CIRGenAction.cpp 
b/clang/lib/CIR/FrontendAction/CIRGenAction.cpp
index 67bb5657d4001..0651910e83d57 100644
--- a/clang/lib/CIR/FrontendAction/CIRGenAction.cpp
+++ b/clang/lib/CIR/FrontendAction/CIRGenAction.cpp
@@ -110,9 +110,10 @@ class CIRGenConsumer : public clang::ASTConsumer {
 
     if (!FEOptions.ClangIRDisablePasses) {
       // Setup and run CIR pipeline.
+      bool EnableLoweringPrepare = Action != CIRGenAction::OutputType::EmitCIR;
       if (runCIRToCIRPasses(MlirModule, MlirCtx, C,
                             !FEOptions.ClangIRDisableCIRVerifier,
-                            CGO.OptimizationLevel > 0)
+                            CGO.OptimizationLevel > 0, EnableLoweringPrepare)
               .failed()) {
         CI.getDiagnostics().Report(diag::err_cir_to_cir_transform_failed);
         return;
diff --git a/clang/lib/CIR/Lowering/CIRPasses.cpp 
b/clang/lib/CIR/Lowering/CIRPasses.cpp
index bb9781be897eb..9acfaca9afbd2 100644
--- a/clang/lib/CIR/Lowering/CIRPasses.cpp
+++ b/clang/lib/CIR/Lowering/CIRPasses.cpp
@@ -10,18 +10,16 @@
 //
 
//===----------------------------------------------------------------------===//
 
-// #include "clang/AST/ASTContext.h"
 #include "mlir/IR/BuiltinOps.h"
 #include "mlir/Pass/PassManager.h"
 #include "clang/CIR/Dialect/Passes.h"
 #include "llvm/Support/TimeProfiler.h"
 
 namespace cir {
-mlir::LogicalResult runCIRToCIRPasses(mlir::ModuleOp theModule,
-                                      mlir::MLIRContext &mlirContext,
-                                      clang::ASTContext &astContext,
-                                      bool enableVerifier,
-                                      bool enableCIRSimplify) {
+mlir::LogicalResult
+runCIRToCIRPasses(mlir::ModuleOp theModule, mlir::MLIRContext &mlirContext,
+                  clang::ASTContext &astContext, bool enableVerifier,
+                  bool enableCIRSimplify, bool enableLoweringPrepare) {
 
   llvm::TimeTraceScope scope("CIR To CIR Passes");
 
@@ -31,7 +29,8 @@ mlir::LogicalResult runCIRToCIRPasses(mlir::ModuleOp 
theModule,
   if (enableCIRSimplify)
     pm.addPass(mlir::createCIRSimplifyPass());
 
-  pm.addPass(mlir::createLoweringPreparePass(&astContext));
+  if (enableLoweringPrepare)
+    pm.addPass(mlir::createLoweringPreparePass(&astContext));
 
   pm.enableVerifier(enableVerifier);
   (void)mlir::applyPassManagerCLOptions(pm);
diff --git a/clang/test/CIR/CodeGen/array-ctor.cpp 
b/clang/test/CIR/CodeGen/array-ctor.cpp
index c373acf0bff8c..0a2762973b1b6 100644
--- a/clang/test/CIR/CodeGen/array-ctor.cpp
+++ b/clang/test/CIR/CodeGen/array-ctor.cpp
@@ -1,6 +1,5 @@
-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value 
-fclangir -emit-cir -mmlir --mlir-print-ir-before=cir-lowering-prepare %s -o -  
2>&1 | FileCheck --check-prefixes=CIR-BEFORE-LPP %s
-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value 
-fclangir -emit-cir %s -o %t.cir
-// RUN: FileCheck --input-file=%t.cir %s -check-prefix=CIR
+// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu 
-Wno-unused-value -fclangir -emit-cir %s -o %t.cir
+// RUN: FileCheck --input-file=%t.cir %s --check-prefixes=CIR
 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value 
-fclangir -emit-llvm %s -o %t-cir.ll
 // RUN: FileCheck --input-file=%t-cir.ll %s -check-prefix=LLVM
 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value 
-emit-llvm %s -o %t.ll
@@ -14,35 +13,13 @@ void foo() {
     S s[42];
 }
 
-// CIR-BEFORE-LPP: cir.func dso_local @_Z3foov()
-// CIR-BEFORE-LPP:   %[[ARRAY:.*]] = cir.alloca !cir.array<!rec_S x 42>, 
!cir.ptr<!cir.array<!rec_S x 42>>, ["s", init]
-// CIR-BEFORE-LPP:   cir.array.ctor %[[ARRAY]] : !cir.ptr<!cir.array<!rec_S x 
42>> {
-// CIR-BEFORE-LPP:    ^bb0(%[[ARG:.*]]: !cir.ptr<!rec_S>):
-// CIR-BEFORE-LPP:      cir.call @_ZN1SC1Ev(%[[ARG]]) : (!cir.ptr<!rec_S>) -> 
()
-// CIR-BEFORE-LPP:      cir.yield
-// CIR-BEFORE-LPP:    }
-// CIR-BEFORE-LPP:   cir.return
-// CIR-BEFORE-LPP: }
-
 // CIR: cir.func dso_local @_Z3foov()
 // CIR:   %[[ARRAY:.*]] = cir.alloca !cir.array<!rec_S x 42>, 
!cir.ptr<!cir.array<!rec_S x 42>>, ["s", init]
-// CIR:   %[[CONST42:.*]] = cir.const #cir.int<42> : !u64i
-// CIR:   %[[DECAY:.*]] = cir.cast(array_to_ptrdecay, %[[ARRAY]] : 
!cir.ptr<!cir.array<!rec_S x 42>>), !cir.ptr<!rec_S>
-// CIR:   %[[END_PTR:.*]] = cir.ptr_stride(%[[DECAY]] : !cir.ptr<!rec_S>, 
%[[CONST42]] : !u64i), !cir.ptr<!rec_S>
-// CIR:   %[[ITER:.*]] = cir.alloca !cir.ptr<!rec_S>, 
!cir.ptr<!cir.ptr<!rec_S>>, ["__array_idx"]
-// CIR:   cir.store %[[DECAY]], %[[ITER]] : !cir.ptr<!rec_S>, 
!cir.ptr<!cir.ptr<!rec_S>>
-// CIR:   cir.do {
-// CIR:     %[[CURRENT:.*]] = cir.load %[[ITER]] : !cir.ptr<!cir.ptr<!rec_S>>, 
!cir.ptr<!rec_S>
-// CIR:     cir.call @_ZN1SC1Ev(%[[CURRENT]]) : (!cir.ptr<!rec_S>) -> ()
-// CIR:     %[[CONST1:.*]] = cir.const #cir.int<1> : !u64i
-// CIR:     %[[NEXT:.*]] = cir.ptr_stride(%[[CURRENT]] : !cir.ptr<!rec_S>, 
%[[CONST1]] : !u64i), !cir.ptr<!rec_S>
-// CIR:     cir.store %[[NEXT]], %[[ITER]] : !cir.ptr<!rec_S>, 
!cir.ptr<!cir.ptr<!rec_S>>
-// CIR:     cir.yield
-// CIR:   } while {
-// CIR:     %[[CURRENT2:.*]] = cir.load %[[ITER]] : 
!cir.ptr<!cir.ptr<!rec_S>>, !cir.ptr<!rec_S>
-// CIR:     %[[CMP:.*]] = cir.cmp(ne, %[[CURRENT2]], %[[END_PTR]]) : 
!cir.ptr<!rec_S>, !cir.bool
-// CIR:     cir.condition(%[[CMP]])
-// CIR:   }
+// CIR:   cir.array.ctor %[[ARRAY]] : !cir.ptr<!cir.array<!rec_S x 42>> {
+// CIR:    ^bb0(%[[ARG:.*]]: !cir.ptr<!rec_S> {{.*}}):
+// CIR:      cir.call @_ZN1SC1Ev(%[[ARG]]) : (!cir.ptr<!rec_S>) -> ()
+// CIR:      cir.yield
+// CIR:    }
 // CIR:   cir.return
 // CIR: }
 
@@ -84,15 +61,9 @@ void zero_sized() {
     S s[0];
 }
 
-// CIR-BEFORE-LPP:     cir.func dso_local @_Z10zero_sizedv()
-// CIR-BEFORE-LPP:       cir.alloca !cir.array<!rec_S x 0>, 
!cir.ptr<!cir.array<!rec_S x 0>>, ["s"]
-// CIR-BEFORE-LPP-NOT:   cir.array.ctor
-// CIR-BEFORE-LPP:       cir.return
-
 // CIR:     cir.func dso_local @_Z10zero_sizedv()
 // CIR:       cir.alloca !cir.array<!rec_S x 0>, !cir.ptr<!cir.array<!rec_S x 
0>>, ["s"]
-// CIR-NOT:   cir.do
-// CIR-NOT:   cir.call @_ZN1SC1Ev
+// CIR-NOT:   cir.array.ctor
 // CIR:       cir.return
 
 // LLVM:     define dso_local void @_Z10zero_sizedv()
@@ -104,3 +75,4 @@ void zero_sized() {
 // OGCG:       alloca [0 x %struct.S]
 // OGCG-NOT:   call void @_ZN1SC1Ev
 // OGCG:       ret void
+
diff --git a/clang/test/CIR/CodeGen/array-dtor.cpp 
b/clang/test/CIR/CodeGen/array-dtor.cpp
index 3edc6f1a6538d..19b2ff1dfd3de 100644
--- a/clang/test/CIR/CodeGen/array-dtor.cpp
+++ b/clang/test/CIR/CodeGen/array-dtor.cpp
@@ -1,6 +1,5 @@
-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value 
-fclangir -emit-cir -mmlir --mlir-print-ir-before=cir-lowering-prepare %s -o 
%t.cir  2> %t-before-lp.cir
-// RUN: FileCheck --input-file=%t-before-lp.cir %s -check-prefix=CIR-BEFORE-LPP
-// RUN: FileCheck --input-file=%t.cir %s -check-prefix=CIR
+// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu 
-Wno-unused-value -fclangir -emit-cir %s -o %t.cir
+// RUN: FileCheck --input-file=%t.cir %s --check-prefixes=CIR
 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value 
-fclangir -emit-llvm %s -o %t-cir.ll
 // RUN: FileCheck --input-file=%t-cir.ll %s -check-prefix=LLVM
 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value 
-emit-llvm %s -o %t.ll
@@ -14,33 +13,12 @@ void test_cleanup_array() {
     S s[42];
 }
 
-// CIR-BEFORE-LPP: cir.func{{.*}} @_Z18test_cleanup_arrayv()
-// CIR-BEFORE-LPP:   %[[S:.*]] = cir.alloca !cir.array<!rec_S x 42>, 
!cir.ptr<!cir.array<!rec_S x 42>>, ["s"]
-// CIR-BEFORE-LPP:   cir.array.dtor %[[S]] : !cir.ptr<!cir.array<!rec_S x 42>> 
{
-// CIR-BEFORE-LPP:   ^bb0(%arg0: !cir.ptr<!rec_S>
-// CIR-BEFORE-LPP:     cir.call @_ZN1SD1Ev(%arg0) nothrow : (!cir.ptr<!rec_S>) 
-> ()
-// CIR-BEFORE-LPP:     cir.yield
-// CIR-BEFORE-LPP:   }
-// CIR-BEFORE-LPP:   cir.return
-
 // CIR: cir.func{{.*}} @_Z18test_cleanup_arrayv()
 // CIR:   %[[S:.*]] = cir.alloca !cir.array<!rec_S x 42>, 
!cir.ptr<!cir.array<!rec_S x 42>>, ["s"]
-// CIR:   %[[CONST41:.*]] = cir.const #cir.int<41> : !u64i
-// CIR:   %[[DECAY:.*]] = cir.cast(array_to_ptrdecay, %[[S]] : 
!cir.ptr<!cir.array<!rec_S x 42>>), !cir.ptr<!rec_S>
-// CIR:   %[[END_PTR:.*]] = cir.ptr_stride(%[[DECAY]] : !cir.ptr<!rec_S>, 
%[[CONST41]] : !u64i), !cir.ptr<!rec_S>
-// CIR:   %[[ITER:.*]] = cir.alloca !cir.ptr<!rec_S>, 
!cir.ptr<!cir.ptr<!rec_S>>, ["__array_idx"]
-// CIR:   cir.store %[[END_PTR]], %[[ITER]] : !cir.ptr<!rec_S>, 
!cir.ptr<!cir.ptr<!rec_S>>
-// CIR:   cir.do {
-// CIR:     %[[CURRENT:.*]] = cir.load %[[ITER]] : !cir.ptr<!cir.ptr<!rec_S>>, 
!cir.ptr<!rec_S>
-// CIR:     cir.call @_ZN1SD1Ev(%[[CURRENT]]) nothrow : (!cir.ptr<!rec_S>) -> 
()
-// CIR:     %[[CONST_MINUS1:.*]] = cir.const #cir.int<-1> : !s64i
-// CIR:     %[[NEXT:.*]] = cir.ptr_stride(%[[CURRENT]] : !cir.ptr<!rec_S>, 
%[[CONST_MINUS1]] : !s64i), !cir.ptr<!rec_S>
-// CIR:     cir.store %[[NEXT]], %[[ITER]] : !cir.ptr<!rec_S>, 
!cir.ptr<!cir.ptr<!rec_S>>
+// CIR:   cir.array.dtor %[[S]] : !cir.ptr<!cir.array<!rec_S x 42>> {
+// CIR:   ^bb0(%arg0: !cir.ptr<!rec_S>
+// CIR:     cir.call @_ZN1SD1Ev(%arg0) nothrow : (!cir.ptr<!rec_S>) -> ()
 // CIR:     cir.yield
-// CIR:   } while {
-// CIR:     %[[CURRENT2:.*]] = cir.load %[[ITER]] : 
!cir.ptr<!cir.ptr<!rec_S>>, !cir.ptr<!rec_S>
-// CIR:     %[[CMP:.*]] = cir.cmp(ne, %[[CURRENT2]], %[[DECAY]])
-// CIR:     cir.condition(%[[CMP]])
 // CIR:   }
 // CIR:   cir.return
 
@@ -82,15 +60,9 @@ void test_cleanup_zero_length_array() {
     S s[0];
 }
 
-// CIR-BEFORE-LPP:     cir.func{{.*}} @_Z30test_cleanup_zero_length_arrayv()
-// CIR-BEFORE-LPP:       %[[S:.*]] = cir.alloca !cir.array<!rec_S x 0>, 
!cir.ptr<!cir.array<!rec_S x 0>>, ["s"]
-// CIR-BEFORE-LPP-NOT:   cir.array.dtor
-// CIR-BEFORE-LPP:       cir.return
-
 // CIR:     cir.func{{.*}} @_Z30test_cleanup_zero_length_arrayv()
 // CIR:       %[[S:.*]] = cir.alloca !cir.array<!rec_S x 0>, 
!cir.ptr<!cir.array<!rec_S x 0>>, ["s"]
-// CIR-NOT:   cir.do
-// CIR-NOT:   cir.call @_ZN1SD1Ev
+// CIR-NOT:   cir.array.dtor
 // CIR:       cir.return
 
 // LLVM:     define{{.*}} void @_Z30test_cleanup_zero_length_arrayv()
@@ -102,3 +74,4 @@ void test_cleanup_zero_length_array() {
 // OGCG:       alloca [0 x %struct.S]
 // OGCG-NOT:   call void @_ZN1SD1Ev
 // OGCG:       ret void
+
diff --git a/clang/test/CIR/CodeGen/complex-builtins.cpp 
b/clang/test/CIR/CodeGen/complex-builtins.cpp
index 811af47a704f5..1f3c31079c1f9 100644
--- a/clang/test/CIR/CodeGen/complex-builtins.cpp
+++ b/clang/test/CIR/CodeGen/complex-builtins.cpp
@@ -89,14 +89,11 @@ void foo4() {
   float _Complex b = __builtin_conjf(a);
 }
 
-// CIR: %[[COMPLEX:.*]] = cir.alloca !cir.complex<!cir.float>, 
!cir.ptr<!cir.complex<!cir.float>>, ["a"]
-// CIR: %[[RESULT:.*]] = cir.alloca !cir.complex<!cir.float>, 
!cir.ptr<!cir.complex<!cir.float>>, ["b", init]
-// CIR: %[[TMP:.*]] = cir.load{{.*}} %[[COMPLEX]] : 
!cir.ptr<!cir.complex<!cir.float>>, !cir.complex<!cir.float>
-// CIR: %[[REAL:.*]] = cir.complex.real %[[TMP]] : !cir.complex<!cir.float> -> 
!cir.float
-// CIR: %[[IMAG:.*]] = cir.complex.imag %[[TMP]] : !cir.complex<!cir.float> -> 
!cir.float
-// CIR: %[[IMAG_MINUS:.*]] = cir.unary(minus, %[[IMAG]]) : !cir.float, 
!cir.float
-// CIR: %[[RESULT_VAL:.*]] = cir.complex.create %[[REAL]], %[[IMAG_MINUS]] : 
!cir.float -> !cir.complex<!cir.float>
-// CIR: cir.store{{.*}} %[[RESULT_VAL]], %[[RESULT]] : 
!cir.complex<!cir.float>, !cir.ptr<!cir.complex<!cir.float>>
+// CIR: %[[A_ADDR:.*]] = cir.alloca !cir.complex<!cir.float>, 
!cir.ptr<!cir.complex<!cir.float>>, ["a"]
+// CIR: %[[B_ADDR:.*]] = cir.alloca !cir.complex<!cir.float>, 
!cir.ptr<!cir.complex<!cir.float>>, ["b", init]
+// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : 
!cir.ptr<!cir.complex<!cir.float>>, !cir.complex<!cir.float>
+// CIR: %[[RESULT:.*]] = cir.unary(not, %[[TMP_A]]) : 
!cir.complex<!cir.float>, !cir.complex<!cir.float>
+// CIR: cir.store{{.*}} %[[RESULT]], %[[B_ADDR]] : !cir.complex<!cir.float>, 
!cir.ptr<!cir.complex<!cir.float>>
 
 // LLVM: %[[COMPLEX:.*]] = alloca { float, float }, i64 1, align 4
 // LLVM: %[[RESULT:.*]] = alloca { float, float }, i64 1, align 4
diff --git a/clang/test/CIR/CodeGen/complex-cast.cpp 
b/clang/test/CIR/CodeGen/complex-cast.cpp
index a8f51cd627f9d..c6bfa89443687 100644
--- a/clang/test/CIR/CodeGen/complex-cast.cpp
+++ b/clang/test/CIR/CodeGen/complex-cast.cpp
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir -mmlir 
--mlir-print-ir-before=cir-canonicalize -o %t.cir %s 2>&1 | FileCheck 
--check-prefix=CIR-BEFORE %s
-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir -mmlir 
--mlir-print-ir-after=cir-lowering-prepare -o %t.cir %s 2>&1 | FileCheck 
--check-prefixes=CIR-AFTER %s
+// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu 
-Wno-unused-value -fclangir -emit-cir %s -o %t.cir
+// RUN: FileCheck --input-file=%t.cir %s --check-prefixes=CIR
 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value 
-fclangir -emit-llvm %s -o %t-cir.ll
 // RUN: FileCheck --input-file=%t-cir.ll %s -check-prefix=LLVM
 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value 
-emit-llvm %s -o %t.ll
@@ -20,11 +20,7 @@ void scalar_to_complex() {
   ci = sd;
 }
 
-// CIR-BEFORE: %[[FP_TO_COMPLEX:.*]] = cir.cast(float_to_complex, %{{.*}} : 
!cir.double), !cir.complex<!cir.double>
-
-//      CIR-AFTER: %[[REAL:.*]] = cir.load{{.*}}  %{{.*}} : 
!cir.ptr<!cir.double>, !cir.double
-// CIR-AFTER-NEXT: %[[IMAG:.*]] = cir.const #cir.fp<0.000000e+00> : !cir.double
-// CIR-AFTER-NEXT: %{{.*}} = cir.complex.create %[[REAL]], %[[IMAG]] : 
!cir.double -> !cir.complex<!cir.double>
+// CIR: %[[FP_TO_COMPLEX:.*]] = cir.cast(float_to_complex, %{{.*}} : 
!cir.double), !cir.complex<!cir.double>
 
 //      LLVM: %[[REAL:.*]] = load double, ptr {{.*}}, align 8
 // LLVM-NEXT: %[[TMP:.*]] = insertvalue { double, double } undef, double 
%[[REAL]], 0
@@ -35,11 +31,7 @@ void scalar_to_complex() {
 // OGCG: store double %[[REAL]], ptr {{.*}}, align 8
 // OGCG: store double 0.000000e+00, ptr getelementptr inbounds nuw ({ double, 
double }, ptr @cd, i32 0, i32 1), align 8
 
-// CIR-BEFORE: %[[INT_TO_COMPLEX:.*]] = cir.cast(int_to_complex, %{{.*}} : 
!s32i), !cir.complex<!s32i>
-
-//      CIR-AFTER: %[[REAL:.*]] = cir.load{{.*}}  %{{.*}} : !cir.ptr<!s32i>, 
!s32i
-// CIR-AFTER-NEXT: %[[IMAG:.*]] = cir.const #cir.int<0> : !s32i
-// CIR-AFTER-NEXT: %{{.*}} = cir.complex.create %[[REAL]], %[[IMAG]] : !s32i 
-> !cir.complex<!s32i>
+// CIR: %[[INT_TO_COMPLEX:.*]] = cir.cast(int_to_complex, %{{.*}} : !s32i), 
!cir.complex<!s32i>
 
 //      LLVM: %[[REAL:.*]] = load i32, ptr {{.*}}, align 4
 // LLVM-NEXT: %[[TMP:.*]] = insertvalue { i32, i32 } undef, i32 %[[REAL]], 0
@@ -50,13 +42,8 @@ void scalar_to_complex() {
 // OGCG: store i32 %[[REAL]], ptr {{.*}}, align 4
 // OGCG: store i32 0, ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci, 
i32 0, i32 1), align 4
 
-// CIR-BEFORE: %[[INT_TO_FP:.*]] = cir.cast(int_to_float, %{{.*}} : !s32i), 
!cir.double
-// CIR-BEFORE: %[[FP_TO_COMPLEX:.*]] = cir.cast(float_to_complex, 
%[[INT_TO_FP]] : !cir.double), !cir.complex<!cir.double>
-
-//      CIR-AFTER: %[[TMP:.*]] = cir.load{{.*}} %{{.*}} : !cir.ptr<!s32i>, 
!s32i
-// CIR-AFTER-NEXT: %[[REAL:.*]] = cir.cast(int_to_float, %[[TMP]] : !s32i), 
!cir.double
-// CIR-AFTER-NEXT: %[[IMAG:.*]] = cir.const #cir.fp<0.000000e+00> : !cir.double
-// CIR-AFTER-NEXT: %{{.*}} = cir.complex.create %[[REAL]], %[[IMAG]] : 
!cir.double -> !cir.complex<!cir.double>
+// CIR: %[[INT_TO_FP:.*]] = cir.cast(int_to_float, %{{.*}} : !s32i), 
!cir.double
+// CIR: %[[FP_TO_COMPLEX:.*]] = cir.cast(float_to_complex, %[[INT_TO_FP]] : 
!cir.double), !cir.complex<!cir.double>
 
 //      LLVM: %[[TMP:.*]] = load i32, ptr {{.*}}, align 4
 // LLVM-NEXT: %[[REAL:.*]] = sitofp i32 %[[TMP]] to double
@@ -69,13 +56,8 @@ void scalar_to_complex() {
 // OGCG: store double %[[REAL]], ptr {{.*}}, align 8
 // OGCG: store double 0.000000e+00, ptr getelementptr inbounds nuw ({ double, 
double }, ptr {{.*}}, i32 0, i32 1), align 8
 
-// CIR-BEFORE: %[[FP_TO_INT:.*]] = cir.cast(float_to_int, %{{.*}} : 
!cir.double), !s32i
-// CIR-BEFORE: %[[INT_TO_COMPLEX:.*]] = cir.cast(int_to_complex, 
%[[FP_TO_INT]] : !s32i), !cir.complex<!s32i>
-
-//      CIR-AFTER: %[[TMP:.*]] = cir.load{{.*}} %{{.*}} : 
!cir.ptr<!cir.double>, !cir.double
-// CIR-AFTER-NEXT: %[[REAL:.*]] = cir.cast(float_to_int, %[[TMP]] : 
!cir.double), !s32i
-// CIR-AFTER-NEXT: %[[IMAG:.*]] = cir.const #cir.int<0> : !s32i
-// CIR-AFTER-NEXT: %{{.*}} = cir.complex.create %[[REAL]], %[[IMAG]] : !s32i 
-> !cir.complex<!s32i>
+// CIR: %[[FP_TO_INT:.*]] = cir.cast(float_to_int, %{{.*}} : !cir.double), 
!s32i
+// CIR: %[[INT_TO_COMPLEX:.*]] = cir.cast(int_to_complex, %[[FP_TO_INT]] : 
!s32i), !cir.complex<!s32i>
 
 //      LLVM: %[[TMP:.*]] = load double, ptr {{.*}}, align 8
 // LLVM-NEXT: %[[REAL:.*]] = fptosi double %[[TMP]] to i32
@@ -95,11 +77,7 @@ void scalar_to_complex_explicit() {
   ci = (int _Complex)sd;
 }
 
-// CIR-BEFORE: %[[FP_TO_COMPLEX:.*]] = cir.cast(float_to_complex, %{{.*}} : 
!cir.double), !cir.complex<!cir.double>
-
-//      CIR-AFTER: %[[REAL:.*]] = cir.load{{.*}}  %{{.*}} : 
!cir.ptr<!cir.double>, !cir.double
-// CIR-AFTER-NEXT: %[[IMAG:.*]] = cir.const #cir.fp<0.000000e+00> : !cir.double
-// CIR-AFTER-NEXT: %{{.*}} = cir.complex.create %[[REAL]], %[[IMAG]] : 
!cir.double -> !cir.complex<!cir.double>
+// CIR: %[[FP_TO_COMPLEX:.*]] = cir.cast(float_to_complex, %{{.*}} : 
!cir.double), !cir.complex<!cir.double>
 
 //      LLVM: %[[REAL:.*]] = load double, ptr {{.*}}, align 8
 // LLVM-NEXT: %[[TMP:.*]] = insertvalue { double, double } undef, double 
%[[REAL]], 0
@@ -110,11 +88,7 @@ void scalar_to_complex_explicit() {
 // OGCG: store double %[[REAL]], ptr {{.*}}, align 8
 // OGCG: store double 0.000000e+00, ptr getelementptr inbounds nuw ({ double, 
double }, ptr @cd, i32 0, i32 1), align 8
 
-// CIR-BEFORE: %[[INT_TO_COMPLEX:.*]] = cir.cast(int_to_complex, %{{.*}} : 
!s32i), !cir.complex<!s32i>
-
-//      CIR-AFTER: %[[REAL:.*]] = cir.load{{.*}}  %{{.*}} : !cir.ptr<!s32i>, 
!s32i
-// CIR-AFTER-NEXT: %[[IMAG:.*]] = cir.const #cir.int<0> : !s32i
-// CIR-AFTER-NEXT: %{{.*}} = cir.complex.create %[[REAL]], %[[IMAG]] : !s32i 
-> !cir.complex<!s32i>
+// CIR: %[[INT_TO_COMPLEX:.*]] = cir.cast(int_to_complex, %{{.*}} : !s32i), 
!cir.complex<!s32i>
 
 //      LLVM: %[[REAL:.*]] = load i32, ptr {{.*}}, align 4
 // LLVM-NEXT: %[[TMP:.*]] = insertvalue { i32, i32 } undef, i32 %[[REAL]], 0
@@ -125,13 +99,8 @@ void scalar_to_complex_explicit() {
 // OGCG: store i32 %[[REAL]], ptr {{.*}}, align 4
 // OGCG: store i32 0, ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci, 
i32 0, i32 1), align 4
 
-// CIR-BEFORE: %[[INT_TO_FP:.*]] = cir.cast(int_to_float, %{{.*}} : !s32i), 
!cir.double
-// CIR-BEFORE: %[[FP_TO_COMPLEX:.*]] = cir.cast(float_to_complex, 
%[[INT_TO_FP]] : !cir.double), !cir.complex<!cir.double>
-
-//      CIR-AFTER: %[[TMP:.*]] = cir.load{{.*}} %{{.*}} : !cir.ptr<!s32i>, 
!s32i
-// CIR-AFTER-NEXT: %[[REAL:.*]] = cir.cast(int_to_float, %[[TMP]] : !s32i), 
!cir.double
-// CIR-AFTER-NEXT: %[[IMAG:.*]] = cir.const #cir.fp<0.000000e+00> : !cir.double
-// CIR-AFTER-NEXT: %{{.*}} = cir.complex.create...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/154107
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to