[llvm] r208935 - musttail: Fix the verification of alignment attributes
Reid Kleckner
reid at kleckner.net
Thu May 15 16:58:58 PDT 2014
Author: rnk
Date: Thu May 15 18:58:57 2014
New Revision: 208935
URL: http://llvm.org/viewvc/llvm-project?rev=208935&view=rev
Log:
musttail: Fix the verification of alignment attributes
Previously this would fail with an assertion failure when trying to add
an alignment attribute without a value.
Modified:
llvm/trunk/lib/IR/Verifier.cpp
llvm/trunk/test/Verifier/musttail-invalid.ll
Modified: llvm/trunk/lib/IR/Verifier.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Verifier.cpp?rev=208935&r1=208934&r2=208935&view=diff
==============================================================================
--- llvm/trunk/lib/IR/Verifier.cpp (original)
+++ llvm/trunk/lib/IR/Verifier.cpp Thu May 15 18:58:57 2014
@@ -1567,6 +1567,20 @@ static bool isTypeCongruent(Type *L, Typ
return PL->getAddressSpace() == PR->getAddressSpace();
}
+static AttrBuilder getParameterABIAttributes(int I, AttributeSet Attrs) {
+ static const Attribute::AttrKind ABIAttrs[] = {
+ Attribute::StructRet, Attribute::ByVal, Attribute::InAlloca,
+ Attribute::InReg, Attribute::Returned};
+ AttrBuilder Copy;
+ for (auto AK : ABIAttrs) {
+ if (Attrs.hasAttribute(I + 1, AK))
+ Copy.addAttribute(AK);
+ }
+ if (Attrs.hasAttribute(I + 1, Attribute::Alignment))
+ Copy.addAlignmentAttr(Attrs.getParamAlignment(I + 1));
+ return Copy;
+}
+
void Verifier::verifyMustTailCall(CallInst &CI) {
Assert1(!CI.isInlineAsm(), "cannot use musttail call with inline asm", &CI);
@@ -1598,20 +1612,11 @@ void Verifier::verifyMustTailCall(CallIn
// - All ABI-impacting function attributes, such as sret, byval, inreg,
// returned, and inalloca, must match.
- static const Attribute::AttrKind ABIAttrs[] = {
- Attribute::Alignment, Attribute::StructRet, Attribute::ByVal,
- Attribute::InAlloca, Attribute::InReg, Attribute::Returned};
AttributeSet CallerAttrs = F->getAttributes();
AttributeSet CalleeAttrs = CI.getAttributes();
for (int I = 0, E = CallerTy->getNumParams(); I != E; ++I) {
- AttrBuilder CallerABIAttrs;
- AttrBuilder CalleeABIAttrs;
- for (auto AK : ABIAttrs) {
- if (CallerAttrs.hasAttribute(I + 1, AK))
- CallerABIAttrs.addAttribute(AK);
- if (CalleeAttrs.hasAttribute(I + 1, AK))
- CalleeABIAttrs.addAttribute(AK);
- }
+ AttrBuilder CallerABIAttrs = getParameterABIAttributes(I, CallerAttrs);
+ AttrBuilder CalleeABIAttrs = getParameterABIAttributes(I, CalleeAttrs);
Assert2(CallerABIAttrs == CalleeABIAttrs,
"cannot guarantee tail call due to mismatched ABI impacting "
"function attributes", &CI, CI.getOperand(I));
Modified: llvm/trunk/test/Verifier/musttail-invalid.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Verifier/musttail-invalid.ll?rev=208935&r1=208934&r2=208935&view=diff
==============================================================================
--- llvm/trunk/test/Verifier/musttail-invalid.ll (original)
+++ llvm/trunk/test/Verifier/musttail-invalid.ll Thu May 15 18:58:57 2014
@@ -60,6 +60,13 @@ define void @mismatched_sret(i32* %a) {
ret void
}
+declare void @mismatched_alignment_callee(i32* byval align 8)
+define void @mismatched_alignment(i32* byval align 4 %a) {
+; CHECK: mismatched ABI impacting function attributes
+ musttail call void @mismatched_alignment_callee(i32* byval align 8 %a)
+ ret void
+}
+
declare i32 @not_tail_pos_callee()
define i32 @not_tail_pos() {
; CHECK: musttail call must be precede a ret with an optional bitcast
More information about the llvm-commits
mailing list