Initialize.
[oota-llvm.git] / lib / Transforms / IPO / DeadArgumentElimination.cpp
index 94ae404107b2f8cede893457475d16b844d767a4..088269d816d52040ad3d76ac7615b06b5945320c 100644 (file)
@@ -26,7 +26,7 @@
 #include "llvm/IntrinsicInst.h"
 #include "llvm/Module.h"
 #include "llvm/Pass.h"
-#include "llvm/ParameterAttributes.h"
+#include "llvm/ParamAttrsList.h"
 #include "llvm/Support/CallSite.h"
 #include "llvm/Support/Debug.h"
 #include "llvm/ADT/Statistic.h"
@@ -175,16 +175,29 @@ bool DAE::DeleteDeadVarargs(Function &Fn) {
     // Pass all the same arguments.
     Args.assign(CS.arg_begin(), CS.arg_begin()+NumArgs);
 
+    // Drop any attributes that were on the vararg arguments.
+    const ParamAttrsList *PAL = CS.getParamAttrs();
+    if (PAL && PAL->getParamIndex(PAL->size() - 1) > NumArgs) {
+      ParamAttrsVector ParamAttrsVec;
+      for (unsigned i = 0; PAL->getParamIndex(i) <= NumArgs; ++i) {
+        ParamAttrsWithIndex PAWI;
+        PAWI = ParamAttrsWithIndex::get(PAL->getParamIndex(i),
+                                        PAL->getParamAttrsAtIndex(i));
+        ParamAttrsVec.push_back(PAWI);
+      }
+      PAL = ParamAttrsList::get(ParamAttrsVec);
+    }
+
     Instruction *New;
     if (InvokeInst *II = dyn_cast<InvokeInst>(Call)) {
       New = new InvokeInst(NF, II->getNormalDest(), II->getUnwindDest(),
                            Args.begin(), Args.end(), "", Call);
       cast<InvokeInst>(New)->setCallingConv(CS.getCallingConv());
-      cast<InvokeInst>(New)->setParamAttrs(CS.getParamAttrs());
+      cast<InvokeInst>(New)->setParamAttrs(PAL);
     } else {
       New = new CallInst(NF, Args.begin(), Args.end(), "", Call);
       cast<CallInst>(New)->setCallingConv(CS.getCallingConv());
-      cast<CallInst>(New)->setParamAttrs(CS.getParamAttrs());
+      cast<CallInst>(New)->setParamAttrs(PAL);
       if (cast<CallInst>(Call)->isTailCall())
         cast<CallInst>(New)->setTailCall();
     }
@@ -242,7 +255,7 @@ DAE::Liveness DAE::getArgumentLiveness(const Argument &A) {
   const Function *F = A.getParent();
   
   // If this is the return value of a struct function, it's not really dead.
-  if (F->isStructReturn() && &*(F->arg_begin()) == &A)
+  if (F->hasStructRetAttr() && &*(F->arg_begin()) == &A)
     return Live;
   
   if (A.use_empty())  // First check, directly dead?
@@ -499,13 +512,13 @@ void DAE::RemoveDeadArgumentsFromFunction(Function *F) {
   const ParamAttrsList *PAL = F->getParamAttrs();
 
   // The existing function return attributes.
-  uint16_t RAttrs = PAL ? PAL->getParamAttrs(0) : 0;
+  ParameterAttributes RAttrs = PAL ? PAL->getParamAttrs(0) : ParamAttr::None;
 
   // Make the function return void if the return value is dead.
   const Type *RetTy = FTy->getReturnType();
   if (DeadRetVal.count(F)) {
     RetTy = Type::VoidTy;
-    RAttrs &= ~ParamAttr::VoidTypeIncompatible;
+    RAttrs &= ~ParamAttr::typeIncompatible(RetTy);
     DeadRetVal.erase(F);
   }
 
@@ -519,7 +532,8 @@ void DAE::RemoveDeadArgumentsFromFunction(Function *F) {
        ++I, ++index)
     if (!DeadArguments.count(I)) {
       Params.push_back(I->getType());
-      uint16_t Attrs = PAL ? PAL->getParamAttrs(index) : 0;
+      ParameterAttributes Attrs = PAL ? PAL->getParamAttrs(index) : 
+                                        ParamAttr::None;
       if (Attrs)
         ParamAttrsVec.push_back(ParamAttrsWithIndex::get(Params.size(), Attrs));
     }
@@ -559,10 +573,9 @@ void DAE::RemoveDeadArgumentsFromFunction(Function *F) {
     PAL = CS.getParamAttrs();
 
     // The call return attributes.
-    uint16_t RAttrs = PAL ? PAL->getParamAttrs(0) : 0;
+    ParameterAttributes RAttrs = PAL ? PAL->getParamAttrs(0) : ParamAttr::None;
     // Adjust in case the function was changed to return void.
-    if (NF->getReturnType() == Type::VoidTy)
-      RAttrs &= ~ParamAttr::VoidTypeIncompatible;
+    RAttrs &= ~ParamAttr::typeIncompatible(NF->getReturnType());
     if (RAttrs)
       ParamAttrsVec.push_back(ParamAttrsWithIndex::get(0, RAttrs));
 
@@ -573,20 +586,26 @@ void DAE::RemoveDeadArgumentsFromFunction(Function *F) {
          I != E; ++I, ++AI, ++index)
       if (!DeadArguments.count(I)) {    // Remove operands for dead arguments
         Args.push_back(*AI);
-        uint16_t Attrs = PAL ? PAL->getParamAttrs(index) : 0;
+        ParameterAttributes Attrs = PAL ? PAL->getParamAttrs(index) : 
+                                          ParamAttr::None;
         if (Attrs)
           ParamAttrsVec.push_back(ParamAttrsWithIndex::get(Args.size(), Attrs));
       }
 
-    // Reconstruct the ParamAttrsList based on the vector we constructed.
-    PAL = ParamAttrsList::get(ParamAttrsVec);
-
     if (ExtraArgHack)
       Args.push_back(UndefValue::get(Type::Int32Ty));
 
-    // Push any varargs arguments on the list
-    for (; AI != CS.arg_end(); ++AI)
+    // Push any varargs arguments on the list. Don't forget their attributes.
+    for (; AI != CS.arg_end(); ++AI) {
       Args.push_back(*AI);
+      ParameterAttributes Attrs = PAL ? PAL->getParamAttrs(index++) : 
+                                        ParamAttr::None;
+      if (Attrs)
+        ParamAttrsVec.push_back(ParamAttrsWithIndex::get(Args.size(), Attrs));
+    }
+
+    // Reconstruct the ParamAttrsList based on the vector we constructed.
+    PAL = ParamAttrsList::get(ParamAttrsVec);
 
     Instruction *New;
     if (InvokeInst *II = dyn_cast<InvokeInst>(Call)) {