summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/IPO
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-06-27 21:05:04 +0000
committerChris Lattner <sabre@nondot.org>2006-06-27 21:05:04 +0000
commitc4998a013874154f2c1b6510fa1f6a3e9c98da05 (patch)
tree2e0b3a50a2d9827afb1f75096c91ede20fa21ae1 /llvm/lib/Transforms/IPO
parent66e9513625020f0769414715a485f2e47d69c3a3 (diff)
downloadbcm5719-llvm-c4998a013874154f2c1b6510fa1f6a3e9c98da05.tar.gz
bcm5719-llvm-c4998a013874154f2c1b6510fa1f6a3e9c98da05.zip
Fix Transforms/DeadArgElim/2006-06-27-struct-ret.ll. -deadargelim should not
remove the struct return argument of a csret function, even if it is obviously dead. llvm-svn: 28943
Diffstat (limited to 'llvm/lib/Transforms/IPO')
-rw-r--r--llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp16
1 files changed, 11 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp b/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
index 37fb46d8ab3..e1feed922e3 100644
--- a/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
+++ b/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
@@ -19,15 +19,15 @@
#define DEBUG_TYPE "deadargelim"
#include "llvm/Transforms/IPO.h"
-#include "llvm/Module.h"
-#include "llvm/Pass.h"
-#include "llvm/DerivedTypes.h"
+#include "llvm/CallingConv.h"
#include "llvm/Constant.h"
+#include "llvm/DerivedTypes.h"
#include "llvm/Instructions.h"
+#include "llvm/Module.h"
+#include "llvm/Pass.h"
#include "llvm/Support/CallSite.h"
#include "llvm/Support/Debug.h"
#include "llvm/ADT/Statistic.h"
-#include "llvm/ADT/iterator"
#include <iostream>
#include <set>
using namespace llvm;
@@ -128,7 +128,13 @@ static inline bool CallPassesValueThoughVararg(Instruction *Call,
// (used in a computation), MaybeLive (only passed as an argument to a call), or
// Dead (not used).
DAE::Liveness DAE::getArgumentLiveness(const Argument &A) {
- if (A.use_empty()) return Dead; // First check, directly dead?
+ // If this is the return value of a csret function, it's not really dead.
+ if (A.getParent()->getCallingConv() == CallingConv::CSRet &&
+ &*A.getParent()->arg_begin() == &A)
+ return Live;
+
+ if (A.use_empty()) // First check, directly dead?
+ return Dead;
// Scan through all of the uses, looking for non-argument passing uses.
for (Value::use_const_iterator I = A.use_begin(), E = A.use_end(); I!=E;++I) {
OpenPOWER on IntegriCloud