[llvm-commits] CVS: llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp

Chris Lattner lattner at cs.uiuc.edu
Tue Jun 27 14:05:16 PDT 2006



Changes in directory llvm/lib/Transforms/IPO:

DeadArgumentElimination.cpp updated: 1.26 -> 1.27
---
Log message:

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.



---
Diffs of the changes:  (+11 -5)

 DeadArgumentElimination.cpp |   16 +++++++++++-----
 1 files changed, 11 insertions(+), 5 deletions(-)


Index: llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
diff -u llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp:1.26 llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp:1.27
--- llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp:1.26	Sun Jan 22 17:32:06 2006
+++ llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp	Tue Jun 27 16:05:04 2006
@@ -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 @@
 // (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) {






More information about the llvm-commits mailing list