Skip to content

Commit

Permalink
[IR] Make paramHasAttr to use arg indices instead of attr indices
Browse files Browse the repository at this point in the history
This avoids the confusing 'CS.paramHasAttr(ArgNo + 1, Foo)' pattern.

Previously we were testing return value attributes with index 0, so I
introduced hasReturnAttr() for that use case.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@300367 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
rnk committed Apr 14, 2017
1 parent 2bb40bf commit 1f8f049
Show file tree
Hide file tree
Showing 21 changed files with 114 additions and 82 deletions.
12 changes: 6 additions & 6 deletions include/llvm/CodeGen/FastISel.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,12 +83,12 @@ class FastISel {
RetTy = ResultTy;
Callee = Target;

IsInReg = Call.paramHasAttr(0, Attribute::InReg);
IsInReg = Call.hasRetAttr(Attribute::InReg);
DoesNotReturn = Call.doesNotReturn();
IsVarArg = FuncTy->isVarArg();
IsReturnValueUsed = !Call.getInstruction()->use_empty();
RetSExt = Call.paramHasAttr(0, Attribute::SExt);
RetZExt = Call.paramHasAttr(0, Attribute::ZExt);
RetSExt = Call.hasRetAttr(Attribute::SExt);
RetZExt = Call.hasRetAttr(Attribute::ZExt);

CallConv = Call.getCallingConv();
Args = std::move(ArgsList);
Expand All @@ -107,12 +107,12 @@ class FastISel {
Callee = Call.getCalledValue();
Symbol = Target;

IsInReg = Call.paramHasAttr(0, Attribute::InReg);
IsInReg = Call.hasRetAttr(Attribute::InReg);
DoesNotReturn = Call.doesNotReturn();
IsVarArg = FuncTy->isVarArg();
IsReturnValueUsed = !Call.getInstruction()->use_empty();
RetSExt = Call.paramHasAttr(0, Attribute::SExt);
RetZExt = Call.paramHasAttr(0, Attribute::ZExt);
RetSExt = Call.hasRetAttr(Attribute::SExt);
RetZExt = Call.hasRetAttr(Attribute::ZExt);

CallConv = Call.getCallingConv();
Args = std::move(ArgsList);
Expand Down
21 changes: 13 additions & 8 deletions include/llvm/IR/CallSite.h
Original file line number Diff line number Diff line change
Expand Up @@ -357,9 +357,14 @@ class CallSiteBase {
CALLSITE_DELEGATE_GETTER(hasFnAttr(Kind));
}

/// Return true if this return value has the given attribute.
bool hasRetAttr(Attribute::AttrKind Kind) const {
CALLSITE_DELEGATE_GETTER(hasRetAttr(Kind));
}

/// Return true if the call or the callee has the given attribute.
bool paramHasAttr(unsigned i, Attribute::AttrKind Kind) const {
CALLSITE_DELEGATE_GETTER(paramHasAttr(i, Kind));
bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const {
CALLSITE_DELEGATE_GETTER(paramHasAttr(ArgNo, Kind));
}

Attribute getAttribute(unsigned i, Attribute::AttrKind Kind) const {
Expand Down Expand Up @@ -554,24 +559,24 @@ class CallSiteBase {

/// Determine whether this argument is passed by value.
bool isByValArgument(unsigned ArgNo) const {
return paramHasAttr(ArgNo + 1, Attribute::ByVal);
return paramHasAttr(ArgNo, Attribute::ByVal);
}

/// Determine whether this argument is passed in an alloca.
bool isInAllocaArgument(unsigned ArgNo) const {
return paramHasAttr(ArgNo + 1, Attribute::InAlloca);
return paramHasAttr(ArgNo, Attribute::InAlloca);
}

/// Determine whether this argument is passed by value or in an alloca.
bool isByValOrInAllocaArgument(unsigned ArgNo) const {
return paramHasAttr(ArgNo + 1, Attribute::ByVal) ||
paramHasAttr(ArgNo + 1, Attribute::InAlloca);
return paramHasAttr(ArgNo, Attribute::ByVal) ||
paramHasAttr(ArgNo, Attribute::InAlloca);
}

/// Determine if there are is an inalloca argument. Only the last argument can
/// have the inalloca attribute.
bool hasInAllocaArgument() const {
return paramHasAttr(arg_size(), Attribute::InAlloca);
return !arg_empty() && paramHasAttr(arg_size() - 1, Attribute::InAlloca);
}

bool doesNotAccessMemory(unsigned OpNo) const {
Expand All @@ -592,7 +597,7 @@ class CallSiteBase {
/// This may be because it has the nonnull attribute, or because at least
/// one byte is dereferenceable and the pointer is in addrspace(0).
bool isReturnNonNull() const {
if (paramHasAttr(0, Attribute::NonNull))
if (hasRetAttr(Attribute::NonNull))
return true;
else if (getDereferenceableBytes(0) > 0 &&
getType()->getPointerAddressSpace() == 0)
Expand Down
18 changes: 12 additions & 6 deletions include/llvm/IR/Instructions.h
Original file line number Diff line number Diff line change
Expand Up @@ -1681,8 +1681,11 @@ class CallInst : public Instruction,
return hasFnAttrImpl(Kind);
}

/// Determine whether the call or the callee has the given attributes.
bool paramHasAttr(unsigned i, Attribute::AttrKind Kind) const;
/// Determine whether the return value has the given attribute.
bool hasRetAttr(Attribute::AttrKind Kind) const;

/// Determine whether the argument or parameter has the given attribute.
bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const;

/// Get the attribute of a given kind at a position.
Attribute getAttribute(unsigned i, Attribute::AttrKind Kind) const {
Expand Down Expand Up @@ -1821,7 +1824,7 @@ class CallInst : public Instruction,
return false;

// Be friendly and also check the callee.
return paramHasAttr(1, Attribute::StructRet);
return paramHasAttr(0, Attribute::StructRet);
}

/// Determine if any call argument is an aggregate passed by value.
Expand Down Expand Up @@ -3767,8 +3770,11 @@ class InvokeInst : public TerminatorInst,
return hasFnAttrImpl(Kind);
}

/// Determine whether the call or the callee has the given attributes.
bool paramHasAttr(unsigned i, Attribute::AttrKind Kind) const;
/// Determine whether the return value has the given attribute.
bool hasRetAttr(Attribute::AttrKind Kind) const;

/// Determine whether the argument or parameter has the given attribute.
bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const;

/// Get the attribute of a given kind at a position.
Attribute getAttribute(unsigned i, Attribute::AttrKind Kind) const {
Expand Down Expand Up @@ -3902,7 +3908,7 @@ class InvokeInst : public TerminatorInst,
return false;

// Be friendly and also check the callee.
return paramHasAttr(1, Attribute::StructRet);
return paramHasAttr(0, Attribute::StructRet);
}

/// Determine if any call argument is an aggregate passed by value.
Expand Down
8 changes: 4 additions & 4 deletions include/llvm/Target/TargetLowering.h
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ class TargetLoweringBase {
IsNest(false), IsByVal(false), IsInAlloca(false), IsReturned(false),
IsSwiftSelf(false), IsSwiftError(false) {}

void setAttributes(ImmutableCallSite *CS, unsigned AttrIdx);
void setAttributes(ImmutableCallSite *CS, unsigned ArgIdx);
};
typedef std::vector<ArgListEntry> ArgListTy;

Expand Down Expand Up @@ -2680,15 +2680,15 @@ class TargetLowering : public TargetLoweringBase {
ImmutableCallSite &Call) {
RetTy = ResultType;

IsInReg = Call.paramHasAttr(0, Attribute::InReg);
IsInReg = Call.hasRetAttr(Attribute::InReg);
DoesNotReturn =
Call.doesNotReturn() ||
(!Call.isInvoke() &&
isa<UnreachableInst>(Call.getInstruction()->getNextNode()));
IsVarArg = FTy->isVarArg();
IsReturnValueUsed = !Call.getInstruction()->use_empty();
RetSExt = Call.paramHasAttr(0, Attribute::SExt);
RetZExt = Call.paramHasAttr(0, Attribute::ZExt);
RetSExt = Call.hasRetAttr(Attribute::SExt);
RetZExt = Call.hasRetAttr(Attribute::ZExt);

Callee = Target;

Expand Down
2 changes: 1 addition & 1 deletion lib/Analysis/AliasAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -697,7 +697,7 @@ AAResults llvm::createLegacyPMAAResults(Pass &P, Function &F,

bool llvm::isNoAliasCall(const Value *V) {
if (auto CS = ImmutableCallSite(V))
return CS.paramHasAttr(0, Attribute::NoAlias);
return CS.hasRetAttr(Attribute::NoAlias);
return false;
}

Expand Down
6 changes: 3 additions & 3 deletions lib/Analysis/BasicAliasAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -637,7 +637,7 @@ FunctionModRefBehavior BasicAAResult::getModRefBehavior(const Function *F) {
/// Returns true if this is a writeonly (i.e Mod only) parameter.
static bool isWriteOnlyParam(ImmutableCallSite CS, unsigned ArgIdx,
const TargetLibraryInfo &TLI) {
if (CS.paramHasAttr(ArgIdx + 1, Attribute::WriteOnly))
if (CS.paramHasAttr(ArgIdx, Attribute::WriteOnly))
return true;

// We can bound the aliasing properties of memset_pattern16 just as we can
Expand Down Expand Up @@ -666,10 +666,10 @@ ModRefInfo BasicAAResult::getArgModRefInfo(ImmutableCallSite CS,
if (isWriteOnlyParam(CS, ArgIdx, TLI))
return MRI_Mod;

if (CS.paramHasAttr(ArgIdx + 1, Attribute::ReadOnly))
if (CS.paramHasAttr(ArgIdx, Attribute::ReadOnly))
return MRI_Ref;

if (CS.paramHasAttr(ArgIdx + 1, Attribute::ReadNone))
if (CS.paramHasAttr(ArgIdx, Attribute::ReadNone))
return MRI_NoModRef;

return AAResultBase::getArgModRefInfo(CS, ArgIdx);
Expand Down
3 changes: 1 addition & 2 deletions lib/Analysis/InlineCost.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -583,8 +583,7 @@ bool CallAnalyzer::visitUnaryInstruction(UnaryInstruction &I) {
}

bool CallAnalyzer::paramHasAttr(Argument *A, Attribute::AttrKind Attr) {
unsigned ArgNo = A->getArgNo();
return CandidateCS.paramHasAttr(ArgNo + 1, Attr);
return CandidateCS.paramHasAttr(A->getArgNo(), Attr);
}

bool CallAnalyzer::isKnownNonNullInCallee(Value *V) {
Expand Down
2 changes: 1 addition & 1 deletion lib/Analysis/MemoryBuiltins.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ static Optional<AllocFnsTy> getAllocationSize(const Value *V,

static bool hasNoAliasAttr(const Value *V, bool LookThroughBitCast) {
ImmutableCallSite CS(LookThroughBitCast ? V->stripPointerCasts() : V);
return CS && CS.paramHasAttr(AttributeList::ReturnIndex, Attribute::NoAlias);
return CS && CS.hasRetAttr(Attribute::NoAlias);
}


Expand Down
10 changes: 4 additions & 6 deletions lib/CodeGen/SelectionDAG/FastISel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -694,18 +694,16 @@ bool FastISel::lowerCallOperands(const CallInst *CI, unsigned ArgIdx,
Args.reserve(NumArgs);

// Populate the argument list.
// Attributes for args start at offset 1, after the return attribute.
ImmutableCallSite CS(CI);
for (unsigned ArgI = ArgIdx, ArgE = ArgIdx + NumArgs, AttrI = ArgIdx + 1;
ArgI != ArgE; ++ArgI) {
for (unsigned ArgI = ArgIdx, ArgE = ArgIdx + NumArgs; ArgI != ArgE; ++ArgI) {
Value *V = CI->getOperand(ArgI);

assert(!V->getType()->isEmptyTy() && "Empty type passed to intrinsic.");

ArgListEntry Entry;
Entry.Val = V;
Entry.Ty = V->getType();
Entry.setAttributes(&CS, AttrI);
Entry.setAttributes(&CS, ArgIdx);
Args.push_back(Entry);
}

Expand Down Expand Up @@ -907,7 +905,7 @@ bool FastISel::lowerCallTo(const CallInst *CI, MCSymbol *Symbol,
ArgListEntry Entry;
Entry.Val = V;
Entry.Ty = V->getType();
Entry.setAttributes(&CS, ArgI + 1);
Entry.setAttributes(&CS, ArgI);
Args.push_back(Entry);
}
TLI.markLibCallAttributes(MF, CS.getCallingConv(), Args);
Expand Down Expand Up @@ -1044,7 +1042,7 @@ bool FastISel::lowerCall(const CallInst *CI) {
Entry.Ty = V->getType();

// Skip the first return-type Attribute to get to params.
Entry.setAttributes(&CS, i - CS.arg_begin() + 1);
Entry.setAttributes(&CS, i - CS.arg_begin());
Args.push_back(Entry);
}

Expand Down
7 changes: 3 additions & 4 deletions lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5876,8 +5876,7 @@ void SelectionDAGBuilder::LowerCallTo(ImmutableCallSite CS, SDValue Callee,
SDValue ArgNode = getValue(V);
Entry.Node = ArgNode; Entry.Ty = V->getType();

// Skip the first return-type Attribute to get to params.
Entry.setAttributes(&CS, i - CS.arg_begin() + 1);
Entry.setAttributes(&CS, i - CS.arg_begin());

// Use swifterror virtual register as input to the call.
if (Entry.IsSwiftError && TLI.supportSwiftError()) {
Expand Down Expand Up @@ -7340,7 +7339,7 @@ void SelectionDAGBuilder::populateCallLoweringInfo(

// Populate the argument list.
// Attributes for args start at offset 1, after the return attribute.
for (unsigned ArgI = ArgIdx, ArgE = ArgIdx + NumArgs, AttrI = ArgIdx + 1;
for (unsigned ArgI = ArgIdx, ArgE = ArgIdx + NumArgs;
ArgI != ArgE; ++ArgI) {
const Value *V = CS->getOperand(ArgI);

Expand All @@ -7349,7 +7348,7 @@ void SelectionDAGBuilder::populateCallLoweringInfo(
TargetLowering::ArgListEntry Entry;
Entry.Node = getValue(V);
Entry.Ty = V->getType();
Entry.setAttributes(&CS, AttrI);
Entry.setAttributes(&CS, ArgIdx);
Args.push_back(Entry);
}

Expand Down
25 changes: 13 additions & 12 deletions lib/CodeGen/SelectionDAG/TargetLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,18 +98,19 @@ bool TargetLowering::parametersInCSRMatch(const MachineRegisterInfo &MRI,
/// \brief Set CallLoweringInfo attribute flags based on a call instruction
/// and called function attributes.
void TargetLoweringBase::ArgListEntry::setAttributes(ImmutableCallSite *CS,
unsigned AttrIdx) {
IsSExt = CS->paramHasAttr(AttrIdx, Attribute::SExt);
IsZExt = CS->paramHasAttr(AttrIdx, Attribute::ZExt);
IsInReg = CS->paramHasAttr(AttrIdx, Attribute::InReg);
IsSRet = CS->paramHasAttr(AttrIdx, Attribute::StructRet);
IsNest = CS->paramHasAttr(AttrIdx, Attribute::Nest);
IsByVal = CS->paramHasAttr(AttrIdx, Attribute::ByVal);
IsInAlloca = CS->paramHasAttr(AttrIdx, Attribute::InAlloca);
IsReturned = CS->paramHasAttr(AttrIdx, Attribute::Returned);
IsSwiftSelf = CS->paramHasAttr(AttrIdx, Attribute::SwiftSelf);
IsSwiftError = CS->paramHasAttr(AttrIdx, Attribute::SwiftError);
Alignment = CS->getParamAlignment(AttrIdx);
unsigned ArgIdx) {
IsSExt = CS->paramHasAttr(ArgIdx, Attribute::SExt);
IsZExt = CS->paramHasAttr(ArgIdx, Attribute::ZExt);
IsInReg = CS->paramHasAttr(ArgIdx, Attribute::InReg);
IsSRet = CS->paramHasAttr(ArgIdx, Attribute::StructRet);
IsNest = CS->paramHasAttr(ArgIdx, Attribute::Nest);
IsByVal = CS->paramHasAttr(ArgIdx, Attribute::ByVal);
IsInAlloca = CS->paramHasAttr(ArgIdx, Attribute::InAlloca);
IsReturned = CS->paramHasAttr(ArgIdx, Attribute::Returned);
IsSwiftSelf = CS->paramHasAttr(ArgIdx, Attribute::SwiftSelf);
IsSwiftError = CS->paramHasAttr(ArgIdx, Attribute::SwiftError);
// FIXME: getParamAlignment is off by one from argument index.
Alignment = CS->getParamAlignment(ArgIdx + 1);
}

/// Generate a libcall taking the given operands as arguments and returning a
Expand Down
40 changes: 32 additions & 8 deletions lib/IR/Instructions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -380,13 +380,23 @@ void CallInst::addDereferenceableOrNullAttr(unsigned i, uint64_t Bytes) {
setAttributes(PAL);
}

bool CallInst::hasRetAttr(Attribute::AttrKind Kind) const {
if (Attrs.hasAttribute(AttributeList::ReturnIndex, Kind))
return true;

// Look at the callee, if available.
if (const Function *F = getCalledFunction())
return F->getAttributes().hasAttribute(AttributeList::ReturnIndex, Kind);
return false;
}

bool CallInst::paramHasAttr(unsigned i, Attribute::AttrKind Kind) const {
assert(i < (getNumArgOperands() + 1) && "Param index out of bounds!");
assert(i < getNumArgOperands() && "Param index out of bounds!");

if (Attrs.hasAttribute(i, Kind))
if (Attrs.hasParamAttribute(i, Kind))
return true;
if (const Function *F = getCalledFunction())
return F->getAttributes().hasAttribute(i, Kind);
return F->getAttributes().hasParamAttribute(i, Kind);
return false;
}

Expand All @@ -400,8 +410,10 @@ bool CallInst::dataOperandHasImpliedAttr(unsigned i,
// question is a call argument; or be indirectly implied by the kind of its
// containing operand bundle, if the operand is a bundle operand.

// FIXME: Avoid these i - 1 calculations and update the API to use zero-based
// indices.
if (i < (getNumArgOperands() + 1))
return paramHasAttr(i, Kind);
return paramHasAttr(i - 1, Kind);

assert(hasOperandBundles() && i >= (getBundleOperandsStartIndex() + 1) &&
"Must be either a call argument or an operand bundle!");
Expand Down Expand Up @@ -691,13 +703,23 @@ Value *InvokeInst::getReturnedArgOperand() const {
return nullptr;
}

bool InvokeInst::hasRetAttr(Attribute::AttrKind Kind) const {
if (Attrs.hasAttribute(AttributeList::ReturnIndex, Kind))
return true;

// Look at the callee, if available.
if (const Function *F = getCalledFunction())
return F->getAttributes().hasAttribute(AttributeList::ReturnIndex, Kind);
return false;
}

bool InvokeInst::paramHasAttr(unsigned i, Attribute::AttrKind Kind) const {
assert(i < (getNumArgOperands() + 1) && "Param index out of bounds!");
assert(i < getNumArgOperands() && "Param index out of bounds!");

if (Attrs.hasAttribute(i, Kind))
if (Attrs.hasParamAttribute(i, Kind))
return true;
if (const Function *F = getCalledFunction())
return F->getAttributes().hasAttribute(i, Kind);
return F->getAttributes().hasParamAttribute(i, Kind);
return false;
}

Expand All @@ -711,8 +733,10 @@ bool InvokeInst::dataOperandHasImpliedAttr(unsigned i,
// question is an invoke argument; or be indirectly implied by the kind of its
// containing operand bundle, if the operand is a bundle operand.

// FIXME: Avoid these i - 1 calculations and update the API to use zero-based
// indices.
if (i < (getNumArgOperands() + 1))
return paramHasAttr(i, Kind);
return paramHasAttr(i - 1, Kind);

assert(hasOperandBundles() && i >= (getBundleOperandsStartIndex() + 1) &&
"Must be either an invoke argument or an operand bundle!");
Expand Down
Loading

0 comments on commit 1f8f049

Please sign in to comment.