From 544b92bb3ccae1f21fe55a5884a2f15d5a42eb85 Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Tue, 4 Mar 2008 19:12:58 +0000 Subject: [PATCH] Skip sret attribute while preparing attribute list for new function and new call sites. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47896 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/IPO/StructRetPromotion.cpp | 32 +++++++++++++++-------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/lib/Transforms/IPO/StructRetPromotion.cpp b/lib/Transforms/IPO/StructRetPromotion.cpp index 41438d7fe61..2d1ddfb98d8 100644 --- a/lib/Transforms/IPO/StructRetPromotion.cpp +++ b/lib/Transforms/IPO/StructRetPromotion.cpp @@ -205,9 +205,14 @@ Function *SRETPromotion::cloneFunctionBody(Function *F, unsigned ParamIndex = 1; // 0th parameter attribute is reserved for return type. while (I != E) { Params.push_back(I->getType()); - if (ParameterAttributes attrs = PAL ? PAL->getParamAttrs(ParamIndex) : - ParamAttr::None) - ParamAttrsVec.push_back(ParamAttrsWithIndex::get(Params.size(), attrs)); + ParameterAttributes Attrs; + if (PAL) { + Attrs = PAL->getParamAttrs(ParamIndex); + if (ParamIndex == 1) // Skip sret attribute + Attrs = Attrs ^ ParamAttr::StructRet; + } + if (Attrs != ParamAttr::None) + ParamAttrsVec.push_back(ParamAttrsWithIndex::get(ParamIndex, Attrs)); ++I; ++ParamIndex; } @@ -240,7 +245,7 @@ void SRETPromotion::updateCallSites(Function *F, Function *NF) { SmallVector Args; // ParamAttrs - Keep track of the parameter attributes for the arguments. - ParamAttrsVector ParamAttrsVec; + ParamAttrsVector ArgAttrsVec; for (Value::use_iterator FUI = F->use_begin(), FUE = F->use_end(); FUI != FUE;) { CallSite CS = CallSite::get(*FUI); @@ -250,7 +255,7 @@ void SRETPromotion::updateCallSites(Function *F, Function *NF) { const ParamAttrsList *PAL = F->getParamAttrs(); // Add any return attributes. if (ParameterAttributes attrs = PAL ? PAL->getParamAttrs(0) : ParamAttr::None) - ParamAttrsVec.push_back(ParamAttrsWithIndex::get(0, attrs)); + ArgAttrsVec.push_back(ParamAttrsWithIndex::get(0, attrs)); // Copy arguments, however skip first one. CallSite::arg_iterator AI = CS.arg_begin(), AE = CS.arg_end(); @@ -259,9 +264,14 @@ void SRETPromotion::updateCallSites(Function *F, Function *NF) { unsigned ParamIndex = 1; // 0th parameter attribute is reserved for return type. while (AI != AE) { Args.push_back(*AI); - if (ParameterAttributes Attrs = PAL ? PAL->getParamAttrs(ParamIndex) : - ParamAttr::None) - ParamAttrsVec.push_back(ParamAttrsWithIndex::get(Args.size(), Attrs)); + ParameterAttributes Attrs; + if (PAL) { + Attrs = PAL->getParamAttrs(ParamIndex); + if (ParamIndex == 1) // Skip sret attribute + Attrs = Attrs ^ ParamAttr::StructRet; + } + if (Attrs != ParamAttr::None) + ArgAttrsVec.push_back(ParamAttrsWithIndex::get(Args.size(), Attrs)); ++ParamIndex; ++AI; } @@ -272,16 +282,16 @@ void SRETPromotion::updateCallSites(Function *F, Function *NF) { New = new InvokeInst(NF, II->getNormalDest(), II->getUnwindDest(), Args.begin(), Args.end(), "", Call); cast(New)->setCallingConv(CS.getCallingConv()); - cast(New)->setParamAttrs(ParamAttrsList::get(ParamAttrsVec)); + cast(New)->setParamAttrs(ParamAttrsList::get(ArgAttrsVec)); } else { New = new CallInst(NF, Args.begin(), Args.end(), "", Call); cast(New)->setCallingConv(CS.getCallingConv()); - cast(New)->setParamAttrs(ParamAttrsList::get(ParamAttrsVec)); + cast(New)->setParamAttrs(ParamAttrsList::get(ArgAttrsVec)); if (cast(Call)->isTailCall()) cast(New)->setTailCall(); } Args.clear(); - ParamAttrsVec.clear(); + ArgAttrsVec.clear(); New->takeName(Call); // Update all users of sret parameter to extract value using getresult. -- 2.34.1