Fix attribute handling.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48262 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Devang Patel 2008-03-12 00:07:03 +00:00
parent 4191b96f41
commit 8f9b551147
2 changed files with 21 additions and 14 deletions

View File

@ -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;
}

View File

@ -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
}