Index: mlir/lib/Dialect/Arith/IR/ArithOps.cpp =================================================================== --- mlir/lib/Dialect/Arith/IR/ArithOps.cpp +++ mlir/lib/Dialect/Arith/IR/ArithOps.cpp @@ -13,6 +13,7 @@ #include "mlir/Dialect/Arith/IR/Arith.h" #include "mlir/Dialect/CommonFolders.h" +#include "mlir/Dialect/UB/IR/UBOps.h" #include "mlir/IR/Builders.h" #include "mlir/IR/BuiltinAttributeInterfaces.h" #include "mlir/IR/BuiltinAttributes.h" @@ -2184,6 +2185,13 @@ if (trueVal == falseVal) return trueVal; + // If either operand is fully poisoned, return the other. + if (isa_and_nonnull(adaptor.getTrueValue())) + return falseVal; + + if (isa_and_nonnull(adaptor.getFalseValue())) + return trueVal; + Value condition = getCondition(); // select true, %0, %1 => %0 Index: mlir/lib/Dialect/Arith/IR/CMakeLists.txt =================================================================== --- mlir/lib/Dialect/Arith/IR/CMakeLists.txt +++ mlir/lib/Dialect/Arith/IR/CMakeLists.txt @@ -28,6 +28,7 @@ MLIRInferIntRangeInterface MLIRInferTypeOpInterface MLIRIR + MLIRUBDialect ) add_mlir_dialect_library(MLIRArithValueBoundsOpInterfaceImpl Index: mlir/test/Dialect/Arith/canonicalize.mlir =================================================================== --- mlir/test/Dialect/Arith/canonicalize.mlir +++ mlir/test/Dialect/Arith/canonicalize.mlir @@ -2567,3 +2567,13 @@ %2 = arith.ori %arg0, %1 : index return %2 : index } + +// CHECK-LABEL: @selectOfPoison +// CHECK-SAME: %[[ARG:[[:alnum:]]+]]: i32 +// CHECK: return %[[ARG]], %[[ARG]] +func.func @selectOfPoison(%cond : i1, %arg: i32) -> (i32, i32) { + %poison = ub.poison : i32 + %select1 = arith.select %cond, %poison, %arg : i32 + %select2 = arith.select %cond, %arg, %poison : i32 + return %select1, %select2 : i32, i32 +} \ No newline at end of file