diff --git a/llvm/test/tools/llvm-reduce/remove-comdat.ll b/llvm/test/tools/llvm-reduce/remove-comdat.ll new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-reduce/remove-comdat.ll @@ -0,0 +1,29 @@ +; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=global-objects --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t +; RUN: FileCheck --check-prefix=CHECK-FINAL %s --input-file=%t + +; CHECK-INTERESTINGNESS: define void @f +; CHECK-INTERESTINGNESS: define void @g +; CHECK-INTERESTINGNESS: define void @i{{.*}} comdat + +; CHECK-FINAL-NOT: $f +; CHECK-FINAL-NOT: $h +; CHECK-FINAL: $i = comdat +; CHECK-FINAL: define void @f() { +; CHECK-FINAL: define void @g() { +; CHECK-FINAL: define void @i() comdat { + +$f = comdat any +$h = comdat any +$i = comdat any + +define void @f() comdat { + ret void +} + +define void @g() comdat($h) { + ret void +} + +define void @i() comdat { + ret void +} diff --git a/llvm/tools/llvm-reduce/deltas/ReduceGlobalObjects.cpp b/llvm/tools/llvm-reduce/deltas/ReduceGlobalObjects.cpp --- a/llvm/tools/llvm-reduce/deltas/ReduceGlobalObjects.cpp +++ b/llvm/tools/llvm-reduce/deltas/ReduceGlobalObjects.cpp @@ -17,12 +17,16 @@ return GO.getAlign().has_value(); } +static bool shouldReduceComdat(GlobalObject &GO) { return GO.hasComdat(); } + static void reduceGOs(Oracle &O, Module &Program) { for (auto &GO : Program.global_objects()) { if (shouldReduceSection(GO) && !O.shouldKeep()) GO.setSection(""); if (shouldReduceAlign(GO) && !O.shouldKeep()) GO.setAlignment(MaybeAlign()); + if (shouldReduceComdat(GO) && !O.shouldKeep()) + GO.setComdat(nullptr); } }