Use `uitofp` when converting a boolean to floating-point.
It was lowered to `sitofp` which resulted in `-1.0`. PiperOrigin-RevId: 352958489
This commit is contained in:
parent
cf08128862
commit
46112c95c6
|
@ -288,7 +288,12 @@ inline Value MapLhloOpToStdScalarOp<lmhlo::ConvertOp>(
|
|||
Type sourceType = getElementTypeOrSelf(args.front().getType());
|
||||
Type targetType = getElementTypeOrSelf(result_types.front());
|
||||
|
||||
if (mlir::SIToFPOp::areCastCompatible(sourceType, targetType)) {
|
||||
// A boolean value is considered to be unsigned when converting to
|
||||
// floating-point. Otherwise, it will become `-1`.
|
||||
if (sourceType.isInteger(/*width=*/1) &&
|
||||
mlir::UIToFPOp::areCastCompatible(sourceType, targetType)) {
|
||||
return b->create<mlir::UIToFPOp>(loc, result_types, args, mlir::None);
|
||||
} else if (mlir::SIToFPOp::areCastCompatible(sourceType, targetType)) {
|
||||
return b->create<mlir::SIToFPOp>(loc, result_types, args, mlir::None);
|
||||
} else if (sourceType.isa<FloatType>() && targetType.isa<FloatType>()) {
|
||||
FloatType src = sourceType.cast<FloatType>();
|
||||
|
|
|
@ -608,6 +608,19 @@ func @reshape_multiple_collapse
|
|||
|
||||
// -----
|
||||
|
||||
// CHECK-LABEL: func @convert_i1_to_f32
|
||||
func @convert_i1_to_f32(%input: tensor<2x2xi1>) -> tensor<2x2xf32> {
|
||||
%result = "mhlo.convert"(%input) : (tensor<2x2xi1>) -> tensor<2x2xf32>
|
||||
return %result : tensor<2x2xf32>
|
||||
}
|
||||
// CHECK: linalg.init_tensor
|
||||
// CHECK: linalg.generic
|
||||
// CHECK-NEXT: ^bb0(%[[OPERAND_IN:.*]]: i1, %{{.*}}: f32):
|
||||
// CHECK-NEXT: %[[RESULT:.*]] = uitofp %[[OPERAND_IN]] : i1 to f32
|
||||
// CHECK-NEXT: linalg.yield %[[RESULT]] : f32
|
||||
|
||||
// -----
|
||||
|
||||
// CHECK-LABEL: func @convert_i32_to_f32
|
||||
func @convert_i32_to_f32(%input: tensor<2x2xi32>) -> tensor<2x2xf32> {
|
||||
%result = "mhlo.convert"(%input) : (tensor<2x2xi32>) -> tensor<2x2xf32>
|
||||
|
|
|
@ -404,6 +404,18 @@ func @ceil(%input: memref<2x2xf32>, %result: memref<2x2xf32>) {
|
|||
|
||||
// -----
|
||||
|
||||
// CHECK-LABEL: func @convert_i1_to_f32
|
||||
func @convert_i1_to_f32(%input: memref<2x2xi1>, %result: memref<2x2xf32>) {
|
||||
"lmhlo.convert"(%input, %result) : (memref<2x2xi1>, memref<2x2xf32>) -> ()
|
||||
return
|
||||
}
|
||||
// CHECK: linalg.generic
|
||||
// CHECK-NEXT: ^bb0(%[[OPERAND_IN:.*]]: i1, %[[RESULT_OUT:.*]]: f32):
|
||||
// CHECK-NEXT: %[[RESULT:.*]] = uitofp %[[OPERAND_IN]] : i1 to f32
|
||||
// CHECK-NEXT: linalg.yield %[[RESULT]] : f32
|
||||
|
||||
// -----
|
||||
|
||||
// CHECK-LABEL: func @convert_i32_to_f32
|
||||
func @convert_i32_to_f32(%input: memref<2x2xi32>, %result: memref<2x2xf32>) {
|
||||
"lmhlo.convert"(%input, %result) : (memref<2x2xi32>, memref<2x2xf32>) -> ()
|
||||
|
|
Loading…
Reference in New Issue