diff options
author | Bryant Wong <llvm-commits@xorshift.org> | 2017-03-23 23:21:07 +0000 |
---|---|---|
committer | Bryant Wong <llvm-commits@xorshift.org> | 2017-03-23 23:21:07 +0000 |
commit | def79b21e4f45dec583beedf747c6a02c542164d (patch) | |
tree | 5b32d874091c2f59fa667b938c18c87b30264b98 | |
parent | d6848fc58f70838e8f27f58a5f637c95ad15b7a8 (diff) | |
download | bcm5719-llvm-def79b21e4f45dec583beedf747c6a02c542164d.tar.gz bcm5719-llvm-def79b21e4f45dec583beedf747c6a02c542164d.zip |
[MetaRenamer] Don't rename library functions.
Library functions can have specific semantics that affect the behavior of
certain passes. DSE, for instance, gives special treatment to malloc-ed pointers
but not to pointers returned from an equivalently typed (but differently named)
function.
MetaRenamer ought not to alter program semantics, so library functions must
remain untouched.
Reviewers: mehdi_amini, majnemer, chandlerc, davide
Reviewed By: davide
Subscribers: davide, llvm-commits
Differential Revision: https://reviews.llvm.org/D31304
llvm-svn: 298659
-rw-r--r-- | llvm/lib/Transforms/Utils/MetaRenamer.cpp | 17 | ||||
-rw-r--r-- | llvm/test/Transforms/MetaRenamer/metarenamer.ll | 15 |
2 files changed, 29 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Utils/MetaRenamer.cpp b/llvm/lib/Transforms/Utils/MetaRenamer.cpp index c999bd008fe..481c6aa29c3 100644 --- a/llvm/lib/Transforms/Utils/MetaRenamer.cpp +++ b/llvm/lib/Transforms/Utils/MetaRenamer.cpp @@ -16,6 +16,7 @@ #include "llvm/Transforms/IPO.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallString.h" +#include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/Function.h" #include "llvm/IR/Module.h" @@ -67,6 +68,7 @@ namespace { } void getAnalysisUsage(AnalysisUsage &AU) const override { + AU.addRequired<TargetLibraryInfoWrapperPass>(); AU.setPreservesAll(); } @@ -110,9 +112,15 @@ namespace { } // Rename all functions + const TargetLibraryInfo &TLI = + getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(); for (auto &F : M) { StringRef Name = F.getName(); - if (Name.startswith("llvm.") || (!Name.empty() && Name[0] == 1)) + LibFunc Tmp; + // Leave library functions alone because their presence or absence could + // affect the behavior of other passes. + if (Name.startswith("llvm.") || (!Name.empty() && Name[0] == 1) || + TLI.getLibFunc(F, Tmp)) continue; F.setName(renamer.newName()); @@ -139,8 +147,11 @@ namespace { } char MetaRenamer::ID = 0; -INITIALIZE_PASS(MetaRenamer, "metarenamer", - "Assign new names to everything", false, false) +INITIALIZE_PASS_BEGIN(MetaRenamer, "metarenamer", + "Assign new names to everything", false, false) +INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass) +INITIALIZE_PASS_END(MetaRenamer, "metarenamer", + "Assign new names to everything", false, false) //===----------------------------------------------------------------------===// // // MetaRenamer - Rename everything with metasyntactic names. diff --git a/llvm/test/Transforms/MetaRenamer/metarenamer.ll b/llvm/test/Transforms/MetaRenamer/metarenamer.ll index 213fbe3bbff..7b527ae54cb 100644 --- a/llvm/test/Transforms/MetaRenamer/metarenamer.ll +++ b/llvm/test/Transforms/MetaRenamer/metarenamer.ll @@ -96,3 +96,18 @@ define i32 @varargs_func_6_xxx(i32 %arg_1_xxx, i32 %arg_2_xxx, ...) nounwind uwt store i32 %arg_2_xxx, i32* %2, align 4 ret i32 6 } + +declare noalias i8* @malloc(i32) +declare void @free(i8* nocapture) + +define void @dont_rename_lib_funcs() { +; CHECK-LABEL: @foo( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP:%.*]] = call i8* @malloc(i32 23) +; CHECK-NEXT: call void @free(i8* [[TMP]]) +; CHECK-NEXT: ret void +; + %x = call i8* @malloc(i32 23) + call void @free(i8* %x) + ret void +} |