From 8f9b551147c928c216de5e693ecc433015ab531a Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Wed, 12 Mar 2008 00:07:03 +0000 Subject: [PATCH] Fix attribute handling. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48262 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/IPO/StructRetPromotion.cpp | 28 +++++++++---------- .../SRETPromotion/2008-03-11-attributes.ll | 7 +++++ 2 files changed, 21 insertions(+), 14 deletions(-) create mode 100644 test/Transforms/SRETPromotion/2008-03-11-attributes.ll diff --git a/lib/Transforms/IPO/StructRetPromotion.cpp b/lib/Transforms/IPO/StructRetPromotion.cpp index 686ffdad6be..c6b561dfd31 100644 --- a/lib/Transforms/IPO/StructRetPromotion.cpp +++ b/lib/Transforms/IPO/StructRetPromotion.cpp @@ -210,17 +210,17 @@ Function *SRETPromotion::cloneFunctionBody(Function *F, // Skip first argument. Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); ++I; - unsigned ParamIndex = 1; // 0th parameter attribute is reserved for return type. + // 0th parameter attribute is reserved for return type. + // 1th parameter attribute is for first 1st sret argument. + unsigned ParamIndex = 2; while (I != E) { Params.push_back(I->getType()); - ParameterAttributes Attrs = ParamAttr::None; if (PAL) { - Attrs = PAL->getParamAttrs(ParamIndex); - if (ParamIndex == 1) // Skip sret attribute - Attrs = Attrs ^ ParamAttr::StructRet; + ParameterAttributes Attrs = PAL->getParamAttrs(ParamIndex); + if (Attrs != ParamAttr::None) + ParamAttrsVec.push_back(ParamAttrsWithIndex::get(ParamIndex - 1, + Attrs)); } - if (Attrs != ParamAttr::None) - ParamAttrsVec.push_back(ParamAttrsWithIndex::get(ParamIndex, Attrs)); ++I; ++ParamIndex; } @@ -269,17 +269,17 @@ void SRETPromotion::updateCallSites(Function *F, Function *NF) { CallSite::arg_iterator AI = CS.arg_begin(), AE = CS.arg_end(); Value *FirstCArg = *AI; ++AI; - unsigned ParamIndex = 1; // 0th parameter attribute is reserved for return type. + // 0th parameter attribute is reserved for return type. + // 1th parameter attribute is for first 1st sret argument. + unsigned ParamIndex = 2; while (AI != AE) { Args.push_back(*AI); - ParameterAttributes Attrs = ParamAttr::None; if (PAL) { - Attrs = PAL->getParamAttrs(ParamIndex); - if (ParamIndex == 1) // Skip sret attribute - Attrs = Attrs ^ ParamAttr::StructRet; + ParameterAttributes Attrs = PAL->getParamAttrs(ParamIndex); + if (Attrs != ParamAttr::None) + ArgAttrsVec.push_back(ParamAttrsWithIndex::get(ParamIndex - 1, + Attrs)); } - if (Attrs != ParamAttr::None) - ArgAttrsVec.push_back(ParamAttrsWithIndex::get(Args.size(), Attrs)); ++ParamIndex; ++AI; } diff --git a/test/Transforms/SRETPromotion/2008-03-11-attributes.ll b/test/Transforms/SRETPromotion/2008-03-11-attributes.ll new file mode 100644 index 00000000000..81a1476fc96 --- /dev/null +++ b/test/Transforms/SRETPromotion/2008-03-11-attributes.ll @@ -0,0 +1,7 @@ +; RUN: llvm-as < %s | opt -sretpromotion -disable-output + %struct.ObjPoint = type { double, double, double, double, double, double } + +define void @RotatePoint(%struct.ObjPoint* sret %agg.result, %struct.ObjPoint* byval %a, double %rx, double %ry, double %rz) nounwind { +entry: + unreachable +}