Verify parameter alignment attribute

In DAGISel, the parameter alignment only have 4 bits to hold the value.
The encode(alignment) would plus the value by 1, so the max aligment that
ISel can support is 2^14. This patch verify align attribute for parameter.

Differential Revision: https://reviews.llvm.org/D122130
This commit is contained in:
Luo, Yuanke 2022-03-17 17:48:02 +08:00
parent 4a48742922
commit 1fd118ffc4
2 changed files with 18 additions and 1 deletions

View File

@ -1819,6 +1819,12 @@ void Verifier::verifyParameterAttrs(AttributeSet Attrs, Type *Ty,
if (PointerType *PTy = dyn_cast<PointerType>(Ty)) {
if (Attrs.hasAttribute(Attribute::ByVal)) {
if (Attrs.hasAttribute(Attribute::Alignment)) {
Align AttrAlign = Attrs.getAlignment().valueOrOne();
Align MaxAlign(ParamMaxAlignment);
Assert(AttrAlign <= MaxAlign,
"Attribute 'align' exceed the max size 2^14", V);
}
SmallPtrSet<Type *, 4> Visited;
Assert(Attrs.getByValType()->isSized(&Visited),
"Attribute 'byval' does not support unsized types!", V);
@ -3154,7 +3160,7 @@ void Verifier::visitCallBase(CallBase &Call) {
return;
Align ABIAlign = DL.getABITypeAlign(Ty);
Align MaxAlign(ParamMaxAlignment);
Assert(ABIAlign < MaxAlign,
Assert(ABIAlign <= MaxAlign,
"Incorrect alignment of " + Message + " to called function!", Call);
};

View File

@ -0,0 +1,11 @@
; RUN: not llvm-as < %s 2>&1 | FileCheck %s
; CHECK: Attribute 'align' exceed the max size 2^14
define dso_local void @foo(i8* %p) {
entry:
%p1 = bitcast i8* %p to <8 x float>*
call void @bar(<8 x float>* noundef byval(<8 x float>) align 32768 %p1)
ret void
}
declare dso_local void @bar(<8 x float>* %p)