Skip to content

Commit c024fa4

Browse files
committed
[flang] Use llvm.zext when converting from i1 -> iXX
CodeGen used llvm.sext when converting fir.convert %0 : (i1) -> iXX where iXX is any integer. This leads to wrong values when the initial i1 is equal to 1. Reviewed By: PeteSteinfeld Differential Revision: https://reviews.llvm.org/D145984
1 parent ea471e2 commit c024fa4

File tree

2 files changed

+14
-0
lines changed

2 files changed

+14
-0
lines changed

flang/lib/Optimizer/CodeGen/CodeGen.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -937,6 +937,10 @@ struct ConvertOpConversion : public FIROpConversion<fir::ConvertOp> {
937937
rewriter.replaceOpWithNewOp<mlir::LLVM::TruncOp>(convert, toTy, op0);
938938
return mlir::success();
939939
}
940+
if (fromFirTy == i1Type) {
941+
rewriter.replaceOpWithNewOp<mlir::LLVM::ZExtOp>(convert, toTy, op0);
942+
return mlir::success();
943+
}
940944
rewriter.replaceOpWithNewOp<mlir::LLVM::SExtOp>(convert, toTy, op0);
941945
return mlir::success();
942946
}

flang/test/Fir/convert-to-llvm.fir

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -739,6 +739,16 @@ func.func @convert_from_int(%arg0 : i32) {
739739
// CHECK: %{{.*}} = llvm.sext %[[ARG0]] : i32 to i64
740740
// CHECK: %{{.*}} = llvm.inttoptr %{{.*}} : i64 to !llvm.ptr<i64>
741741

742+
743+
func.func @convert_from_i1(%arg0 : i1) {
744+
%0 = fir.convert %arg0 : (i1) -> i32
745+
return
746+
}
747+
748+
// CHECK-LABEL: convert_from_i1(
749+
// CHECK-SAME: %[[ARG0:.*]]: i1
750+
// CHECK: %{{.*}} = llvm.zext %[[ARG0]] : i1 to i32
751+
742752
// -----
743753

744754
// Test `fir.convert` operation conversion from !fir.ref<> type.

0 commit comments

Comments
 (0)