forked from OSchip/llvm-project
[CodeGen] Simplify logic that looks for returned call operands. NFC-ish.
Use getReturnedArgOperand() instead of rolling our own. Note that it's equivalent because there can only be one 'returned' operand. The existing code was also incorrect: there already was awkward logic to ignore callee/EH blocks, but operands can now also be operand bundles, in which case we'll look for non-existent parameter attributes. Unfortunately, this isn't observable in-tree, as it only crashes when exercising the regular call lowering logic with operand bundles. Still, this is a nice small cleanup anyway. llvm-svn: 290905
This commit is contained in:
parent
ccf2f7352f
commit
6aff744e7c
|
@ -272,28 +272,16 @@ static const Value *getNoopInput(const Value *V,
|
|||
TLI.allowTruncateForTailCall(Op->getType(), I->getType())) {
|
||||
DataBits = std::min(DataBits, I->getType()->getPrimitiveSizeInBits());
|
||||
NoopInput = Op;
|
||||
} else if (isa<CallInst>(I)) {
|
||||
// Look through call (skipping callee)
|
||||
for (User::const_op_iterator i = I->op_begin(), e = I->op_end() - 1;
|
||||
i != e; ++i) {
|
||||
unsigned attrInd = i - I->op_begin() + 1;
|
||||
if (cast<CallInst>(I)->paramHasAttr(attrInd, Attribute::Returned) &&
|
||||
isNoopBitcast((*i)->getType(), I->getType(), TLI)) {
|
||||
NoopInput = *i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (isa<InvokeInst>(I)) {
|
||||
// Look through invoke (skipping BB, BB, Callee)
|
||||
for (User::const_op_iterator i = I->op_begin(), e = I->op_end() - 3;
|
||||
i != e; ++i) {
|
||||
unsigned attrInd = i - I->op_begin() + 1;
|
||||
if (cast<InvokeInst>(I)->paramHasAttr(attrInd, Attribute::Returned) &&
|
||||
isNoopBitcast((*i)->getType(), I->getType(), TLI)) {
|
||||
NoopInput = *i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (auto *CI = dyn_cast<CallInst>(I)) {
|
||||
// Look through call operands.
|
||||
Value *ReturnedOp = CI->getReturnedArgOperand();
|
||||
if (ReturnedOp && isNoopBitcast(ReturnedOp->getType(), I->getType(), TLI))
|
||||
NoopInput = ReturnedOp;
|
||||
} else if (auto *II = dyn_cast<InvokeInst>(I)) {
|
||||
// Look through invoke operands.
|
||||
Value *ReturnedOp = II->getReturnedArgOperand();
|
||||
if (ReturnedOp && isNoopBitcast(ReturnedOp->getType(), I->getType(), TLI))
|
||||
NoopInput = ReturnedOp;
|
||||
} else if (const InsertValueInst *IVI = dyn_cast<InsertValueInst>(V)) {
|
||||
// Value may come from either the aggregate or the scalar
|
||||
ArrayRef<unsigned> InsertLoc = IVI->getIndices();
|
||||
|
|
Loading…
Reference in New Issue