[clang] 9c20e5e - [CIR] Fix cir.cast fold crash on a same type integral cast (#234236)

via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 23 23:58:28 PDT 2026


Author: Arseniy Obolenskiy
Date: 2026-10-24T08:58:24+02:00
New Revision: 9c20e5ef1410a701e93fcadfe0a305af3fdd63fe

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

LOG: [CIR] Fix cir.cast fold crash on a same type integral cast (#234236)

The fold called fold() on the source defining op, which is null for
block arguments

Added: 
    

Modified: 
    clang/lib/CIR/Dialect/IR/CIRDialect.cpp
    clang/test/CIR/Transforms/canonicalize.cir

Removed: 
    


################################################################################
diff  --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
index 838ea1e953e9b..84e7611335b53 100644
--- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
+++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
@@ -1295,13 +1295,7 @@ OpFoldResult cir::CastOp::fold(FoldAdaptor adaptor) {
 
   if (getSrc().getType() == getType()) {
     switch (getKind()) {
-    case cir::CastKind::integral: {
-      llvm::SmallVector<mlir::OpFoldResult, 1> foldResults;
-      auto foldOrder = getSrc().getDefiningOp()->fold(foldResults);
-      if (foldOrder.succeeded() && mlir::isa<mlir::Attribute>(foldResults[0]))
-        return mlir::cast<mlir::Attribute>(foldResults[0]);
-      return {};
-    }
+    case cir::CastKind::integral:
     case cir::CastKind::bitcast:
     case cir::CastKind::address_space:
     case cir::CastKind::float_complex:

diff  --git a/clang/test/CIR/Transforms/canonicalize.cir b/clang/test/CIR/Transforms/canonicalize.cir
index c5b72f424aa64..a65df32833f19 100644
--- a/clang/test/CIR/Transforms/canonicalize.cir
+++ b/clang/test/CIR/Transforms/canonicalize.cir
@@ -216,6 +216,13 @@ module {
   // CHECK-NEXT:   %[[CAST3:.*]] = cir.cast integral %[[CAST2]] : !s32i -> !s64i
   // CHECK-NEXT:   cir.return %[[CAST3]] : !s64i
 
+  cir.func @cast_integral_same_type(%arg0: !s32i) -> !s32i {
+    %0 = cir.cast integral %arg0 : !s32i -> !s32i
+    cir.return %0 : !s32i
+  }
+  // CHECK:      cir.func{{.*}} @cast_integral_same_type(%[[ARG0:.*]]: !s32i) -> !s32i
+  // CHECK-NEXT:   cir.return %[[ARG0]] : !s32i
+
   cir.func @cast_poison() -> !s64i {
     %0 = cir.const #cir.poison : !s32i
     %1 = cir.cast integral %0 : !s32i -> !s64i


        


More information about the cfe-commits mailing list