mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
GlobalDCE: Teach isEmptyFunction() to ignore debug intrinsics.
This fixes PR39669. https://bugs.llvm.org/show_bug.cgi?id=39669 llvm-svn: 347065
This commit is contained in:
parent
6b91a7a285
commit
707bb8fc2f
@ -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.
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user