summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2010-05-01 08:34:28 +0000
committerOwen Anderson <resistor@mac.com>2010-05-01 08:34:28 +0000
commit550986ea902ab5b433ad4dc6440befc1c2829bf8 (patch)
tree9bdc32fa7eee84317f2e9e6e9a4be601d074960f
parent532112b98a71e7acc032015addc026c7083fe0ac (diff)
downloadbcm5719-llvm-550986ea902ab5b433ad4dc6440befc1c2829bf8.tar.gz
bcm5719-llvm-550986ea902ab5b433ad4dc6440befc1c2829bf8.zip
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. llvm-svn: 102831
-rw-r--r--llvm/lib/Transforms/IPO/Inliner.cpp9
-rw-r--r--llvm/test/Transforms/Inline/delete-call.ll2
2 files changed, 9 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/IPO/Inliner.cpp b/llvm/lib/Transforms/IPO/Inliner.cpp
index b785bb0a939..875c4fd7038 100644
--- a/llvm/lib/Transforms/IPO/Inliner.cpp
+++ b/llvm/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/llvm/test/Transforms/Inline/delete-call.ll b/llvm/test/Transforms/Inline/delete-call.ll
index 3505608b828..7775aa383fc 100644
--- a/llvm/test/Transforms/Inline/delete-call.ll
+++ b/llvm/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"
OpenPOWER on IntegriCloud