Index: llvm/lib/IR/Verifier.cpp =================================================================== --- llvm/lib/IR/Verifier.cpp +++ llvm/lib/IR/Verifier.cpp @@ -4663,12 +4663,17 @@ "first argument should be a pointer"); Assert(Call.getOperand(Elem.Begin + 1)->getType()->isIntegerTy(), "second argument should be an integer"); + ConstantInt *Alignment = + dyn_cast(Call.getOperand(Elem.Begin + 1)); + if (Alignment) + Assert(Alignment->getValue().isPowerOf2(), + "alignment must be a power of 2", Call); if (ArgCount == 3) Assert(Call.getOperand(Elem.Begin + 2)->getType()->isIntegerTy(), "third argument should be an integer if present"); return; } - Assert(ArgCount <= 2, "to many arguments"); + Assert(ArgCount <= 2, "too many arguments"); if (Kind == Attribute::None) break; if (Attribute::isIntAttrKind(Kind)) { Index: llvm/test/Verifier/assume-bundles.ll =================================================================== --- llvm/test/Verifier/assume-bundles.ll +++ llvm/test/Verifier/assume-bundles.ll @@ -8,7 +8,7 @@ call void @llvm.assume(i1 true) ["adazdazd"()] ; CHECK: the second argument should be a constant integral value call void @llvm.assume(i1 true) ["dereferenceable"(i32* %P, i32 %P1)] -; CHECK: to many arguments +; CHECK: too many arguments call void @llvm.assume(i1 true) ["dereferenceable"(i32* %P, i32 8, i32 8)] ; CHECK: this attribute should have 2 arguments call void @llvm.assume(i1 true) ["dereferenceable"(i32* %P)] @@ -21,6 +21,8 @@ call void @llvm.assume(i1 true) ["align"(i32* %P, i32 %P1, i32 4, i32 4)] ; CHECK: second argument should be an integer call void @llvm.assume(i1 true) ["align"(i32* %P, i32* %P2)] +; CHECK: alignment must be a power of 2 + call void @llvm.assume(i1 true) ["align"(i32* %P, i32 7)] ; CHECK: third argument should be an integer if present call void @llvm.assume(i1 true) ["align"(i32* %P, i32 %P1, i32* %P2)] ret void