diff --git a/flang/lib/Optimizer/CodeGen/TypeConverter.h b/flang/lib/Optimizer/CodeGen/TypeConverter.h --- a/flang/lib/Optimizer/CodeGen/TypeConverter.h +++ b/flang/lib/Optimizer/CodeGen/TypeConverter.h @@ -128,6 +128,29 @@ return mlir::LLVM::LLVMStructType::getLiteral( none.getContext(), llvm::None, /*isPacked=*/false); }); + // FIXME: https://reviews.llvm.org/D82831 introduced an automatic + // materliazation of conversion around function calls that is not working + // well with fir lowering to llvm (incorrect llvm.mlir.cast are inserted). + // Workaround until better analysis: register a handler that does not insert + // any conversions. + addSourceMaterialization( + [&](mlir::OpBuilder &builder, mlir::Type resultType, + mlir::ValueRange inputs, + mlir::Location loc) -> llvm::Optional { + if (inputs.size() != 1) + return llvm::None; + return inputs[0]; + }); + // Similar FIXME workaround here (needed for compare.fir/select-type.fir + // tests). + addTargetMaterialization( + [&](mlir::OpBuilder &builder, mlir::Type resultType, + mlir::ValueRange inputs, + mlir::Location loc) -> llvm::Optional { + if (inputs.size() != 1) + return llvm::None; + return inputs[0]; + }); } // i32 is used here because LLVM wants i32 constants when indexing into struct diff --git a/flang/test/Fir/convert-to-llvm.fir b/flang/test/Fir/convert-to-llvm.fir --- a/flang/test/Fir/convert-to-llvm.fir +++ b/flang/test/Fir/convert-to-llvm.fir @@ -113,6 +113,28 @@ // ----- +// Test global with box + +fir.global internal @_QFEx : !fir.box> { + %0 = fir.zero_bits !fir.ptr + %1 = fir.embox %0 : (!fir.ptr) -> !fir.box> + fir.has_value %1 : !fir.box> +} + +// CHECK-LABEL: llvm.mlir.global internal @_QFEx() +// CHECK-SAME: !llvm.struct<([[DES_FIELDS:.*]])> +// CHECK: %[[T0:.*]] = llvm.mlir.undef : !llvm.struct<([[DES_FIELDS]])> +// CHECK: %[[T1:.*]] = llvm.insertvalue %{{.*}}, %[[T0]][1 : i32] : !llvm.struct<([[DES_FIELDS]])> +// CHECK: %[[T2:.*]] = llvm.insertvalue %{{.*}}, %[[T1]][2 : i32] : !llvm.struct<([[DES_FIELDS]])> +// CHECK: %[[T3:.*]] = llvm.insertvalue %{{.*}}, %[[T2]][3 : i32] : !llvm.struct<([[DES_FIELDS]])> +// CHECK: %[[T4:.*]] = llvm.insertvalue %{{.*}}, %[[T3]][4 : i32] : !llvm.struct<([[DES_FIELDS]])> +// CHECK: %[[T5:.*]] = llvm.insertvalue %{{.*}}, %[[T4]][5 : i32] : !llvm.struct<([[DES_FIELDS]])> +// CHECK: %[[T6:.*]] = llvm.insertvalue %{{.*}}, %[[T5]][6 : i32] : !llvm.struct<([[DES_FIELDS]])> +// CHECK: %[[GDES:.*]] = llvm.insertvalue %{{.*}}, %[[T6]][0 : i32] : !llvm.struct<([[DES_FIELDS]])> +// CHECK: llvm.return %[[GDES]] : !llvm.struct<([[DES_FIELDS]])> + +// ----- + // Test fir.zero_bits operation with LLVM ptr type func.func @zero_test_ptr() {