diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp index 4c8c56e0f21c..d038efcb2eb4 100644 --- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp +++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp @@ -2931,6 +2931,9 @@ private: comdatOp = rewriter.create(module.getLoc(), comdatName); } + if (auto select = comdatOp.lookupSymbol( + global.getSymName())) + return; mlir::OpBuilder::InsertionGuard guard(rewriter); rewriter.setInsertionPointToEnd(&comdatOp.getBody().back()); auto selectorOp = rewriter.create( diff --git a/flang/test/Fir/comdat-present.fir b/flang/test/Fir/comdat-present.fir new file mode 100644 index 000000000000..96d14e5973f4 --- /dev/null +++ b/flang/test/Fir/comdat-present.fir @@ -0,0 +1,14 @@ +// RUN: fir-opt %s --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %s +// RUN: fir-opt %s --fir-to-llvm-ir="target=x86_64-pc-windows-msvc" | FileCheck %s + +fir.global linkonce_odr @global_linkonce_odr constant : i32 { + %0 = arith.constant 0 : i32 + fir.has_value %0 : i32 +} + +llvm.comdat @__llvm_comdat { + llvm.comdat_selector @global_linkonce_odr any +} + +// CHECK-LABEL: llvm.comdat @__llvm_comdat +// CHECK: llvm.comdat_selector @global_linkonce_odr any