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 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
