[clang] 4b7c100 - [CIR] Fix cir.select fold crash on a non-bool constant condition (#231428)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 13 05:05:01 PDT 2026
Author: Arseniy Obolenskiy
Date: 2026-10-13T14:04:56+02:00
New Revision: 4b7c1006cde9fdd9e1937d32998cfc1e0f421c38
URL: https://github.com/llvm/llvm-project/commit/4b7c1006cde9fdd9e1937d32998cfc1e0f421c38
DIFF: https://github.com/llvm/llvm-project/commit/4b7c1006cde9fdd9e1937d32998cfc1e0f421c38.diff
LOG: [CIR] Fix cir.select fold crash on a non-bool constant condition (#231428)
The fold cast any constant condition to BoolAttr and asserted on
`#cir.undef`
Fold only bool constants
Added:
Modified:
clang/lib/CIR/Dialect/IR/CIRDialect.cpp
clang/test/CIR/Transforms/select.cir
Removed:
################################################################################
diff --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
index f02288dd92f69e..cd7adbf2b63aa8 100644
--- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
+++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
@@ -3400,11 +3400,9 @@ void cir::TernaryOp::build(
//===----------------------------------------------------------------------===//
OpFoldResult cir::SelectOp::fold(FoldAdaptor adaptor) {
- mlir::Attribute condition = adaptor.getCondition();
- if (condition) {
- bool conditionValue = mlir::cast<cir::BoolAttr>(condition).getValue();
- return conditionValue ? getTrueValue() : getFalseValue();
- }
+ if (auto condition =
+ mlir::dyn_cast_if_present<cir::BoolAttr>(adaptor.getCondition()))
+ return condition.getValue() ? getTrueValue() : getFalseValue();
// cir.select if %0 then x else x -> x
mlir::Attribute trueValue = adaptor.getTrueValue();
diff --git a/clang/test/CIR/Transforms/select.cir b/clang/test/CIR/Transforms/select.cir
index 413b6cc668a7c8..a2473b05457b38 100644
--- a/clang/test/CIR/Transforms/select.cir
+++ b/clang/test/CIR/Transforms/select.cir
@@ -24,6 +24,18 @@ module {
// CHECK-NEXT: cir.return %[[ARG1]] : !s32i
// CHECK-NEXT: }
+ cir.func @no_fold_undef(%arg0 : !s32i, %arg1 : !s32i) -> !s32i {
+ %0 = cir.const #cir.undef : !cir.bool
+ %1 = cir.select if %0 then %arg0 else %arg1 : (!cir.bool, !s32i, !s32i) -> !s32i
+ cir.return %1 : !s32i
+ }
+
+ // CHECK: cir.func{{.*}} @no_fold_undef(%[[ARG0:.+]]: !s32i, %[[ARG1:.+]]: !s32i) -> !s32i {
+ // CHECK-NEXT: %[[#C:]] = cir.const #cir.undef : !cir.bool
+ // CHECK-NEXT: %[[#R:]] = cir.select if %[[#C]] then %[[ARG0]] else %[[ARG1]]
+ // CHECK-NEXT: cir.return %[[#R]] : !s32i
+ // CHECK-NEXT: }
+
cir.func @fold_to_const(%arg0 : !cir.bool) -> !s32i {
%0 = cir.const #cir.int<42> : !s32i
%1 = cir.select if %arg0 then %0 else %0 : (!cir.bool, !s32i, !s32i) -> !s32i
More information about the cfe-commits
mailing list