From: Owen Anderson Date: Sat, 1 May 2010 08:34:28 +0000 (+0000) Subject: Disable the call-deletion transformation introduced in r86975. Without X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=1b4a38646f6bbeb32a125a1f2316a7b2d27916d7 Disable the call-deletion transformation introduced in r86975. Without halting analysis, it is illegal to delete a call to a read-only function. The correct solution is almost certainly to add a "must halt" attribute and only allow deletions in its presence. XFAIL the relevant testcase for now. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@102831 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/IPO/Inliner.cpp b/lib/Transforms/IPO/Inliner.cpp index b785bb0a939..875c4fd7038 100644 --- a/lib/Transforms/IPO/Inliner.cpp +++ b/lib/Transforms/IPO/Inliner.cpp @@ -33,7 +33,8 @@ using namespace llvm; STATISTIC(NumInlined, "Number of functions inlined"); -STATISTIC(NumCallsDeleted, "Number of call sites deleted, not inlined"); +// FIXME: Uncomment once call deletion xform is made safe +// STATISTIC(NumCallsDeleted, "Number of call sites deleted, not inlined"); STATISTIC(NumDeleted, "Number of functions deleted because all callers found"); STATISTIC(NumMergedAllocas, "Number of allocas merged together"); @@ -382,6 +383,9 @@ bool Inliner::runOnSCC(CallGraphSCC &SCC) { Function *Caller = CS.getCaller(); Function *Callee = CS.getCalledFunction(); + // FIXME: This transformation is not legal unless we can prove + // that the callee always terminates. +#if 0 // If this call site is dead and it is to a readonly function, we should // just delete the call instead of trying to inline it, regardless of // size. This happens because IPSCCP propagates the result out of the @@ -396,6 +400,7 @@ bool Inliner::runOnSCC(CallGraphSCC &SCC) { // Update the cached cost info with the missing call growCachedCostInfo(Caller, NULL); } else { +#endif // We can only inline direct calls to non-declarations. if (Callee == 0 || Callee->isDeclaration()) continue; @@ -437,7 +442,9 @@ bool Inliner::runOnSCC(CallGraphSCC &SCC) { // Update the cached cost info with the inlined call. growCachedCostInfo(Caller, Callee); +#if 0 } +#endif // If we inlined or deleted the last possible call site to the function, // delete the function body now. diff --git a/test/Transforms/Inline/delete-call.ll b/test/Transforms/Inline/delete-call.ll index 3505608b828..7775aa383fc 100644 --- a/test/Transforms/Inline/delete-call.ll +++ b/test/Transforms/Inline/delete-call.ll @@ -1,6 +1,6 @@ ; RUN: opt %s -S -inline -functionattrs -stats |& grep {Number of call sites deleted, not inlined} ; RUN: opt %s -S -inline -stats |& grep {Number of functions inlined} - +; XFAIL: * target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32" target triple = "i386-apple-darwin9.8"