musttail: Fix the verification of alignment attributes
authorReid Kleckner <reid@kleckner.net>
Thu, 15 May 2014 23:58:57 +0000 (23:58 +0000)
committerReid Kleckner <reid@kleckner.net>
Thu, 15 May 2014 23:58:57 +0000 (23:58 +0000)
Previously this would fail with an assertion failure when trying to add
an alignment attribute without a value.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208935 91177308-0d34-0410-b5e6-96231b3b80d8

lib/IR/Verifier.cpp
test/Verifier/musttail-invalid.ll

index ec287f58fa33df455c7552128b37a869e55dc97e..ff9ca44f87079307b96f4b57401910681fd9978a 100644 (file)
@@ -1567,6 +1567,20 @@ static bool isTypeCongruent(Type *L, Type *R) {
   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(CallInst &CI) {
 
   // - 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));
index 7e427b50465aabaca45c96c20734e4e615eb8a4a..e5f9a404b9e3ad93b47128a3ced5fc412abb77ed 100644 (file)
@@ -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