forked from OSchip/llvm-project
Add some constraints to use of 'returned':
1) Disallow 'returned' on parameter that is also 'sret' (no sensible semantics, as far as I can tell). 2) Conservatively disallow tail calls through 'returned' parameters that also are 'zext' or 'sext' (for consistency with treatment of other zero-extending and sign-extending operations in tail call position detection...can be revised later to handle situations that can be determined to be safe). This is a new attribute that is not yet used, so there is no impact. llvm-svn: 180118
This commit is contained in:
parent
038ff816e1
commit
6c70dc7842
|
@ -269,6 +269,8 @@ static bool sameNoopInput(const Value *V1, const Value *V2,
|
|||
i != e; ++i) {
|
||||
unsigned attrInd = i - I->op_begin() + 1;
|
||||
if (cast<CallInst>(I)->paramHasAttr(attrInd, Attribute::Returned) &&
|
||||
!cast<CallInst>(I)->paramHasAttr(attrInd, Attribute::ZExt) &&
|
||||
!cast<CallInst>(I)->paramHasAttr(attrInd, Attribute::SExt) &&
|
||||
isNoopBitcast((*i)->getType(), I->getType(), TLI)) {
|
||||
NoopInput = *i;
|
||||
break;
|
||||
|
@ -282,6 +284,8 @@ static bool sameNoopInput(const Value *V1, const Value *V2,
|
|||
i != e; ++i) {
|
||||
unsigned attrInd = i - I->op_begin() + 1;
|
||||
if (cast<InvokeInst>(I)->paramHasAttr(attrInd, Attribute::Returned) &&
|
||||
!cast<InvokeInst>(I)->paramHasAttr(attrInd, Attribute::ZExt) &&
|
||||
!cast<InvokeInst>(I)->paramHasAttr(attrInd, Attribute::SExt) &&
|
||||
isNoopBitcast((*i)->getType(), I->getType(), TLI)) {
|
||||
NoopInput = *i;
|
||||
break;
|
||||
|
|
|
@ -740,6 +740,10 @@ void Verifier::VerifyParameterAttrs(AttributeSet Attrs, unsigned Idx, Type *Ty,
|
|||
Attrs.hasAttribute(Idx, Attribute::InReg))), "Attributes "
|
||||
"'byval, nest, and inreg' are incompatible!", V);
|
||||
|
||||
Assert1(!(Attrs.hasAttribute(Idx, Attribute::StructRet) &&
|
||||
Attrs.hasAttribute(Idx, Attribute::Returned)), "Attributes "
|
||||
"'sret and returned' are incompatible!", V);
|
||||
|
||||
Assert1(!(Attrs.hasAttribute(Idx, Attribute::ZExt) &&
|
||||
Attrs.hasAttribute(Idx, Attribute::SExt)), "Attributes "
|
||||
"'zeroext and signext' are incompatible!", V);
|
||||
|
|
Loading…
Reference in New Issue