diff options
author | Adrian Prantl <aprantl@apple.com> | 2018-11-16 17:47:21 +0000 |
---|---|---|
committer | Adrian Prantl <aprantl@apple.com> | 2018-11-16 17:47:21 +0000 |
commit | 83d87520ed30e8bac4a7303c8ee4e3f580e3cf22 (patch) | |
tree | d67031fe37ea8a122107ecd4163abd59fce6bc4f | |
parent | beca398a90eda0440e6287ecebb11e376115f7fc (diff) | |
download | bcm5719-llvm-83d87520ed30e8bac4a7303c8ee4e3f580e3cf22.tar.gz bcm5719-llvm-83d87520ed30e8bac4a7303c8ee4e3f580e3cf22.zip |
GlobalDCE: Teach isEmptyFunction() to ignore debug intrinsics.
This fixes PR39669.
https://bugs.llvm.org/show_bug.cgi?id=39669
llvm-svn: 347065
-rw-r--r-- | llvm/lib/Transforms/IPO/GlobalDCE.cpp | 15 | ||||
-rw-r--r-- | llvm/test/Transforms/GlobalDCE/global_ctors.ll | 25 |
2 files changed, 34 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/IPO/GlobalDCE.cpp b/llvm/lib/Transforms/IPO/GlobalDCE.cpp index c77ea04102c..34de8743336 100644 --- a/llvm/lib/Transforms/IPO/GlobalDCE.cpp +++ b/llvm/lib/Transforms/IPO/GlobalDCE.cpp @@ -19,6 +19,7 @@ #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/Statistic.h" #include "llvm/IR/Instructions.h" +#include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/Module.h" #include "llvm/Pass.h" #include "llvm/Transforms/IPO.h" @@ -75,13 +76,17 @@ ModulePass *llvm::createGlobalDCEPass() { return new GlobalDCELegacyPass(); } -/// Returns true if F contains only a single "ret" instruction. +/// Returns true if F is effectively empty. static bool isEmptyFunction(Function *F) { BasicBlock &Entry = F->getEntryBlock(); - if (Entry.size() != 1 || !isa<ReturnInst>(Entry.front())) - return false; - ReturnInst &RI = cast<ReturnInst>(Entry.front()); - return RI.getReturnValue() == nullptr; + for (auto &I : Entry) { + if (isa<DbgInfoIntrinsic>(I)) + continue; + if (auto *RI = dyn_cast<ReturnInst>(&I)) + return !RI->getReturnValue(); + break; + } + return false; } /// Compute the set of GlobalValue that depends from V. diff --git a/llvm/test/Transforms/GlobalDCE/global_ctors.ll b/llvm/test/Transforms/GlobalDCE/global_ctors.ll index 91bb9ab7f6b..bd1a97e6ec2 100644 --- a/llvm/test/Transforms/GlobalDCE/global_ctors.ll +++ b/llvm/test/Transforms/GlobalDCE/global_ctors.ll @@ -1,14 +1,37 @@ ; RUN: opt -S -globaldce < %s | FileCheck %s +; Test that the presence of debug intrinsics isn't affecting GlobalDCE. ; CHECK: @llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_notremovable }] ; CHECK-NOT: @_GLOBAL__I_a declare void @_notremovable() -@llvm.global_ctors = appending global [2 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }, { i32, void ()* } { i32 65535, void ()* @_notremovable }] +@llvm.global_ctors = appending global [3 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_b }, { i32, void ()* } { i32 65535, void ()* @_notremovable }] + +@x = internal unnamed_addr constant i8 undef, align 1 ; Function Attrs: nounwind readnone define internal void @_GLOBAL__I_a() #1 section "__TEXT,__StaticInit,regular,pure_instructions" { entry: ret void } + +; Function Attrs: nounwind readnone +define internal void @_GLOBAL__I_b() #1 section "__TEXT,__StaticInit,regular,pure_instructions" { +entry: + tail call void @llvm.dbg.value(metadata i8* @x, metadata !4, metadata !DIExpression(DW_OP_deref, DW_OP_constu, 0, DW_OP_swap, DW_OP_xderef)), !dbg !5 + ret void +} + +; Function Attrs: nounwind readnone speculatable +declare void @llvm.dbg.value(metadata, metadata, metadata) + +!llvm.module.flags = !{!0} +!llvm.dbg.cu = !{!1} + +!0 = !{i32 2, !"Debug Info Version", i32 3} +!1 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !2, emissionKind: FullDebug) +!2 = !DIFile(filename: "filename", directory: "directory") +!3 = distinct !DISubprogram(name: "h1", unit: !1) +!4 = !DILocalVariable(name: "b", arg: 1, scope: !3) +!5 = !DILocation(scope: !3) |