maximum value for alignstack function attribute?

I have this test case in my frontend, which is triggering an assert in llvm master branch:

fn fnWithAlignedStack() → i32 {
@setAlignStack(1024);
return 1234;
}

It sets alignstack=1024 in the function attributes (see http://llvm.org/docs/LangRef.html#function-attributes). It’s tripping an assert:

llvm/lib/IR/Attributes.cpp:134: static llvm::Attribute llvm::Attribute::getWithStackAlignment(llvm::LLVMContext&, uint64_t): Assertion `Align <= 0x100 && “Alignment too large.”’

Is 0x100 the correct maximum alignstack value? Can I submit a patch to document this in LangRef.html?

Regards,
Andrew Kelley

Yes...? But nobody should ever specify a value anywhere near that large.

The point of the attribute is to fixup the stack alignment in cases of ABI mismatches, so you normally don't want to specify a value higher than the actual ABI alignment of the stack. If you want to allocate aligned memory on the stack, you can just set the alignment of an alloca, and the code generator will provide memory with the appropriate alignment.

-Eli

There could be performance benefits to aligning to larger sizes. Some memory controllers really like it when you start at a page boundary for example.

I have this test case in my frontend, which is triggering an assert in
llvm master branch:

fn fnWithAlignedStack() -> i32 {
    @setAlignStack(1024);
    return 1234;
}

It sets alignstack=1024 in the function attributes (see
http://llvm.org/docs/LangRef.html#function-attributes). It's tripping an
assert:

llvm/lib/IR/Attributes.cpp:134: static llvm::Attribute
llvm::Attribute::getWithStackAlignment(llvm::LLVMContext&, uint64_t):
Assertion `Align <= 0x100 && "Alignment too large."'

Is 0x100 the correct maximum alignstack value? Can I submit a patch to
document this in LangRef.html?

Yes...? But nobody should ever specify a value anywhere near that large.

Fair, but as a frontend I want to make this a friendly compile error and
not a mysterious LLVM assertion failure :slight_smile:

The point of the attribute is to fixup the stack alignment in cases of ABI
mismatches, so you normally don't want to specify a value higher than the
actual ABI alignment of the stack. If you want to allocate aligned memory
on the stack, you can just set the alignment of an alloca, and the code
generator will provide memory with the appropriate alignment.

Good to know, thanks.