aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms/Utils/InlineFunction.cpp
diff options
context:
space:
mode:
authorGordon Henriksen <gordonhenriksen@mac.com>2007-12-25 03:10:07 +0000
committerGordon Henriksen <gordonhenriksen@mac.com>2007-12-25 03:10:07 +0000
commit0e13821c96937830ec817f08095c3cef1fdcac8d (patch)
treebea72ad62be6d14047374fbba74e95c7b225c077 /lib/Transforms/Utils/InlineFunction.cpp
parente1433f24cf714c49b266e8cefdbbb8a464ffcb8e (diff)
GC poses hazards to the inliner. Consider:
define void @f() { ... call i32 @g() ... } define void @g() { ... } The hazards are: - @f and @g have GC, but they differ GC. Inlining is invalid. This may never occur. - @f has no GC, but @g does. g's GC must be propagated to @f. The other scenarios are safe: - @f and @g have the same GC. - @f and @g have no GC. - @g has no GC. This patch adds inliner checks for the former two scenarios. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45351 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils/InlineFunction.cpp')
-rw-r--r--lib/Transforms/Utils/InlineFunction.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/lib/Transforms/Utils/InlineFunction.cpp b/lib/Transforms/Utils/InlineFunction.cpp
index dba0e69a35..0a9aa7a8d7 100644
--- a/lib/Transforms/Utils/InlineFunction.cpp
+++ b/lib/Transforms/Utils/InlineFunction.cpp
@@ -201,6 +201,19 @@ bool llvm::InlineFunction(CallSite CS, CallGraph *CG, const TargetData *TD) {
BasicBlock *OrigBB = TheCall->getParent();
Function *Caller = OrigBB->getParent();
+
+ // GC poses two hazards to inlining, which only occur when the callee has GC:
+ // 1. If the caller has no GC, then the callee's GC must be propagated to the
+ // caller.
+ // 2. If the caller has a differing GC, it is invalid to inline.
+ if (CalledFunc->hasCollector()) {
+ if (!Caller->hasCollector())
+ Caller->setCollector(CalledFunc->getCollector());
+ else if (CalledFunc->getCollector() != Caller->getCollector())
+ return false;
+ }
+
+
// Get an iterator to the last basic block in the function, which will have
// the new function inlined after it.
//